我来为您全面介绍西门子PLC的ST(Structured Text,结构化文本)语法,这是IEC 61131-3标准定义的一种高级编程语言。
一、ST语言基础概念
ST是一种类似于Pascal的高级编程语言,主要用于复杂的数学运算、数据处理和算法实现。它在西门子TIA Portal(博途)中广泛应用于S7-1200/1500等PLC编程。
二、基本语法规则
1. 语句结构
- 每条语句以分号(;)结束
- 不区分大小写(但建议保持一致性)
- 支持单行注释(//)和多行注释(/* */)
- 代码块使用关键字界定,如IF…END_IF
2. 变量声明与数据类型
基本数据类型:
- BOOL:布尔型(TRUE/FALSE)
- BYTE:字节(8位)
- WORD:字(16位)
- DWORD:双字(32位)
- INT:整数(-32768到32767)
- DINT:双整数(-2147483648到2147483647)
- REAL:浮点数(32位)
- LREAL:长浮点数(64位)
- TIME:时间类型
- STRING:字符串类型
变量声明示例:
VAR
Motor_Start : BOOL;
Temperature : REAL;
Counter : INT := 0; // 带初始值
Message : STRING[50];
END_VAR
三、运算符
1. 算术运算符
- 加法:+
- 减法:-
- 乘法:*
- 除法:/
- 取模:MOD
- 指数:**
示例:
Result := (A + B) * C / D;
Remainder := 17 MOD 5; // 结果为2
Power := 2 ** 3; // 结果为8
2. 比较运算符
- 等于:=
- 不等于:<>
- 大于:>
- 小于:
- 大于等于:>=
- 小于等于:<=
3. 逻辑运算符
- 与:AND
- 或:OR
- 非:NOT
- 异或:XOR
示例:
Output := Input1 AND Input2 OR NOT Input3;
4. 位运算符
- 位与:AND(用于BYTE/WORD/DWORD)
- 位或:OR
- 位异或:XOR
- 位非:NOT
四、控制结构
1. IF条件语句
IF Temperature > 100.0 THEN
Alarm := TRUE;
Fan_Speed := 100;
ELSIF Temperature > 80.0 THEN
Alarm := FALSE;
Fan_Speed := 75;
ELSE
Alarm := FALSE;
Fan_Speed := 50;
END_IF;
2. CASE选择语句
CASE Machine_State OF
0: // 停止状态
Motor := FALSE;
Lamp := FALSE;
1: // 运行状态
Motor := TRUE;
Lamp := TRUE;
2: // 维护状态
Motor := FALSE;
Lamp := TRUE;
ELSE
// 默认处理
Motor := FALSE;
Lamp := FALSE;
END_CASE;
3. FOR循环
FOR i := 1 TO 10 DO
Array[i] := i * 2;
END_FOR;
// 带步长的循环
FOR j := 10 TO 1 BY -1 DO
Countdown[j] := j;
END_FOR;
4. WHILE循环
WHILE Temperature < SetPoint DO
Heater := TRUE;
Temperature := Temperature + 0.5;
END_WHILE;
5. REPEAT循环
REPEAT
Counter := Counter + 1;
Sum := Sum + Array[Counter];
UNTIL Counter >= 100
END_REPEAT;
五、数组和结构体
1. 数组操作
VAR
Sensors : ARRAY[1..10] OF REAL;
Matrix : ARRAY[1..5, 1..3] OF INT;
END_VAR
// 访问数组元素
Sensors[5] := 25.5;
Matrix[2,3] := 100;
// 数组遍历
FOR i := 1 TO 10 DO
Total := Total + Sensors[i];
END_FOR;
2. 结构体(UDT)
TYPE Motor_Data :
STRUCT
Running : BOOL;
Speed : REAL;
Current : REAL;
Hours : DINT;
END_STRUCT;
END_TYPE
VAR
Motor1 : Motor_Data;
END_VAR
// 使用结构体
Motor1.Running := TRUE;
Motor1.Speed := 1500.0;
六、函数和功能块
1. 函数调用
// 数学函数
Result := ABS(-10); // 绝对值
Result := SQRT(16.0); // 平方根
Result := SIN(angle); // 正弦
Result := LN(10.0); // 自然对数
// 类型转换
IntValue := REAL_TO_INT(25.7);
RealValue := INT_TO_REAL(100);
2. 定时器使用
// TON - 接通延时定时器
MyTimer(IN := Start_Button,
PT := T#5S);
IF MyTimer.Q THEN
Motor := TRUE;
END_IF;
3. 计数器使用
// CTU - 增计数器
MyCounter(CU := Count_Pulse,
RESET := Reset_Button,
PV := 100);
IF MyCounter.Q THEN
Batch_Complete := TRUE;
END_IF;
七、实用编程技巧
1. 边沿检测
// 上升沿检测
VAR
Button : BOOL;
Button_Old : BOOL;
Rising_Edge : BOOL;
END_VAR
Rising_Edge := Button AND NOT Button_Old;
Button_Old := Button;
2. 模拟量处理
// 线性标定
Scaled_Value := (Raw_Value - 0) * (100.0 - 0.0) / (27648 - 0) + 0.0;
// 限幅处理
IF Value > Max_Limit THEN
Value := Max_Limit;
ELSIF Value < Min_Limit THEN
Value := Min_Limit;
END_IF;
3. 状态机实现
CASE State OF
0: // 初始化
IF Init_Complete THEN
State := 10;
END_IF;
10: // 等待启动
IF Start_Button THEN
State := 20;
END_IF;
20: // 运行中
IF Stop_Button THEN
State := 30;
ELSIF Error THEN
State := 99;
END_IF;
30: // 停止
IF Reset_Button THEN
State := 0;
END_IF;
99: // 错误处理
IF Error_Reset THEN
State := 0;
END_IF;
END_CASE;
八、学习建议和实践步骤
- 循序渐进:先掌握基本语法,再学习复杂结构
- 动手实践:在TIA Portal中创建项目,编写简单程序
- 从简单开始:先实现基本逻辑控制,如启停、互锁
- 逐步提高:学习定时器、计数器、PID控制等高级应用
- 项目驱动:通过实际项目需求来深化理解
九、常见应用示例
电机控制程序:
// 电机启停控制带互锁
IF Start_Button AND NOT Stop_Button AND NOT Error THEN
Motor_Run := TRUE;
ELSIF Stop_Button OR Error OR Emergency_Stop THEN
Motor_Run := FALSE;
END_IF;
// 运行时间累计
IF Motor_Run THEN
Run_Time := Run_Time + Cycle_Time;
END_IF;
温度控制程序:
// 简单温控逻辑
Error := Setpoint - Actual_Temp;
IF Error > 2.0 THEN
Heater := TRUE;
Cooler := FALSE;
ELSIF Error < -2.0 THEN
Heater := FALSE;
Cooler := TRUE;
ELSE
Heater := FALSE;
Cooler := FALSE;
END_IF;
通过系统学习这些内容,结合实际编程练习,您就能熟练掌握西门子PLC的ST语言编程。建议您在TIA Portal软件中创建测试项目,逐一验证这些语法和功能,通过仿真或实际PLC来调试程序,这样能够更深入地理解和应用ST语言。