4. Modbus RTU转TCP网关通信中断的排障

故障场景与排查对象

包装线上一台灌装称重仪表通过 RS-485 接入串口服务器(Modbus RTU 转 Modbus TCP 网关),SCADA 以 Modbus TCP 轮询该仪表。现象是:SCADA 通道间歇性断连,每次持续数秒到数十秒后自动恢复,夜间和换班时段更频繁,白天生产高峰偶尔出现。仪表本地显示正常,说明仪表本身未死机;同一网关的另一路串口(接贴标机)未报断连,说明网关整机与 SCADA 网络大体正常。因此排查重点落在该串口的 RTU 参数、网关 TCP 连接保持策略、超时与重试设置三处。

灌装称重仪表 Modbus RTU 从站 地址 1 · 9600 8N1 RS-485 两线 A/B 差分 串口服务器网关 RTU ⇄ TCP 协议转换 串口 1:称重仪表 串口 2:贴标机(正常) IP 192.168.10.21:502 以太网 TCP Modbus TCP SCADA 采集站 轮询周期 500 ms 超时 1000 ms · 重试 2 排查点 A:串口参数 波特率 / 数据位 / 校验 / 停止位 从站地址、帧间隔(3.5 字符) 校验方式不一致 → CRC 错、丢帧 表现为间歇超时而非彻底不通 排查点 B:TCP 连接保持 网关空闲超时(Idle Timeout) Keep-Alive 是否启用及间隔 多主站/多连接数上限 空闲被网关主动断开 → 重连抖动 排查点 C:超时与重试 SCADA 响应超时 vs 网关转换延时 重试次数与重试间隔 超时过短 → 误判断连 重试叠加 → 串口队列堆积 RTU 转 TCP 链路与三处排查点 仪表本地正常 + 另一串口正常 ⇒ 聚焦本串口参数、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结论
波特率96009600一致
数据位88一致
校验偶校验 E无校验 N不一致,需改为 E
停止位11一致
从站地址11一致
帧间隔—默认 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 实际并发连接数,避免新连接挤掉旧连接。
若网关不支持关闭空闲超时,可在 SCADA 侧增加一个低频“心跳读”(如每 20 s 读一次状态寄存器),用业务报文维持连接,比依赖底层 Keep-Alive 更可控。

第四步:校准超时与重试(排查点 C)

RTU 经网关转换会引入额外延时:一次 9600 bps 的 8 字节请求加 7 字节应答,串口传输本身约 16 ms,加上网关内部排队与转换,正常往返通常在几十毫秒量级。若 SCADA 超时设为 1000 ms 一般足够;但若重试次数多、轮询周期短,串口队列会堆积,反而拉长应答时间。建议:

  1. 用抓包或网关日志测出正常往返时间(P95),超时值取其 3~5 倍。
  2. 重试次数先降为 1,观察是否仍有断连;若断连消失,说明此前是重试叠加造成的队列拥塞。
  3. 确认 SCADA 轮询周期大于“单次往返 × (1 + 重试次数)”,否则请求会持续排队。

整改后的验证与判据

三项改完后,按以下判据确认根因已消除,而不是被掩盖:

  • 网关串口 CRC 错误计数在 30 分钟内不增长。
  • 网关连接日志在换班停机时段不再出现空闲断开记录。
  • SCADA 通道连续运行 2 小时无断连告警,且采集值刷新正常。
  • 抓包中请求—应答往返时间稳定,无持续增长的排队迹象。
若只调大 SCADA 超时而不修串口校验,CRC 错误仍会存在,只是被更长的等待掩盖,生产高峰时仍会复发。参数一致性必须先解决。