核心语法要点
数据类型
ST支持标准数据类型,选择合适类型可优化性能。
VAR bRun : BOOL := FALSE; // 布尔 nCount : INT := 0; // 整数 fSpeed : REAL := 0.0; // 浮点 aTemp : ARRAY[1..8] OF REAL; // 数组 END_VAR
控制结构
条件判断和循环语句使逻辑清晰。
IF bStart AND NOT bFault THEN bRun := TRUE; ELSIF bStop THEN bRun := FALSE; END_IF; FOR i := 1 TO 8 DO aTemp[i] := 25.0; END_FOR;
函数与函数块
函数无状态,函数块可保存内部状态。
FUNCTION Add : INT VAR_INPUT a,b : INT; END_VAR Add := a + b; END_FUNCTION FUNCTION_BLOCK FB_Motor VAR_INPUT bEnable : BOOL; END_VAR VAR_OUTPUT bRunning : BOOL; END_VAR VAR eState : (STOP,RUN); END_VAR CASE eState OF STOP: IF bEnable THEN eState := RUN; END_IF; RUN: bRunning := TRUE; END_CASE; END_FUNCTION_BLOCK
实战案例:输送带控制
需求概述
主程序结构
PROGRAM MAIN VAR fbConv : FB_Conveyor; fbCnt : FB_Counter; bAuto : BOOL := TRUE; END_VAR fbConv(bAutoMode:=bAuto, bSensor:=DI_Sensor, bMotor=>DO_Motor); fbCnt(bTrigger:=fbConv.bPassed, nTotal=>HMI.nCount); END_PROGRAM
输送带控制函数块
FUNCTION_BLOCK FB_Conveyor VAR_INPUT bAutoMode,bSensor : BOOL; END_VAR VAR_OUTPUT bMotor : BOOL; END_VAR VAR eState : (IDLE,RUN); END_VAR CASE eState OF IDLE: bMotor := FALSE; IF (bAutoMode AND bSensor) OR (NOT bAutoMode AND bStart) THEN eState := RUN; END_IF; RUN: bMotor := TRUE; IF (bAutoMode AND NOT bSensor) OR bStop THEN eState := IDLE; END_IF; END_CASE; END_FUNCTION_BLOCK
计数器函数块
FUNCTION_BLOCK FB_Counter VAR_INPUT bTrigger,bReset : BOOL; END_VAR VAR_OUTPUT nTotal : DINT; END_VAR VAR bLast : BOOL := FALSE; END_VAR IF bTrigger AND NOT bLast THEN nTotal := nTotal + 1; IF nTotal < 0 THEN nTotal := 0; END_IF; END_IF; bLast := bTrigger; IF bReset THEN nTotal := 0; END_IF; END_FUNCTION_BLOCK
调试关键
优化技巧
可读性提升
效率优化
健壮性设计
性能数据
表格
| 任务 | 梯形图时间 | ST时间 | 提升 |
|---|---|---|---|
| 浮点运算100次 | 1.8ms | 0.9ms | 50% |
| 数据排序50个 | 2.3ms | 1.2ms | 48% |
| 状态机处理 | 1.5ms | 0.8ms | 47% |
总结
结构化文本为复杂PLC控制提供了高效工具。通过模块化设计、清晰语法和优化技巧,可显著提升代码质量和执行效率。
原文:https://www.gongkong.com/article/202602/plc-st-function-Conveyor-belt-control


