跳到主要内容

声明程序变量

什么是程序变量

程序变量(也称为局部变量)是在特定程序(PROGRAM)或功能块(FUNCTION_BLOCK)内部声明的变量,其作用域仅限于声明它的POU(程序组织单元)内部。程序变量通常用于:

  • 存储程序执行过程中的临时数据
  • 作为算法的中间变量
  • 实现程序内部的逻辑控制

方法一:在ST文件中声明程序变量

在ST程序文件中使用关键字声明不同类型的程序变量。

变量类型分类

关键字说明作用域
VAR内部变量仅在当前POU内部可访问
VAR_INPUT输入变量可从外部传入,用于接收参数
VAR_OUTPUT输出变量可输出到外部,用于返回结果
VAR_IN_OUT输入输出变量双向传递,可读写
VAR_TEMP临时变量仅在当前POU内部使用

语法格式

(* POU主程序定义 *)
PROGRAM DEMO_PLC_PRG1
(* 1. 内部变量 - 仅本程序内部使用 *)
VAR
x1_value: INT := 12; (* 整型变量,初始值为12 *)
x2_value: BOOL; (* 布尔型变量,默认初始值为FALSE *)
temp_result: REAL; (* 实型变量,用于临时计算 *)
counter: UINT := 0; (* 无符号整型计数器 *)
END_VAR

(* 2. 输入变量 - 从外部接收数据 *)
VAR_INPUT
i_enable: BOOL; (* 使能信号 *)
i_setpoint: REAL; (* 设定值 *)
i_speed: INT; (* 速度参数 *)
END_VAR

(* 3. 输出变量 - 向外部输出数据 *)
VAR_OUTPUT
o_status: BOOL; (* 状态输出 *)
o_result: REAL; (* 计算结果 *)
o_errorCode: INT; (* 错误码 *)
END_VAR

(* 4. 输入输出变量 - 双向传递数据 *)
VAR_IN_OUT
io_buffer: ARRAY[0..10] OF INT; (* 数据缓冲区 *)
END_VAR

(* 程序逻辑代码 *)
// ...

END_PROGRAM

变量声明示例

PROGRAM MainProgram
VAR
(* 布尔型 *)
isRunning: BOOL := FALSE;
hasError: BOOL;

(* 整型 *)
counter: INT := 0;
temperature: INT;

(* 实型 *)
speed: REAL := 100.0;
pressure: REAL;

(* 时间型 *)
runTime: TIME := T#0s;
delayTime: TIME := T#500ms;
END_VAR

(* 使用变量 *)
counter := counter + 1;
isRunning := TRUE;
END_PROGRAM

方法二:在图形化界面中声明程序变量

通过WasomeCodeX_AI的图形化编辑器例如LD(梯形图)编辑器中声明程序变量。

操作步骤

  1. 打开图形化编辑器例如LD(梯形图)编辑器
  2. 在编辑器上方的变量视图中,点击添加变量按钮
  3. 在新建的变量声明框中填写变量信息:
    • 类型:选择变量类型(VAR、VAR_INPUT、VAR_OUTPUT、VAR_IN_OUT等)
    • 名称:变量标识符
    • 地址:变量在内存中的位置
    • 数据类型:数据类型(BOOL、INT、REAL等)
    • 初始值:可选的初始赋值
    • 常量:是否为常量,即在程序运行时不能被修改
    • 保持:是否在程序运行时保持变量值,即在程序结束时是否保留当前值
    • 注释:变量说明

界面说明

变量声明界面
提示

具体操作细节请参考梯形图编辑器章节介绍


程序变量的访问规则

访问权限

变量类型可读可写外部访问
VAR
VAR_INPUT可传入
VAR_OUTPUT可读取
VAR_IN_OUT可读写
VAR_TEMP

变量初始化

  • 变量可以在声明时赋予初始值,使用 := 操作符
  • 如果没有指定初始值,变量会被初始化为默认值:
    • 数值类型(INT、REAL等):0
    • 布尔类型(BOOL):FALSE
    • 时间类型(TIME):T#0s

命名规范

为了便于识别和维护,建议遵循以下命名规范:

变量类型前缀示例
内部变量b_(BOOL)、n_(INT)、r_(REAL)b_isReady, n_counter, r_speed
输入变量i_i_enable, i_setpoint
输出变量o_o_status, o_result
输入输出变量io_io_buffer, io_data

注意事项

注意
  1. 作用域限制:程序变量仅在声明它的POU内部有效,外部无法直接访问
  2. 命名冲突:同一POU内不能有同名变量,但不同POU之间可以使用相同名称的变量
  3. 内存管理:程序变量在POU执行期间存在,执行结束后释放(具体取决于实现)
  4. VAR_INPUT:输入变量只能读取,不能在程序内部修改

完整示例

PROGRAM TemperatureControl
(* 内部变量 *)
VAR
tempSensor: INT;
setpoint: INT := 50;
isHeating: BOOL := FALSE;
cycleCounter: UINT := 0;
END_VAR

(* 输入变量 *)
VAR_INPUT
i_start: BOOL;
i_stop: BOOL;
i_targetTemp: INT;
END_VAR

(* 输出变量 *)
VAR_OUTPUT
o_heaterOn: BOOL;
o_fanOn: BOOL;
o_alarm: BOOL;
END_VAR

(* 程序逻辑 *)
IF i_start AND NOT i_stop THEN
tempSensor := ReadTemperature();

IF tempSensor < i_targetTemp THEN
o_heaterOn := TRUE;
isHeating := TRUE;
ELSE
o_heaterOn := FALSE;
isHeating := FALSE;
END_IF

cycleCounter := cycleCounter + 1;
ELSE
o_heaterOn := FALSE;
o_fanOn := FALSE;
END_IF
END_PROGRAM

通过以上两种方法,您可以在WasomeCodeX_AI中灵活地声明和使用程序变量。