本文档已合并
LAD 编程指南
本文档介绍梯形图程序设计的核心原则、常用设计模式以及完整的工程示例,帮助工程师写出可靠、可维护的 LAD 程序。
设计原则
1. 每级只做一个逻辑功能
每个梯级应实现一个独立、完整的逻辑功能。避免将多个不相关的逻辑塞入同一梯级。
// 好:每级一个功能
// 梯级 1: 电机启动条件
bStart bStop bOverload bMotorRun
──┤ ├──────┤/├──────┤/├──────────────( )──
// 梯级 2: 运行指示
bMotorRun bMotorIndicator
──┤ ├────────────────────( )──
// 梯级 3: 计时
bMotorRun ┌─ TON ────┐ bRunTimeOK
──┤ ├────────┤ IN Q ├───( )──
│ PT T#1h│
└──────────┘
// 不好:多种逻辑混在一起
bStart bStop bOverload ┌─ TON ────┐ bMotorRun bIndicator
──┤ ├──────┤/├──────┤/├──────────┤ IN Q├───┤S├────────( )──
│ PT T#1h│
└──────────┘
2. 安全信号串在最前
急停、安全门、光栅等安全相关信号应串联在所有输出线圈之前,使用常闭触点形式(断线即停)。
// 安全联锁 — 在所有梯级之前
bEStop bSafetyGate bLightCurtain bSafetyOK
──┤/├──────┤/├───────────┤/├───────────────( )──
// 每个输出梯级引用 bSafetyOK
bStart bSafetyOK bMotor
──┤ ├──────┤ ├─────────────────────( )──
3. 优先使用 S/R 代替自锁
置位/复位线圈逻辑比自锁电路更清晰,不容易出现"意外保持"的 bug。
// 推荐:S/R 方式
bStart bMotorRun
──┤ ├─────────────────────(S)──
bStop bMotorRun
──┤ ├─────────────────────(R)──
// 避免:自锁方式(可读性差,易出错)
bStart bStop bMotorRun
──┤ ├──────┤/├────┬───────────────( )──
│
bMotorRun │
──┤ ├──────────────┘
4. 显式复位所有 S 线圈
使用 S(置位)线圈时,必须有对应的 R(复位)路径,否则可能导致输出"粘死"。
5. 定时器/计数器实例命名清晰
// 好:有意义的命名
tonMotorOverloadDelay
ctuPartCount_Line1
tofCoolingFanOff
// 避免:无意义命名
ton1
ctu2
timer_3
常用设计模式
模式 1:自锁(保持)电路
用途:按钮启动、保持运行、按钮停止。
// 自锁启停
bStart bRunning
──┤ ├────┬──────────────(S)──
│
bStop │
──┤/├────┘
// 或标准自锁形式:
bStart bStop bRunning
──┤ ├──────┤/├────┬───────────────( )──
│
bRunning │
──┤ ├──────────────┘
模式 2:互锁
用途:防止两个输出同时导通(如电机正反转、阀门开关)。
// 正转启动
bFwd bFwdRun
──┤ ├────┬──────────────(S)──
│
bRevRun│
──┤/├────┘
// 反转启动
bRev bRevRun
──┤ ├────┬──────────────(S)──
│
bFwdRun│
──┤/├────┘
// 停止
bStop bFwdRun
──┤ ├─────┤ ├────────────(R)──
bStop bRevRun
──┤ ├─────┤ ├────────────(R)──
模式 3:延时启动/停止
用途:电机星三角启动、风机延时停止、防颤振。
// 延时启动
bStart bStop bDelayStart
──┤ ├──────┤/├────────────────────(S)──
bDelayStart ┌─ TON ────┐ bMotorOn
──┤ ├──────────┤ IN Q├───────( )──
│ PT T#3s │
└──────────┘
// 延时停止
bStop bDelayStop
──┤ ├─────────────────────(S)──
bDelayStop ┌─ TOF ────┐ bFanRun
──┤/├─────────┤ IN Q├───────( )──
│ PT T#5s │
└──────────┘
模式 4:脉冲生成
用途:报警灯闪烁、周期触发、看门狗脉冲。
// 对称方波(50% 占空比)
bFlash ┌─ TP ───────┐ bFlash
──┤/├──────────────┤ IN Q ├───( )──
│ PT T#500ms │
└────────────┘
// 非对称方波
bTimerPulse ┌─ TON ────┐ bTimerPulse
──┤/├──────────┤ IN Q├───────( )──
│ PT T#1s │
└──────────┘
// bTimerPulse = 1s ON / 1s OFF 循环
模式 5:顺序控制(步进)
用途:多步工艺流程、工位顺序控制。
// 步骤 1:启动条件
bStart bStep3Done bStep1
──┤ ├──────┤/├─────────────────────(S)──
bStep2Active bStep1
──┤ ├──────────────────────────────(R)──
// 步骤 2:执行动作
bStep1 bStep2Done bStep2
──┤ ├──────┤/├─────────────────────(S)──
bStep3Active bStep2
──┤ ├──────────────────────────────(R)──
// 步骤 3:完成
bStep2 tonStep3.Q bStep3
──┤ ├──────┤ ├─────────────────────(S)──
bStep1Active bStep3
──┤ ├──────────────────────────────(R)──
模式 6:故障检测与恢复
用途:超时检测、故障锁存、手动复位。
// 超时检测
bCommandActive ┌─ TON ────┐ bTimeout
──┤ ├──────────────┤ IN Q├────(S)──
│ PT T#5s │
└──────────┘
// 故障锁存
bTimeout bFault
──┤ ├─────────────────────(S)──
bFault bCommandActive
──┤/├─────────────────────(R)──
// 故障复位
bReset bFault
──┤ ├─────────────────────(R)──
bFault bTimeout
──┤/├─────────────────────(R)──
工程示例
示例 1:三相电机控制
功能:带过载保护的三相电机启动/停止,含运行指示和运行计时。
// === 电机控制 ===
// 安全联锁
bEStop bSafetyGate bSafetyOK
──┤/├────────┤/├─────────────────( )──
// 启动/停止
bStart bStop bMotorRun
──┤ ├────────┤/├────┬────────────(S)──
│
bMotorRun │
──┤ ├────────────────┘
// 过载保护
bOverload bMotorRun
──┤/├─────────────────────(R)──
// 输出到接触器(串联安全联锁)
bMotorRun bSafetyOK bContactor
──┤ ├────────┤ ├─────────────────( )──
// 运行指示
bMotorRun bRunLight
──┤ ├────────────────────────────( )──
// 运行计时
bMotorRun ┌─ TON ────┐ bRunHourReached
──┤ ├────────┤ IN Q├───────( )──
│ PT T#8h │
└──────────┘
示例 2:传送带报警系统
功能:传送带过载、跑偏、堵料三级报警。
// === 报警逻辑 ===
// 过载报警 (rCurrent > 15.0A)
bEnable ┌─ GT ───┐ bAlarmOverload
──┤ ├───────┤ rCurrent├───────────(S)──
│ 15.0 │
└────────┘
// 跑偏检测 (传感器持续 2s 触发)
bMisalign ┌─ TON ────┐ bAlarmMisalign
──┤ ├─────────┤ IN Q├──────(S)──
│ PT T#2s │
└──────────┘
// 堵料检测 (电机运行但无物料通过超过 10s)
bMotorRun bPartDetect bJamDelay
──┤ ├────────┤/├─────────────────(S)──
bJamDelay ┌─ TON ────┐ bAlarmJam
──┤ ├─────────┤ IN Q├──────(S)──
│ PT T#10s │
└──────────┘
// 报警复位
bReset bAlarmOverload
──┤ ├──────────────────────────(R)──
bReset bAlarmMisalign
──┤ ├──────────────────────────(R)──
bReset bAlarmJam
──┤ ├──────────────────────────(R)──
// 蜂鸣器(任一报警激活)
bAlarmOverload bBuzzer
──┤ ├────────────────────────────( )──
bAlarmMisalign
──┤ ├──
bAlarmJam
──┤ ├──
示例 3:气动阀门顺序控制
功能:双气缸顺序动作——A 缸伸出→B 缸伸出→B 缸退回→A 缸退回。
// === 双气缸顺序控制 ===
// Step 1: A 缸伸出
bCycleStart bStep4Done bStep1
──┤ ├────────┤/├──────────────────(S)──
bStep1 bAExtEnd bStep2
──┤ ├────────┤ ├────┬─────────────(S)──
│
bStep1 (R)──
// Step 2: B 缸伸出
bStep2 bBExtEnd bStep3
──┤ ├────────┤ ├────┬─────────────(S)──
│
bStep2 (R)──
// Step 3: B 缸退回
bStep3 bBRetEnd bStep4
──┤ ├────────┤ ├────┬─────────────(S)──
│
bStep3 (R)──
// Step 4: A 缸退回
bStep4 bARetEnd bCycleDone
──┤ ├────────┤ ├────┬─────────────(S)──
│
bStep4 (R)──
// 输出映射
bStep1 bAExtend
──┤ ├────────────────────────────( )──
bStep2 bBExtend
──┤ ├────────────────────────────( )──
bStep3 bBRetract
──┤ ├────────────────────────────( )──
bStep4 bARetract
──┤ ├────────────────────────────( )──
示例 4:PID 手自动无扰切换
功能:PID 回路的手动/自动模式切换,带输出跟踪防止切换扰动。
// === PID 手自动切换 ===
// 手动模式
bManual bAutoMode
──┤ ├──────────────────────────(R)──
bManual bManualMode
──┤ ├──────────────────────────(S)──
// 自动模式
bAuto bAutoMode
──┤ ├──────────────────────────(S)──
bAuto bManualMode
──┤ ├──────────────────────────(R)──
// 手动模式:输出跟随手动设定
bManualMode bOutput
──┤ ├────┬─────────────────────( )──
│
bManualSet
──┤MOVE├─┘
// 自动模式:输出来自 PID 输出
bAutoMode ┌─ MOVE ─┐ bOutput
──┤ ├────────┤ pidOut ├────────( )──
│ │
└─────────┘
安全回路设计
急停回路
急停按钮应采用常闭触点串联,断线检测优先:
// 急停链 — 所有急停串联
bES1 bES2 bES3 bES_ChainOK
──┤/├───────┤/├───────┤/├─────────────────( )──
// 急停状态指示
bES_ChainOK bES_Normal
──┤ ├─────────────────────────────────────( )──
安全门监控
// 安全门关闭 + 门锁确认
bDoorClosed bDoorLocked bDoorOK
──┤ ├─────────┤ ├──────────────────────( )──
// 门未关报警(延时确认,防抖动)
bDoorOK ┌─ TON ────┐ bDoorAlarm
──┤/├────────┤ IN Q├──────────────(S)──
│ PT T#1s │
└──────────┘
双手启动
// 双手按钮同时按下 0.5s 内启动
bHandLeft bHandRight ┌─ TON ────┐ bStartOK
──┤ ├───────┤ ├──────────┤ IN Q├──( )──
│ PT T#500ms│
└──────────┘
性能优化建议
- 梯级数量控制:单个 POU 梯级不超过 50 级,超过则拆分子程序
- 减少分支嵌套:分支深度不超过 4 层,过深影响扫描效率
- 避免空梯级:空梯级浪费扫描时间,及时清理
- 使用 MOVE 代替多个线圈:需要同时赋多个值的场景,考虑用 MOVE 块一次赋值
- 定时器 PT 不要频繁修改:PT 值变化需重新初始化定时器
- 高速任务用 SCL:1ms 以下周期任务建议用 SCL 替代 LAD
常见反模式
| 反模式 | 问题 | 正确做法 |
|---|---|---|
| 线圈双向驱动 | 同一线圈在多个梯级赋值 | 合并到一个梯级或用 S/R |
| 空线圈悬空 | 线圈未绑定变量 | 确认每个线圈都有有效变量 |
| 触点直接连母线 | 左母线直连右母线,短路 | 加中间变量或空线圈 |
| 定时器嵌套过深 | 定时器输出再驱动定时器 | 用顺序逻辑替代嵌套 |
| 分支未闭合 | 分支有头无尾 | 确保分支汇合到公共路径 |
| 跳转滥用 | JMP 满天飞,逻辑不连续 | 用 S/R 顺序控制替代 |
| 变量类型混用 | INT 直接连 BOOL 输入 | 用比较块转换 |