2. Modbus TCP从站无响应的抓包定位

抓包前的拓扑与镜像点确认

灭菌釜PLC轮询超时的现象,可能是请求根本没到PLC,也可能是PLC回了异常码,还可能是回程丢包。要区分这三类,必须让抓包点同时看到“SCADA发出的请求”和“PLC返回的响应”。最稳妥的做法是在SCADA站与灭菌釜PLC之间的接入交换机上配置端口镜像:源端口选PLC所连端口(双向),目的端口接抓包笔记本,这样请求与响应都在同一份pcap里,时间戳可直接对齐。

本例的示例拓扑:SCADA服务器(192.168.10.20)经接入交换机SW-2的Gi0/5口连接灭菌釜PLC(192.168.10.51,Modbus TCP端口502),交换机Gi0/12口接抓包机(192.168.10.200)。镜像源为Gi0/5双向,目的为Gi0/12。抓包机网卡关闭“大量卸载”类特性以免时间戳失真,过滤器设为 tcp port 502。

SCADA 服务器 192.168.10.20 轮询周期 1 s / 超时 800 ms 接入交换机 SW-2 Gi0/5 源 Gi0/12 目的 镜像:Gi0/5 双向 → Gi0/12 过滤器:tcp port 502 请求与响应同点采集,时间戳可对齐 灭菌釜 PLC 192.168.10.51 Modbus TCP : 502 抓包机 192.168.10.200 Wireshark / tcpdump 镜像副本 三类原因判读 A 请求未到达:无发往502的SYN/请求 B 异常码回复:功能码最高位置1 C 网络丢包:请求有、响应缺/重传 先看请求是否存在,再看响应内容 锁定设备 A → 查SCADA路由/ACL/端口 B → 查PLC寄存器映射与权限 C → 查链路误码/交换机拥塞 用响应时间与重传次数佐证

抓包与三类原因的判读方法

抓包时长至少覆盖3个轮询周期(本例约5 s),保存为 modbus_timeout.pcapng。判读顺序固定为“先请求、后响应”,避免被超时告警误导。

  1. 确认请求是否发出并到达。过滤 ip.addr==192.168.10.51 && tcp.port==502。若抓包点能看到SCADA→PLC的请求帧(MBAP头事务标识递增、功能码如0x03),说明请求已进入交换机;若连SYN都没有,问题在SCADA侧(路由、网卡、ACL)或镜像配置错误。
  2. 看响应内容而非只看有无。正常响应为功能码原值(如0x03)+字节数+数据。若功能码变为 0x83(0x03|0x80),紧跟1字节异常码:0x02非法数据地址、0x03非法数据值、0x04从站设备故障、0x06从站忙。这类属于“从站异常码回复”,网络是通的,故障在PLC侧映射或从站状态。
  3. 识别丢包特征。请求存在但响应缺失,且出现TCP重传(Wireshark标红 TCP Retransmission)、重复ACK或响应时间抖动超过轮询超时,则归为网络丢包。此时对比请求与响应的帧序号缺口,可判断丢在去程还是回程。
判读口诀:有请求无响应看丢包,有响应看功能码,无请求查SCADA与镜像。三类原因对应三个不同的责任设备,先分类再定位,能避免在PLC上盲目改程序。

示例判读与设备锁定

假设抓包结果如下(示例数据,用于说明判读逻辑):5 s内SCADA发出5个事务标识为0x0101~0x0105的读保持寄存器请求,其中0x0101、0x0102收到正常响应(功能码0x03,返回2字节温度值),0x0103收到 83 02 异常码,0x0104、0x0105无任何响应且伴随两次TCP重传。

事务标识请求响应判读责任设备
0x010103 00 00 00 0203 04 数据正常—
0x010303 00 64 00 0283 02非法数据地址PLC寄存器映射
0x0104/0503 00 00 00 02无回程丢包/重传交换机Gi0/5链路

结论:本例同时存在两类问题——地址0x0064超出PLC映射范围导致异常码0x02,以及Gi0/5端口链路误码导致间歇丢包。处理动作分别是核对PLC寄存器表修正SCADA通道起始地址,以及检查该端口光模块/网线误码计数(show interfaces Gi0/5 看CRC与input errors)。修复后重新抓包,确认5个事务全部收到功能码0x03响应且无重传,即闭环。

镜像端口带宽不足时会丢弃副本,造成“假丢包”。抓包前确认目的端口速率不低于源端口峰值流量,且抓包机网卡未开启节能卸载,否则时间戳与丢包判断都会失真。