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。
抓包与三类原因的判读方法
抓包时长至少覆盖3个轮询周期(本例约5 s),保存为 modbus_timeout.pcapng。判读顺序固定为“先请求、后响应”,避免被超时告警误导。
- 确认请求是否发出并到达。过滤
ip.addr==192.168.10.51 && tcp.port==502。若抓包点能看到SCADA→PLC的请求帧(MBAP头事务标识递增、功能码如0x03),说明请求已进入交换机;若连SYN都没有,问题在SCADA侧(路由、网卡、ACL)或镜像配置错误。 - 看响应内容而非只看有无。正常响应为功能码原值(如0x03)+字节数+数据。若功能码变为
0x83(0x03|0x80),紧跟1字节异常码:0x02非法数据地址、0x03非法数据值、0x04从站设备故障、0x06从站忙。这类属于“从站异常码回复”,网络是通的,故障在PLC侧映射或从站状态。 - 识别丢包特征。请求存在但响应缺失,且出现TCP重传(Wireshark标红 TCP Retransmission)、重复ACK或响应时间抖动超过轮询超时,则归为网络丢包。此时对比请求与响应的帧序号缺口,可判断丢在去程还是回程。
示例判读与设备锁定
假设抓包结果如下(示例数据,用于说明判读逻辑):5 s内SCADA发出5个事务标识为0x0101~0x0105的读保持寄存器请求,其中0x0101、0x0102收到正常响应(功能码0x03,返回2字节温度值),0x0103收到 83 02 异常码,0x0104、0x0105无任何响应且伴随两次TCP重传。
| 事务标识 | 请求 | 响应 | 判读 | 责任设备 |
|---|---|---|---|---|
| 0x0101 | 03 00 00 00 02 | 03 04 数据 | 正常 | — |
| 0x0103 | 03 00 64 00 02 | 83 02 | 非法数据地址 | PLC寄存器映射 |
| 0x0104/05 | 03 00 00 00 02 | 无 | 回程丢包/重传 | 交换机Gi0/5链路 |
结论:本例同时存在两类问题——地址0x0064超出PLC映射范围导致异常码0x02,以及Gi0/5端口链路误码导致间歇丢包。处理动作分别是核对PLC寄存器表修正SCADA通道起始地址,以及检查该端口光模块/网线误码计数(show interfaces Gi0/5 看CRC与input errors)。修复后重新抓包,确认5个事务全部收到功能码0x03响应且无重传,即闭环。