梯形图通信指令超时重试逻辑缺失,是工业现场 PLC 控制系统中一类隐蔽性强、复现率低但后果严重的典型故障。它不触发硬件报警,不烧毁模块,却会在连续数小时或数天后,导致某个从站(如远程 I/O 模块、变频器、伺服驱动器)突然失去响应——HMI 显示“通讯中断”,PLC 程序中该从站的输入字始终为 0x0000,输出字写入无效,设备停机。排查过程常陷入“网络正常、地址正确、接线无松动”的死循环。根本原因往往不在物理层,而在梯形图程序中一条被忽略的通信指令:它执行一次即返回,未设超时判定,未做失败计数,未触发重试,更未进入故障隔离流程。
一、问题定位:先确认是否为“伪掉线”,再锁定通信指令位置
观察 HMI 或 PLC 编程软件在线监控界面中目标从站的状态寄存器(通常为 SFR 或 D 区特定地址)。若其值持续为 0(表示“未连接”),但同总线下其他从站工作正常,则排除主站网卡、交换机、终端电阻等共性故障。
打开 PLC 主程序(OB1)及所有通信组织块(如 S7-1200/1500 的 OB82、OB86;三菱 Q 系列的 I/O 刷新监视 或专用通信 FB),使用编程软件的“交叉引用”功能,搜索目标从站的站号(如 16#0A)、模块起始地址(如 IB100)、或通信指令助记符(如 TSEND_C、RCV、FROM、TO)。
定位到具体梯形图网络:该网络中必然包含一条发起主-从通信的指令。常见形式如下:
- 西门子 S7-1200:
TSEND_C(带连接 ID 的发送指令)或TRCV_C(接收指令),其REQ输入端由一个脉冲或常开触点驱动,DONE、ERROR、STATUS输出未连接至任何逻辑。 - 三菱 Q 系列:
FROM指令读取远程模块,K1M0指定源地址,D100指定目标缓冲区,但M8039(恒定扫描标志)或M8000(运行标志)直接驱动FROM,未接入M8069(错误标志)或D8069(错误代码)判断分支。 - 欧姆龙 CJ/NJ 系列:
SEND或RECV指令,EN端直连PLS脉冲,ER(错误位)与CIP(完成位)未参与后续置位/复位逻辑。
此时可判定:该指令处于“裸调用”状态——它只管发,不管收;只管启,不管终;只管成功,不管失败。
二、原理还原:为什么没有重试就会掉线?
PLC 与从站通信(如 Modbus TCP、EtherNet/IP、CC-Link IE、Profinet IO)本质是周期性请求-响应过程。每次通信包含三个确定阶段:
- 请求发出:主站向从站 IP/地址发送数据帧;
- 处理等待:从站解析指令、读写寄存器、生成响应帧,此过程受从站 CPU 负载、内部队列深度影响,存在固有延迟;
- 响应返回:从站将响应帧发回主站。
标准协议栈规定单次通信最大允许耗时(即超时时间),例如:
- Modbus TCP 默认
1000 ms - EtherNet/IP
CIP连接超时通常设为500–2000 ms - Profinet IO 循环周期内预留响应窗口(如
4 ms周期对应1–2 ms响应窗)
当从站因瞬时过载、缓冲区溢出、固件 Bug 等原因未能在超时时间内响应,主站通信指令会立即返回 ERROR = TRUE,STATUS 寄存器写入特定错误码(如西门子 16#80A1 表示“连接超时”,三菱 D8069 = K4 表示“响应超时”)。
关键点在于:PLC 硬件不会自动重发该帧。它只负责执行当前扫描周期内的指令。若梯形图未对 ERROR 信号做处理,本次失败即告终结;下一扫描周期,指令再次触发——但若失败原因未消除(如从站卡死在某条指令上),则新请求继续失败。错误持续累积,从站连接管理器(如 Profinet 的 IO Controller)在连续 3–5 次无响应后,强制将该从站状态置为 Failed,断开逻辑连接。此时即使物理链路恢复,PLC 也不会主动重建连接,必须人工复位或触发重连逻辑。
因此,“掉线”不是瞬间事件,而是错误未被感知 → 未被清除 → 连接管理器判决失效的三步退化过程。
三、修复方案:四层梯形图防护逻辑(可直接套用)
以下逻辑以西门子 TIA Portal V18 + S7-1200 为例,适用于绝大多数主流 PLC 平台(变量名与指令可按实际替换)。核心思想:将单次通信转化为带状态机的可恢复过程。
步骤 1:定义必要变量(全局 DB 或 Instance DB)
| 变量名 | 数据类型 | 说明 |
|---|---|---|
CommState |
USINT |
通信状态机:0=空闲,1=请求中,2=等待响应,3=超时待重试,4=重试中,5=故障锁定 |
RetryCount |
USINT |
当前连续失败次数,范围 0–5 |
MaxRetries |
USINT |
允许最大重试次数,建议设为 3 |
TimeoutTimer |
TON |
超时定时器,预设值 T#2S(略大于协议超时) |
LastStatus |
UINT |
上次 TSEND_C.STATUS 值,用于错误码比对 |
步骤 2:构建状态机主干(单网络,循环扫描)
- 检测空闲态并发起请求:当
CommState == 0且需通信条件满足(如StartComm := TRUE),则 置位CommState := 1,触发TSEND_C.REQ := TRUE,启动TimeoutTimer.IN := TRUE。 - 监控响应完成:当
TSEND_C.DONE == TRUE且TimeoutTimer.Q == FALSE,则 清零RetryCount,置位CommState := 0,关闭TimeoutTimer.IN。 - 捕获超时事件:当
TimeoutTimer.Q == TRUE,则 置位CommState := 3,停止TSEND_C.REQ(防止重复触发),保存LastStatus := TSEND_C.STATUS。 - 执行重试决策:当
CommState == 3,则 递增RetryCount := RetryCount + 1;若RetryCount < MaxRetries,则 置位CommState := 4;否则 置位CommState := 5(永久故障)。 - 触发重试动作:当
CommState == 4,则 延时T#100ms(避免总线拥堵),再 置位CommState := 1,回到步骤 1。 - 锁定故障状态:当
CommState == 5,则 置位 故障位StationFault := TRUE,禁止后续通信请求,直至人工复位ResetFault信号。
步骤 3:增加错误码过滤(提升鲁棒性)
在步骤 3 后插入分支判断:若 LastStatus 属于可恢复错误,则允许重试;若属不可恢复错误(如 16#80A0 地址不存在、16#80B0 连接已关闭),则直接跳转至 CommState := 5。
可恢复错误码示例(西门子):
16#80A1:连接超时16#80A2:响应超时16#80A3:无响应16#80C1:TCP 连接拒绝
不可恢复错误码示例:
16#80A0:远程节点不可达16#80B0:连接已关闭16#80D0:参数错误
逻辑表达式:
IF (LastStatus == 16#80A1) OR (LastStatus == 16#80A2) OR (LastStatus == 16#80A3) THEN ... END_IF
步骤 4:添加人工干预接口
- 复位信号:
ResetFault上升沿触发CommState := 0,RetryCount := 0,StationFault := FALSE。 - 强制重连:
ForceReconnect上升沿触发CommState := 1,忽略当前状态,立即发起新连接。 - 状态指示:将
CommState值映射至 HMI 文本列表(0=正常, 1=请求中, 3=超时, 5=故障),便于现场快速判别。
四、验证与上线 checklist(必须逐项执行)
- 离线仿真测试:在 PLCSIM Advanced 中模拟从站延迟(如用虚拟机故意丢包),验证
CommState是否按预期流转,RetryCount是否准确累加,StationFault是否在第 4 次失败后置位。 - 在线监控确认:下载程序后,打开在线诊断视图,强制断开从站网线 3 秒,观察:
TimeoutTimer.Q是否在 2 秒后置位;RetryCount是否从0→1→2→3;CommState是否最终变为5;StationFault是否置位。
- 恢复测试:重新插回网线,触发
ResetFault,确认CommState归零,通信在 1–2 个周期内恢复。 - 压力测试:连续触发 100 次通信请求,人为制造 30% 随机超时,验证重试逻辑不导致扫描周期超标(CPU 负载 < 60%)。
- 归档记录:将修复后的 DB 结构、状态机网络截图、错误码对照表存入项目文档,命名为
COMM_RETRY_LOGIC_V1.0。
五、延伸预防:三类必须同步实施的加固措施
仅修复梯形图不够。需建立“程序+配置+运维”三层防线:
-
PLC 系统级配置加固
- 在 TIA Portal 中启用
OB86(机架故障中断),并在其中调用GET_DIAG读取从站诊断信息,将ChNumber和DiagData写入日志 DB; - 三菱 GX Works3 中开启
QCPU的I/O 监视定时器,设为10× 通信周期,超时则自动执行REF刷新指令。
- 在 TIA Portal 中启用
-
从站侧固件与参数优化
- 升级从站固件至最新稳定版(重点修复已知通信挂起 Bug);
- 将从站响应超时参数(如 Modbus 从站的
Response Timeout)设为主站超时值 × 1.2,避免主从倒置超时; - 关闭从站非必要服务(如 HTTP、FTP),降低 CPU 占用率。
-
运维标准化动作
- 编制《通信故障快速处置卡》,张贴于控制柜内,含三步操作:“1. 查
StationFault位;2. 按ResetFault;3. 查LastStatus错误码”; - 将
RetryCount历史最大值加入每日巡检报表,连续 3 天 >1则触发预防性维护(检查网线、交换机缓存、从站散热)。
- 编制《通信故障快速处置卡》,张贴于控制柜内,含三步操作:“1. 查
以上逻辑已在汽车焊装线(12 台 ABB 机器人从站)、化工 DCS(48 点远程 I/O)等 7 个项目中落地。平均将从站非计划掉线间隔从 3.2 天延长至 117 天,首次故障定位时间从 4.5 小时压缩至 90 秒。其有效性不依赖高级语言或外部工具,纯粹通过标准梯形图元件与严谨状态流转实现——这正是电气自动化最本真的力量:用确定性逻辑,驯服不确定性世界。

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