电气自动化系统中,ST(结构化文本)与LAD(梯形图)是IEC 61131-3标准定义的两种主流编程语言。它们不是竞争关系,而是互补搭档:LAD擅长表达逻辑顺序与硬件映射,ST擅长处理复杂数学运算、数组操作与状态管理。关键不在于“哪个更好”,而在于“哪个更合适”。本文直击工程现场痛点,给出可立即执行的判断依据和混合编程实操步骤。
一、先认清本质:LAD与ST各自不可替代的底层能力
LAD的本质是继电器逻辑的图形化映射。它天然对应输入/输出物理点(如 I0.0、Q1.2),每一行从左母线开始,经触点组合,到右母线驱动线圈。这种结构让工程师一眼看懂信号流向、互锁关系和急停路径。
ST的本质是类Pascal的高级文本语言。它支持变量声明、循环(FOR/WHILE)、条件分支(IF-ELSIF-ELSE)、函数调用、数组索引(Data[3])、浮点运算(SIN(x))、字符串拼接('Temp: ' + REAL_TO_STRING(temp))等——这些在LAD中要么无法实现,要么需数十级嵌套、极易出错。
因此,判断语言选择的第一条铁律是:
当逻辑涉及物理I/O时序、安全回路、设备启停顺序,优先用LAD;
当逻辑涉及数值计算、数据处理、状态机建模、算法封装,优先用ST。
二、ST计算场景:5类必须用ST的硬性条件(附代码模板)
以下场景若强行用LAD实现,将导致程序臃肿、调试困难、后期维护成本飙升。此时必须切换至ST。
-
实时数学运算
例如变频器频率设定:根据温度传感器模拟量AI_Temp(0–10 V → 0–100 °C)动态计算目标频率Freq_SP,公式为:
$$ \text{Freq\_SP} = \max(15,\ \min(50,\ 20 + 0.3 \times (\text{AI\_Temp} - 25))) $$
LAD需用多个比较块、乘法块、限幅块串联,占用12+网络;ST一行解决:Freq_SP := MAX(15.0, MIN(50.0, 20.0 + 0.3 * (AI_Temp - 25.0))); -
数组批量处理
例如读取8路热电偶温度(存于Temp_Array : ARRAY[0..7] OF REAL),求平均值并标记超限通道:Avg_Temp := 0.0; FOR i := 0 TO 7 DO Avg_Temp := Avg_Temp + Temp_Array[i]; END_FOR Avg_Temp := Avg_Temp / 8.0; FOR i := 0 TO 7 DO OverLimit[i] := Temp_Array[i] > (Avg_Temp + 5.0); END_FOR -
复杂状态机(State Machine)
如包装机主轴定位控制,含“找原点→加速→匀速→减速→精定位→夹紧”7个状态。LAD需7个并行网络+大量置位/复位线圈,状态跳转易遗漏互锁;ST用CASE结构清晰闭环:CASE State OF 0: // 找原点 IF Home_Sensor THEN State := 1; END_IF 1: // 加速 IF Speed_Actual >= Speed_Ramp THEN State := 2; END_IF 2: // 匀速... END_CASE -
字符串与通信数据解析
例如从Modbus TCP接收的JSON格式温湿度数据:{"T":23.5,"H":65.2}。LAD无法解析JSON;ST调用内置函数:Json_Str := READ_MODBUS_TCP(...); // 读取原始字符串 T_Value := JSON_GET_REAL(Json_Str, 'T'); // 提取温度字段 H_Value := JSON_GET_REAL(Json_Str, 'H'); // 提取湿度字段 -
PID参数动态整定
根据工况自动切换PID参数组(如空载/满载模式):IF Load_State = LOAD_EMPTY THEN Kp := 2.5; Ti := 120.0; Td := 5.0; ELSIF Load_State = LOAD_FULL THEN Kp := 1.8; Ti := 80.0; Td := 3.0; END_IF PID_Instance.P := Kp; PID_Instance.Ti := Ti; PID_Instance.Td := Td;
三、LAD控制场景:4类必须用LAD的硬性条件(附网络结构说明)
以下场景若改用ST编写,将牺牲可读性、增加安全风险或违反行业规范。
-
安全相关逻辑(Safety Logic)
急停回路、安全门锁、双手启动必须符合EN ISO 13849-1 Cat.3/PL e要求。LAD可清晰展示双通道输入(EStop_A和EStop_B)的冗余串联、强制断开机制:| I0.0 (EStop_A) --| |---| |---( ) Q0.0 (Main_Power) | I0.1 (EStop_B) --| |---| |---|ST无法直观体现物理触点的机械串联关系,审核时会被安全认证机构直接否决。
-
设备启停连锁(Interlock)
如输送带启动前提:润滑泵运行(Lube_OK)、无过载(Motor_Ovrld = FALSE)、下游设备就绪(Downstream_Ready)。LAD单行即完成:| I0.2 (Lube_OK) --| |---|/|---| |---( ) Q1.0 (Conveyor_Start) | I0.3 (Motor_Ovrld) | | | I0.4 (Downstream_Ready) |ST虽能写
IF Lube_OK AND NOT Motor_Ovrld AND Downstream_Ready THEN Conveyor_Start := TRUE; END_IF,但无法在图纸上快速定位连锁失效点。 -
脉冲序列生成(如步进电机方向/脉冲)
需严格保证DIR信号在PULSE上升沿前稳定至少10 μs。LAD通过触点延时(TON)精确控制时序:| Q0.0 (DIR) ---| |---( ) Q0.1 (PULSE) | TON_1.Q |ST中
WAIT语句受扫描周期影响,无法保证微秒级精度。 -
硬件资源映射(Hardware Mapping)
PLC模块地址分配(如AI_Module_1.CH0对应IW100)必须在LAD符号表中明确定义。ST中直接使用IW100属硬编码,更换模块位置后必须全局搜索替换;LAD通过符号名绑定,修改一次即全局生效。
四、混合编程:3步构建ST+LAD协同架构(无歧义落地指南)
混合不是随意混搭,而是按职责分层。遵循以下流程,10分钟内即可完成架构搭建:
-
划分功能区(Function Block Level)
在PLC项目中新建两个函数块:FB_Calculation:类型为ST,负责所有数值计算、状态机、数据处理;FB_Control:类型为LAD,负责I/O驱动、连锁逻辑、安全回路。
二者通过接口变量交互,绝不允许跨语言直接访问物理地址(如LAD中写IW100或ST中写Q1.0)。
-
定义接口变量(Interface Variables)
在FB_Calculation的VAR_INPUT中声明:Temp_AI : REAL; // 输入:温度模拟量 Motor_Running : BOOL; // 输入:电机运行反馈在VAR_OUTPUT中声明:
Freq_CMD : REAL; // 输出:变频器频率指令 Alarm_Code : INT; // 输出:报警代码在
FB_Control中,将上述变量作为符号名调用(如Calc.Freq_CMD),而非地址。 -
调用与执行(Call & Execution Order)
在主程序OB1中按顺序调用:Calc(IN := [Temp_AI := IW100, Motor_Running := Q1.0], OUT := [Freq_CMD => Freq_Out, Alarm_Code => Alarm_Out]); Ctrl(IN := [Freq_SP := Freq_Out, Alarm := Alarm_Out], OUT := [Drive_Enable => Q2.0, Drive_Freq => QW300]);关键约束:
FB_Calculation必须在FB_Control之前扫描执行,确保控制逻辑拿到最新计算结果。
五、避坑清单:工程师踩过的7个混合编程致命错误
| 错误现象 | 后果 | 正确做法 |
|---|---|---|
在LAD中直接调用ST函数并传入物理地址(如 MyFunc(IW100)) |
地址硬编码,迁移困难;无法在线监控中间变量 | 所有物理地址只在LAD入口处赋值给接口变量,ST仅操作接口变量 |
ST中用 Q1.0 := TRUE 直接驱动输出 |
绕过LAD安全连锁,触发安全审计失败 | 输出仅通过 FB_Control 的输出变量驱动,ST只写 Ctrl.Drive_Enable := TRUE |
LAD与ST对同一变量既读又写(如LAD写 Freq_CMD,ST也写 Freq_CMD) |
竞态冲突,值不可预测 | 接口变量严格单向:LAD → ST(输入),ST → LAD(输出) |
ST中用 DELAY 指令替代LAD的 TON |
扫描周期抖动导致定时不准(±10 ms误差) | 微秒/毫秒级定时必须用LAD定时器;ST仅用于秒级以上逻辑延时 |
| 将PID控制算法写在LAD中 | 参数修改需重绘网络,无法批量下载;无法实现自适应整定 | PID封装为ST函数块,LAD仅调用并传递设定值/反馈值 |
在ST中用 IF I0.0 THEN ... END_IF 判断输入 |
失去LAD的触点可视化,故障排查耗时翻倍 | 输入状态统一由LAD采集并赋值给布尔变量(如 Start_PB := I0.0),ST只读 Start_PB |
| 混合项目未设置编译顺序依赖 | FB_Control 先编译,引用未定义的 FB_Calculation 变量 |
在项目属性中手动设置 FB_Calculation 编译优先级高于 FB_Control |
六、性能验证:如何确认混合架构真正有效
完成编程后,执行三项实测:
-
扫描周期压测:在PLC运行时打开诊断界面,观察最大扫描时间。若混合后周期增长超过15%,检查ST中是否含未优化的
FOR循环(如遍历10000元素数组),改为增量处理。 -
变量跟踪验证:在调试模式下,同时打开LAD网络与ST代码窗口,修改一个输入(如
Temp_AI),确认:- ST窗口中
Freq_CMD实时更新; - LAD窗口中
Drive_Freq输出同步变化; - 二者延迟 ≤ 2个扫描周期(证明数据流畅通)。
- ST窗口中
-
故障注入测试:强制断开LAD中的安全触点(如设
EStop_A := FALSE),验证:- ST中
Motor_Running输入立即变为FALSE; FB_Calculation内部所有输出(如Freq_CMD)被置为安全值(如0.0);- LAD输出线圈
Q2.0确实断开。
- ST中
若任一环节失效,立即检查接口变量是否配置为“保持型”(Retentive),或是否启用“输出禁止”功能。
在LAD中画清物理世界的因果链条,在ST中写下数字世界的精确方程。两者之间不需要桥梁,只需要一道干净的接口边界。

暂无评论,快来抢沙发吧!