4. Modbus RTU转TCP网关通信中断的排障
故障场景与排查对象
包装线上一台灌装称重仪表通过 RS-485 接入串口服务器(Modbus RTU 转 Modbus TCP 网关),SCADA 以 Modbus TCP 轮询该仪表。现象是:SCADA 通道间歇性断连,每次持续数秒到数十秒后自动恢复,夜间和换班时段更频繁,白天生产高峰偶尔出现。仪表本地显示正常,说明仪表本身未死机;同一网关的另一路串口(接贴标机)未报断连,说明网关整机与 SCADA 网络大体正常。因此排查重点落在该串口的 RTU 参数、网关 TCP 连接保持策略、超时与重试设置三处。
第一步:先确认断连发生在哪一段
不要一上来就改参数。先在 SCADA 侧和网关侧同时观察,把“断连”拆成三种可能:RTU 侧丢帧(网关收不到仪表应答)、TCP 侧被断开(网关或 SCADA 主动关连接)、SCADA 判超时(报文其实到了但回得慢)。判断依据如下:
- 网关的串口统计里若 CRC 错误数 / 帧错误数 持续增长,而 TCP 连接日志无断开记录,则问题在 RTU 侧(排查点 A)。
- 网关连接日志出现周期性 “connection closed by peer / idle timeout”,且断开时刻与 SCADA 报断连时刻吻合,则问题在 TCP 保持策略(排查点 B)。
- 抓包看到请求与应答都在,但应答到达时间接近或超过 SCADA 超时值,则问题在超时设置(排查点 C)。
本例的现场记录是:网关串口统计中 CRC 错误缓慢增长(约每小时几十次),同时连接日志在换班停机时段出现空闲断开。也就是说 A 与 B 同时存在,需要分别处理。
第二步:核对串口参数(排查点 A)
把仪表铭牌/菜单里的通信参数与网关串口 1 的设置逐项对齐。常见不一致点:仪表为 9600 8E1(偶校验),网关却配成 9600 8N1;或仪表地址被改过而网关仍用旧地址。参数不一致时并非完全不通,而是部分帧校验失败,正好表现为间歇性超时。
| 参数 | 仪表侧 | 网关串口 1 | 结论 |
|---|---|---|---|
| 波特率 | 9600 | 9600 | 一致 |
| 数据位 | 8 | 8 | 一致 |
| 校验 | 偶校验 E | 无校验 N | 不一致,需改为 E |
| 停止位 | 1 | 1 | 一致 |
| 从站地址 | 1 | 1 | 一致 |
| 帧间隔 | — | 默认 3.5 字符 | 保持默认 |
将网关串口 1 改为 9600 8E1 并保存重启串口后,CRC 错误计数应停止增长。验证方法:连续观察 10 分钟,CRC 错误数保持不变即通过。
第三步:检查 TCP 连接保持策略(排查点 B)
网关默认空闲超时往往较短(如 30 s 或 60 s)。换班停机时 SCADA 若暂停轮询,连接空闲超过该值就被网关关闭;恢复生产后 SCADA 重新建连,期间的数据点被判为断连。处理方式二选一或并用:
- 把网关的 Idle Timeout 调大到大于最长停机空闲时间(例如 600 s),或设为 0 表示不主动断开(以设备手册为准)。
- 启用 TCP Keep-Alive,间隔设为 30 s,让连接在空闲期也有保活报文,避免被中间设备或网关回收。
- 同时确认网关允许的最大连接数不小于 SCADA 实际并发连接数,避免新连接挤掉旧连接。
第四步:校准超时与重试(排查点 C)
RTU 经网关转换会引入额外延时:一次 9600 bps 的 8 字节请求加 7 字节应答,串口传输本身约 16 ms,加上网关内部排队与转换,正常往返通常在几十毫秒量级。若 SCADA 超时设为 1000 ms 一般足够;但若重试次数多、轮询周期短,串口队列会堆积,反而拉长应答时间。建议:
- 用抓包或网关日志测出正常往返时间(P95),超时值取其 3~5 倍。
- 重试次数先降为 1,观察是否仍有断连;若断连消失,说明此前是重试叠加造成的队列拥塞。
- 确认 SCADA 轮询周期大于“单次往返 × (1 + 重试次数)”,否则请求会持续排队。
整改后的验证与判据
三项改完后,按以下判据确认根因已消除,而不是被掩盖:
- 网关串口 CRC 错误计数在 30 分钟内不增长。
- 网关连接日志在换班停机时段不再出现空闲断开记录。
- SCADA 通道连续运行 2 小时无断连告警,且采集值刷新正常。
- 抓包中请求—应答往返时间稳定,无持续增长的排队迹象。