博文

IEC61131-3 ST语言进阶 - 变量声明与运算符详解

ST/PLC

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 ** 2A的平方
// 基本运算
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. 逻辑运算符

运算符说明真值表
ANDTRUE AND TRUE = TRUE
ORFALSE OR TRUE = TRUE
XOR异或TRUE XOR FALSE = TRUE
NOTNOT 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 位

运算符优先级

从高到低:

  1. () - 括号
  2. ** - 幂运算
  3. NOT - 逻辑非
  4. *, /, DIV, MOD - 乘除
  5. +, - - 加减
  6. <, >, <=, >= - 比较
  7. =, <> - 等于/不等于
  8. AND, & - 与
  9. XOR - 异或
  10. OR - 或

建议: 不确定时加括号,提高可读性。

// 清晰的写法
Result := ((A + B) * C) - (D / E);

// 逻辑表达式
IF (Sensor1 AND Sensor2) OR (Backup AND Emergency) THEN

文档版本:1.0 | 更新日期:2026-04-28 | 作者:JianLin Studio

← 返回博文列表