声明程序变量
什么是程序变量
程序变量(也称为局部变量)是在特定程序(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(梯形图)编辑器中声明程序变量。
操作步骤
- 打开图形化编辑器例如LD(梯形图)编辑器
- 在编辑器上方的变量视图中,点击添加变量按钮
- 在新建的变量声明框中填写变量信息:
- 类型:选择变量类型(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 |
注意事项
注意
- 作用域限制:程序变量仅在声明它的POU内部有效,外部无法直接访问
- 命名冲突:同一POU内不能有同名变量,但不同POU之间可以使用相同名称的变量
- 内存管理:程序变量在POU执行期间存在,执行结束后释放(具体取决于实现)
- 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中灵活地声明和使用程序变量。