ST与梯形图混合编程:何时用ST计算,何时用LAD控制

发布于 2026-03-18 09:53:38 · 浏览 3 次 · 评论 0 条

电气自动化系统中,ST(结构化文本)与LAD(梯形图)是IEC 61131-3标准定义的两种主流编程语言。它们不是竞争关系,而是互补搭档:LAD擅长表达逻辑顺序与硬件映射,ST擅长处理复杂数学运算、数组操作与状态管理。关键不在于“哪个更好”,而在于“哪个更合适”。本文直击工程现场痛点,给出可立即执行的判断依据和混合编程实操步骤。


一、先认清本质:LAD与ST各自不可替代的底层能力

LAD的本质是继电器逻辑的图形化映射。它天然对应输入/输出物理点(如 I0.0Q1.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。

  1. 实时数学运算
    例如变频器频率设定:根据温度传感器模拟量 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)));
  2. 数组批量处理
    例如读取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
  3. 复杂状态机(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
  4. 字符串与通信数据解析
    例如从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'); // 提取湿度字段
  5. 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编写,将牺牲可读性、增加安全风险或违反行业规范。

  1. 安全相关逻辑(Safety Logic)
    急停回路、安全门锁、双手启动必须符合EN ISO 13849-1 Cat.3/PL e要求。LAD可清晰展示双通道输入(EStop_AEStop_B)的冗余串联、强制断开机制:

    | I0.0 (EStop_A) --| |---| |---( ) Q0.0 (Main_Power)
    | I0.1 (EStop_B) --| |---| |---|

    ST无法直观体现物理触点的机械串联关系,审核时会被安全认证机构直接否决。

  2. 设备启停连锁(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,但无法在图纸上快速定位连锁失效点。

  3. 脉冲序列生成(如步进电机方向/脉冲)
    需严格保证 DIR 信号在 PULSE 上升沿前稳定至少10 μs。LAD通过触点延时(TON)精确控制时序:

    | Q0.0 (DIR) ---| |---( ) Q0.1 (PULSE)
    | TON_1.Q      |

    ST中WAIT语句受扫描周期影响,无法保证微秒级精度。

  4. 硬件资源映射(Hardware Mapping)
    PLC模块地址分配(如 AI_Module_1.CH0 对应 IW100)必须在LAD符号表中明确定义。ST中直接使用 IW100 属硬编码,更换模块位置后必须全局搜索替换;LAD通过符号名绑定,修改一次即全局生效。


四、混合编程:3步构建ST+LAD协同架构(无歧义落地指南)

混合不是随意混搭,而是按职责分层。遵循以下流程,10分钟内即可完成架构搭建:

  1. 划分功能区(Function Block Level)
    在PLC项目中新建两个函数块:

    • FB_Calculation:类型为 ST,负责所有数值计算、状态机、数据处理;
    • FB_Control:类型为 LAD,负责I/O驱动、连锁逻辑、安全回路。
      二者通过接口变量交互,绝不允许跨语言直接访问物理地址(如LAD中写 IW100 或ST中写 Q1.0)。
  2. 定义接口变量(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),而非地址。

  3. 调用与执行(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

六、性能验证:如何确认混合架构真正有效

完成编程后,执行三项实测:

  1. 扫描周期压测:在PLC运行时打开诊断界面,观察最大扫描时间。若混合后周期增长超过15%,检查ST中是否含未优化的 FOR 循环(如遍历10000元素数组),改为增量处理。

  2. 变量跟踪验证:在调试模式下,同时打开LAD网络与ST代码窗口,修改一个输入(如 Temp_AI),确认:

    • ST窗口中 Freq_CMD 实时更新;
    • LAD窗口中 Drive_Freq 输出同步变化;
    • 二者延迟 ≤ 2个扫描周期(证明数据流畅通)。
  3. 故障注入测试:强制断开LAD中的安全触点(如设 EStop_A := FALSE),验证:

    • ST中 Motor_Running 输入立即变为 FALSE
    • FB_Calculation 内部所有输出(如 Freq_CMD)被置为安全值(如 0.0);
    • LAD输出线圈 Q2.0 确实断开。

若任一环节失效,立即检查接口变量是否配置为“保持型”(Retentive),或是否启用“输出禁止”功能。


在LAD中画清物理世界的因果链条,在ST中写下数字世界的精确方程。两者之间不需要桥梁,只需要一道干净的接口边界。

评论 (0)

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

扫一扫,手机查看

扫描上方二维码,在手机上查看本文