IEC61131-3 ST 语言进阶 - 变量声明与运算符详解
变量声明与作用域
1. 变量类型关键字
| 关键字 | 说明 | 是否保持值 |
|---|
VAR | 局部变量 | ✅ 保持 |
VAR_INPUT | 输入参数(只读) | ❌ 每次调用更新 |
VAR_OUTPUT | 输出参数 | ❌ 每次调用更新 |
VAR_IN_OUT | 输入输出参数(引用传递) | ❌ 引用外部变量 |
VAR_TEMP | 临时变量 | ❌ 不保持 |
VAR_CONSTANT | 常量 | ✅ 固定值 |
VAR_EXTERNAL | 外部变量引用 | - |
VAR_GLOBAL | 全局变量 | ✅ 保持 |
2. 变量声明示例
// 局部变量(保持值)
VAR
Counter : INT;
Temperature : REAL := 25.0;
END_VAR
// 输入参数
VAR_INPUT
Start : BOOL;
Speed_Set : INT;
END_VAR
// 输出参数
VAR_OUTPUT
Running : BOOL;
Current_Speed : INT;
END_VAR
// 输入输出参数(引用传递)
VAR_IN_OUT
DataBuffer : ARRAY[0..99] OF INT;
END_VAR
// 临时变量(每次调用重新分配)
VAR_TEMP
i : INT;
TempValue : REAL;
END_VAR
3. 全局变量(GVL)
// 全局变量列表声明
VAR_GLOBAL
g_SystemMode : INT := 0;
g_EmergencyStop : BOOL := FALSE;
g_MachineName : STRING[40] := 'MainLine';
END_VAR
// 在 POU 中使用
PROGRAM Main
g_SystemMode := 1; // 直接访问
IF g_EmergencyStop THEN
StopAll();
END_IF;
END_PROGRAM
4. 变量作用域示例
FUNCTION_BLOCK FB_Control
VAR_INPUT
AutoMode : BOOL;
END_VAR
VAR
LocalCounter : INT; // 局部变量,保持值
TempValue : REAL; // 临时变量
END_VAR
IF AutoMode THEN
LocalCounter := LocalCounter + 1;
g_SystemMode := 1; // 修改全局变量
g_EmergencyStop := FALSE;
END_IF;
END_FUNCTION_BLOCK
运算符详解
1. 算术运算符
| 运算符 | 说明 | 示例 | 结果 |
|---|
+ | 加法 | A + B | 和 |
- | 减法 | A - B | 差 |
* | 乘法 | A * B | 积 |
/ | 除法 | A / B | 商(REAL) |
DIV | 整数除法 | A DIV B | 整数商 |
MOD | 取余 | A MOD B | 余数 |
** | 幂运算 | A ** 2 | A的平方 |
// 基本运算
Sum := A + B;
Diff := A - B;
Product := A * B;
// REAL 除法(保留小数)
Quotient := 10.0 / 3.0; // 结果: 3.333...
// 整数除法(截断)
Division := 10 DIV 3; // 结果: 3
// 取余
Remainder := 10 MOD 3; // 结果: 1
// 幂运算
Square := 5 ** 2; // 结果: 25
Cube := 3 ** 3; // 结果: 27
2. 比较运算符
| 运算符 | 说明 | 示例 |
|---|
= | 等于 | A = B |
<> | 不等于 | A <> B |
< | 小于 | A < B |
> | 大于 | A > B |
<= | 小于等于 | A <= B |
>= | 大于等于 | A >= B |
// 比较结果为 BOOL 类型
Equal := (A = B); // TRUE 如果相等
NotEqual := (A <> B); // TRUE 如果不相等
LessThan := (A < B); // TRUE 如果 A 小于 B
GreaterThan := (A > B); // TRUE 如果 A 大于 B
// 在 IF 条件中使用
IF Temperature >= 100.0 THEN
Alarm := TRUE;
END_IF;
IF Mode <> 0 AND NOT Error THEN
RunProcess();
END_IF;
3. 逻辑运算符
| 运算符 | 说明 | 真值表 |
|---|
AND | 与 | TRUE AND TRUE = TRUE |
OR | 或 | FALSE OR TRUE = TRUE |
XOR | 异或 | TRUE XOR FALSE = TRUE |
NOT | 非 | NOT TRUE = FALSE |
// 基本逻辑
AND_Result := A AND B; // 两个都为 TRUE 才为 TRUE
OR_Result := A OR B; // 有一个为 TRUE 就为 TRUE
XOR_Result := A XOR B; // 不同为 TRUE,相同为 FALSE
NOT_Result := NOT A; // 取反
// 组合使用(注意优先级:NOT > AND > OR)
IF (Sensor1 AND Sensor2) OR EmergencyStop THEN
Alarm := TRUE;
END_IF;
IF NOT Motor_Running AND Start_Button THEN
Motor_Run();
END_IF;
// 实际场景:安全条件检查
SafeToStart := NOT EmergencyStop
AND Door_Closed
AND (AutoMode OR ManualMode);
4. 位运算
| 运算符 | 说明 | 示例 |
|---|
AND | 位与 | Data AND 16#FF00 |
OR | 位或 | Data1 OR Data2 |
XOR | 位异或 | Data XOR 16#FFFF |
NOT | 位取反 | NOT Data |
SHL | 左移 | Data SHL 2 |
SHR | 右移 | Data SHR 3 |
// 位与(掩码提取)
UpperByte := Data AND 16#FF00;
LowerByte := Data AND 16#00FF;
// 位或(组合数据)
Combined := (HighByte SHL 8) OR LowByte;
// 位异或(翻转特定位)
Flipped := Data XOR 16#00FF;
// 位取反
Inverted := NOT Data;
// 移位操作
ShiftedLeft := Data SHL 2; // 左移 2 位
ShiftedRight := Data SHR 3; // 右移 3 位
// 实际应用:状态位解析
VAR
StatusWord : WORD;
Bit0 : BOOL;
Bit1 : BOOL;
Bits4to7 : BYTE;
END_VAR
Bit0 := (StatusWord AND 16#0001) <> 0; // 检查第 0 位
Bit1 := (StatusWord AND 16#0002) <> 0; // 检查第 1 位
Bits4to7 := (StatusWord AND 16#00F0) SHR 4; // 提取 4-7 位
运算符优先级
从高到低:
() - 括号
** - 幂运算
NOT - 逻辑非
*, /, DIV, MOD - 乘除
+, - - 加减
<, >, <=, >= - 比较
=, <> - 等于/不等于
AND, & - 与
XOR - 异或
OR - 或
建议: 不确定时加括号,提高可读性。
// 清晰的写法
Result := ((A + B) * C) - (D / E);
// 逻辑表达式
IF (Sensor1 AND Sensor2) OR (Backup AND Emergency) THEN
文档版本:1.0 | 更新日期:2026-04-28 | 作者:JianLin Studio