ST语法介绍
我来为您全面介绍西门子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:字符串类型
变量声明示例:
VARMotor_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 THENAlarm := TRUE;Fan_Speed := 100;
ELSIF Temperature > 80.0 THENAlarm := FALSE;Fan_Speed := 75;
ELSEAlarm := FALSE;Fan_Speed := 50;
END_IF;
2. CASE选择语句
CASE Machine_State OF0: // 停止状态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 DOArray[i] := i * 2;
END_FOR;// 带步长的循环
FOR j := 10 TO 1 BY -1 DOCountdown[j] := j;
END_FOR;
4. WHILE循环
WHILE Temperature < SetPoint DOHeater := TRUE;Temperature := Temperature + 0.5;
END_WHILE;
5. REPEAT循环
REPEATCounter := Counter + 1;Sum := Sum + Array[Counter];
UNTIL Counter >= 100
END_REPEAT;
五、数组和结构体
1. 数组操作
VARSensors : 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 DOTotal := Total + Sensors[i];
END_FOR;
2. 结构体(UDT)
TYPE Motor_Data :
STRUCTRunning : BOOL;Speed : REAL;Current : REAL;Hours : DINT;
END_STRUCT;
END_TYPEVARMotor1 : 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 THENMotor := TRUE;
END_IF;
3. 计数器使用
// CTU - 增计数器
MyCounter(CU := Count_Pulse,RESET := Reset_Button,PV := 100);IF MyCounter.Q THENBatch_Complete := TRUE;
END_IF;
七、实用编程技巧
1. 边沿检测
// 上升沿检测
VARButton : BOOL;Button_Old : BOOL;Rising_Edge : BOOL;
END_VARRising_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 THENValue := Max_Limit;
ELSIF Value < Min_Limit THENValue := Min_Limit;
END_IF;
3. 状态机实现
CASE State OF0: // 初始化IF Init_Complete THENState := 10;END_IF;10: // 等待启动IF Start_Button THENState := 20;END_IF;20: // 运行中IF Stop_Button THENState := 30;ELSIF Error THENState := 99;END_IF;30: // 停止IF Reset_Button THENState := 0;END_IF;99: // 错误处理IF Error_Reset THENState := 0;END_IF;
END_CASE;
八、学习建议和实践步骤
- 循序渐进:先掌握基本语法,再学习复杂结构
- 动手实践:在TIA Portal中创建项目,编写简单程序
- 从简单开始:先实现基本逻辑控制,如启停、互锁
- 逐步提高:学习定时器、计数器、PID控制等高级应用
- 项目驱动:通过实际项目需求来深化理解
九、常见应用示例
电机控制程序:
// 电机启停控制带互锁
IF Start_Button AND NOT Stop_Button AND NOT Error THENMotor_Run := TRUE;
ELSIF Stop_Button OR Error OR Emergency_Stop THENMotor_Run := FALSE;
END_IF;// 运行时间累计
IF Motor_Run THENRun_Time := Run_Time + Cycle_Time;
END_IF;
温度控制程序:
// 简单温控逻辑
Error := Setpoint - Actual_Temp;IF Error > 2.0 THENHeater := TRUE;Cooler := FALSE;
ELSIF Error < -2.0 THENHeater := FALSE;Cooler := TRUE;
ELSEHeater := FALSE;Cooler := FALSE;
END_IF;
通过系统学习这些内容,结合实际编程练习,您就能熟练掌握西门子PLC的ST语言编程。建议您在TIA Portal软件中创建测试项目,逐一验证这些语法和功能,通过仿真或实际PLC来调试程序,这样能够更深入地理解和应用ST语言。