PLC梯形图到结构化文本的进阶:用ST语言实现复杂工业控制逻辑
在工控现场摸爬滚打过的工程师都明白一个道理:梯形图(LD)不是万能的。当遇到PID调节、配方管理、批次排序、字符串处理、通信协议解析这类场景时,梯形图需要用几十行甚至上百行触点和线圈去拼凑,而用结构化文本(ST)可能只需短短几行。ST作为IEC 61131-3标准定义的五种PLC语言之一,语法类似Pascal/C,正在成为现代PLC复杂逻辑编程的首选。
梯形图与ST的分工边界
西门子编程风格指南明确指出:标准功能块首选SCL(即ST),它提供最紧凑的形式和最佳的可读性;LAD/FBD保留用于调用环境和简单二进制逻辑。这给了我们清晰的分工原则:
保留梯形图:简单位逻辑、电机启停、离散互锁、安全回路(视觉验证更直观)
转向ST:复杂计算、数据处理、配方管理、状态机、通信协议、任何超过5行梯形图才能表达的3行ST逻辑
经验法则:如果一段梯形图需要5行以上横档才能表达3行ST的逻辑,就该转换了。
基础转换模式
自锁电路的等价转换是最经典的例子:
// 梯形图: |--[Start]--+--[NOT Stop]--( Motor )--|
// | |
// |--[Motor]--+
// ST等价:
IF Start OR Motor THEN
IF NOT Stop THEN
Motor := TRUE;
ELSE
Motor := FALSE;
END_IF;
ELSE
Motor := FALSE;
END_IF;
串联变AND,并联变OR,这是梯形图转ST的基本法则。
用CASE实现状态机:ST的杀手锏
批次控制、 sequencing、多步工艺是ST真正的舞台。以物料分拣系统为例,用CASE语句可以清晰地表达状态流转:
CASE Step OF
0: // 空闲
IF StartButton THEN
Step := 10;
END_IF;
10: // 灌装
FillValve := TRUE;
tonFill(IN := TRUE, PT := T#2S);
IF tonFill.Q THEN
FillValve := FALSE;
Step := 20;
END_IF;
20: // 加热
Heater := TRUE;
IF Temperature >= Setpoint THEN
Heater := FALSE;
Step := 30;
END_IF;
30: // 排空
DischargeValve := TRUE;
IF LevelLow THEN
DischargeValve := FALSE;
Step := 0;
END_IF;
END_CASE;
同样的逻辑如果用梯形图实现,需要几十行横档配合步序计数器比较和条件跳转,维护时极难一眼看清状态流转。
功能块封装:一次编写,多次实例化
ST的另一大优势是函数块(FUNCTION_BLOCK)——带内部状态的可重用单元。以电机控制为例:
FUNCTION_BLOCK FB_Motor
VAR_INPUT
bEnable : BOOL;
bFault : BOOL;
END_VAR
VAR_OUTPUT
bRunning : BOOL;
END_VAR
VAR
eState : (STOP, RUN);
END_VAR
CASE eState OF
STOP:
IF bEnable AND NOT bFault THEN
eState := RUN;
END_IF;
RUN:
bRunning := TRUE;
IF bFault THEN
eState := STOP;
END_IF;
END_CASE;
END_FUNCTION_BLOCK
主程序中可以实例化20个FB_Motor,分别控制20台电机,而逻辑只写一次。这种"Write Once, Instantiate Many"的模式在梯形图中几乎无法实现。
数组与循环:批量处理的利器
对于配方管理、多通道数据采集等场景,ST的数组和循环无可替代:
VAR
aRecipe : ARRAY[1..20] OF STRUCT
TempSetpoint : REAL;
Duration : TIME;
AgitateSpeed : INT;
END_STRUCT;
END_VAR
FOR i := 1 TO 20 DO
aRecipe[i].TempSetpoint := 25.0 + i * 2.5;
END_FOR;
相比梯形图基于横档的逐位操作,ST处理数组的效率提升是数量级的。
增量迁移策略
从梯形图迁移到ST,切忌"大爆炸式"重写。推荐增量式迁移:
每次迁移一个功能块,立即进行在线仿真验证
设计先行:先定义接口变量、数据结构,绘制流程图
逐梯级翻译:遵循串联→AND、并联→OR的规则
混合编程:在CODESYS、TIA Portal、GX Works3、AutoShop等主流IDE中,LD和ST可以共存于同一项目
汇川PLC的实践建议很有代表性:简单位逻辑用梯形图,复杂数值运算用ST,二者混编兼顾易用性和效率。模拟量换算、PID等场景优先用ST,核心是做好类型转换和模块化。
实战:PID温度控制
VAR
fPV : REAL; // 过程值(实测温度)
fSP : REAL; // 设定值
fMV : REAL; // 控制输出
fbPID : PID_AT; // PID功能块实例
END_VAR
fbPID( PV := fPV,
SP := fSP,
KP := 1.2,
KI := 0.05,
KD := 0.01,
MV => fMV );
// 输出限幅
IF fMV > 100.0 THEN fMV := 100.0; END_IF;
这段代码的梯形图等价物需要多个比较块、MOV指令和数学块通过中间位连接,冗长且易错。
写在最后
从梯形图到ST的进阶,本质是思维方式的升级——从"画电路"到"写算法"。ST不是要取代梯形图,而是补足梯形图在复杂逻辑表达上的短板。掌握IF/CASE/FOR三大控制结构,熟练运用FUNCTION_BLOCK封装,理解数组与结构体的数据组织方式,你就能游刃有余地应对批次控制、配方管理、PID调节、通信协议解析等几乎所有工业复杂场景。
现代PLC工程(如CODESYS)本身就是制造商无关的IEC 61131-3标准实现,ST语言一次编写,可在不同厂家的硬件平台上移植。对于追求代码复用性、可维护性和算法表达力的工程师而言,ST不再是"高阶选修课",而是"进阶必修课"。从下一个项目开始,试着把复杂的那部分逻辑用ST重写,你会发现——原来工业控制也可以写得如此优雅。





