- 1. 为什么用 Wireshark 分析 Modbus?
- 2. Wireshark 对 Modbus protocol的支持
- 3. 安装 Wireshark
- 4. Linux(Ubuntu/Debian)
- 5. Windows
- 6. macOS
- 7. 抓取 Modbus TCP message
- 8. Linux 服务器端抓包
- 9. Windows 端直接抓包
- 10. Modbus TCP message详解
- 11. Wireshark 显示过滤器技巧
- 12. 实战案例:用 Wireshark 排查 Modbus 通信故障
- 13. 案例1:读不到data——从站无Response
- 14. 案例2:返回Exception Code 02(Illegal data address)
- 15. 案例3:data值异常——endianness问题
- 16. 抓取 Modbus RTU(串口)message
- 17. 方案1:USB 转串口 + USBPcap
- 18. 方案2:串口监控软件
- 19. 方案3:在 RTU 转 TCP 网关上抓包
- 20. Wireshark Modbus 分析进阶技巧
- 21. 统计分析:I/O 图表
- 22. View完整的 TCP 流
- 23. export Modbus data
- 24. 总结
为什么用 Wireshark 分析 Modbus?
Wireshark 是全球最流行的开源网络协议分析器,由 Gerald Combs 于 1998 年创建,现由 Wireshark 基金会维护。官网 www.wireshark.org。它内置了完整的 Modbus TCP 协议Parse器(dissector),可以自动识别和Parse Modbus TCP message中的 MBAP 头、function code、data area和Exception Code。对于 Modbus RTU message,Wireshark 也可以通过 USB 转串口适配器或远程抓包的方式进行分析。
在Automation的debug现场,最常见的痛点就是”通信不通但不知道为什么”。Wireshark 能让你看到总线上的每一帧data——Request发了什么、Response回了什么、超时发生在哪个环节、Exception Code是什么——把看不见的通信过程变成可追踪的证据链。
Wireshark 对 Modbus protocol的支持
Wireshark 的 Modbus protocolParse器位于 epan/dissectors/packet-modbus.c,能够自动识别以下内容:
- Modbus/TCP:默认端口 502,自动识别 MBAP 头(Transaction ID、Protocol ID、Length、Unit ID)和各function code的 PDU
- function codeParse:FC01-FC06、FC15-FC16、FC23 等常用function code的Request和Responseformat
- Exception Code:自动标注Exception Response,并显示Exception Code含义(01=Illegal function、02=Illegal data address、03=Illegal data value、04=Substation equipment malfunction等)
- Modbus RTU over TCP:部分网关将 RTU 帧封装在 TCP 中传输,Wireshark 也能Parse
安装 Wireshark
Linux(Ubuntu/Debian)
sudo apt-get update
sudo apt-get install wireshark
# 允许非 root 用户抓包
sudo usermod -a -G wireshark $USER
# 注销后重新Login生效
Windows
从 官网Download页面 Download Windows 安装包。安装时需勾选 Npcap(Windows 抓包驱动)和 USBPcap(如需抓 USB 转serial data )。
macOS
brew install --cask wireshark
抓取 Modbus TCP message
Linux 服务器端抓包
如果 Modbus TCP 通信发生在 Linux 服务器或网关上,直接用 tcpdump 抓包效率最高:
# 抓取所有目标端口为 502 的 TCP message(Modbus TCP 默认端口)
sudo tcpdump -i eth0 -w modbus_capture.pcap 'tcp port 502'
# 只抓指定 IP 设备的通信
sudo tcpdump -i eth0 -w modbus_capture.pcap 'host 192.168.1.100 and tcp port 502'
# 按 Ctrl+C 停止抓包
# 将 .pcap 文件传输到有 Wireshark 的电脑上分析
Windows 端直接抓包
打开 Wireshark,选择与目标设备通信的网卡(如以太网卡或 Wi-Fi),在 Capture Filter 中输入 tcp port 502,点击开始抓包。此时运行你的 Modbus 主站程序(如 Modbus Poll),即可捕获到完整的 Modbus TCP 通信过程。
Modbus TCP message详解
在 Wireshark 中选中一条 Modbus TCP message,展开 “Modbus/TCP” 层。一个典型的读保持registerRequestmessage结构如下:
| field | byte count | 示例值 | 说明 |
|---|---|---|---|
| Transaction ID | 2 | 0x0001 | Transaction identifier,客户端自增,服务端原样返回 |
| Protocol ID | 2 | 0x0000 | 协议标识,Modbus 固定为 0 |
| Length | 2 | 0x0006 | 后续byte count(Unit ID + PDU) |
| Unit ID | 1 | 0x01 | slave address(Slave ID) |
| Function Code | 1 | 0x03 | function code(03=读保持register) |
| Starting Address | 2 | 0x0000 | Starting register address |
| Quantity | 2 | 0x000A | Reading quantity(10个) |
对应的Responsemessage包含同样的 MBAP 头 + function code 0x03 + byte计数 0x14(20byte=10个register)+ data area。
Wireshark 显示过滤器技巧
显示过滤器(Display Filter)用于在已抓取的message中快速筛选目标data。以下是常用的 Modbus Related过滤器:
# 筛选所有 Modbus protocolmessage
modbus
# 筛选指定function code(如 03 读保持register)
modbus.func_code == 3
# 筛选Exception Response
modbus.exception_code
# 筛选指定slave address
modbus.unit_id == 1
# 筛选包含异常的message
modbus.exception_code != 0
# 组合过滤:从站 1 的function code 16(写多register)
modbus.unit_id == 1 and modbus.func_code == 16
# 按 IP address和 Modbus function code过滤
ip.addr == 192.168.1.100 and modbus.func_code == 3
# 只看 MBAP 头 Transaction ID 为 5 的Request-Response对
modbus.trans_id == 5
实战案例:用 Wireshark 排查 Modbus 通信故障
案例1:读不到data——从站无Response
抓包后发现只有Request帧没有Response帧(或出现 TCP RST/重传),说明从站设备没有正确Response。检查方法:
- Confirm TCP 端口(默认 502)在从站设备上已开放
- 检查slave address(Unit ID)是否与Request中的一致
- View是否有 TCP 层异常(重传、RST),如有则说明网络层有问题
案例2:返回Exception Code 02(Illegal data address)
Wireshark 可以看到Starting address in the request + quantity超出了从站的register范围。在 Wireshark 中右键点Requestmessage → “Follow → TCP Stream”,可以看到完整的Request和Exception Response对话。
案例3:data值异常——endianness问题
读取到的 32 位浮点数在 Wireshark 中显示正常,但在主站程序中显示为 NaN 或极大值。这说明通信层没问题,是主站程序的endiannessParse有误。可以在 Wireshark 中手动计算验证:右键register data → “Copy → Value” 获取hexadecimal原始值,用 IEEE 754 计算器在线验证。
抓取 Modbus RTU(串口)message
Modbus RTU 通过 RS-232 或 RS-485 物理层传输,不能直接用 Wireshark 抓取。常见方案:
方案1:USB 转串口 + USBPcap
在 Windows 上安装 USBPcap(Wireshark 安装时可选组件),可以抓取 USB 转串口设备上的raw data。但需要自行Parse RTU 帧(address + function code + data + CRC)。
方案2:串口监控软件
Recommended for use专门的串口监控Tools:
- Serial Port Monitor(Windows 商业软件):可直接监控和Parse Modbus RTU 帧
- CAS Modbus RTU Parser:freeOnline Tools,粘贴hexadecimalbyte自动Parse
- PortMon(Windows free):微软出品的底层串口监控Tools
方案3:在 RTU 转 TCP 网关上抓包
如果现场使用了串口服务器(如 MOXA NPort),可以在 TCP 侧用 Wireshark 抓包,message内容即为 RTU 帧。
Wireshark Modbus 分析进阶技巧
统计分析:I/O 图表
菜单 → Statistics → I/O Graph,设置过滤器为 modbus,可以观察到 Modbus 通信的频率和time分布。如果发现周期性尖峰或间隙,可能是轮询参数配置不当。
View完整的 TCP 流
右键任意 Modbus TCP message → Follow → TCP Stream,可以View一次完整 TCP connect中所有 Modbus Request和Response的raw data。这是排查”读取data错位”问题的利器。
export Modbus data
File → Export Packet Dissections → As CSV,可以将所有解码后的 Modbus messageexport为 CSV format,方便用 Excel 或 Python 进行批量分析。
总结
Wireshark 是 Modbus protocoldebug中不可替代的Tools。它能够将”看不见”的通信过程可视化,帮助工程师精准定位问题发生在协议栈的哪一层——是 TCP connect建立失败、MBAP 头fieldError、function code不匹配、register address越界还是dataendiannessParseError。对于任何从事 Modbus 通信开发和debug的工程师,掌握 Wireshark 抓包分析是必备技能。
发表回复