为什么用 Wireshark 分析 Modbus?
Wireshark 是全球最流行的오픈소스네트워크프로토콜分析器,由 Gerald Combs 于 1998 年创建,现由 Wireshark 基金会维护。官网 www.wireshark.org。它内置了完整的 Modbus TCP 프로토콜분석器(dissector),可以自动识别和분석 Modbus TCP 프레임中的 MBAP 头、기능 코드、데이터区和异常码。对于 Modbus RTU 프레임,Wireshark 也可以通过 USB 转시리얼 포트适配器或远程抓包的방식进行分析。
在산업 자동화的디버깅现场,最常见的痛点就是"통신不通但不知道为什么"。Wireshark 能让你看到总线上的每一帧데이터——请求发了什么、响应回了什么、超时发生在哪个环节、异常码是什么——把看不见的통신过程变成可追踪的证据链。
Wireshark 对 Modbus 프로토콜的支持
Wireshark 的 Modbus 프로토콜분석器位于 epan/dissectors/packet-modbus.c,能够自动识别以下콘텐츠:
- Modbus/TCP:默认포트 502,自动识别 MBAP 头(Transaction ID、Protocol ID、Length、Unit ID)和各기능 코드的 PDU
- 기능 코드분석:FC01-FC06、FC15-FC16、FC23 等常用기능 코드的请求和响应형식
- 异常码:自动标注异常响应,并显示异常码含义(01=非法功能、02=非法데이터주소、03=非法데이터值、04=슬레이브设备故障等)
- Modbus RTU over TCP:部分게이트웨이将 RTU 帧封装在 TCP 中传输,Wireshark 也能분석
安装 Wireshark
Linux(Ubuntu/Debian)
sudo apt-get update
sudo apt-get install wireshark
# 允许非 root 用户抓包
sudo usermod -a -G wireshark $USER
# 注销后重新로그인生效
Windows
从 官网下载页面 下载 Windows 安装包。安装时需勾选 Npcap(Windows 抓包驱动)和 USBPcap(如需抓 USB 转시리얼 포트데이터)。
macOS
brew install --cask wireshark
抓取 Modbus TCP 프레임
Linux 服务器端抓包
如果 Modbus TCP 통신发生在 Linux 服务器或게이트웨이上,直接用 tcpdump 抓包效率最高:
# 抓取所有目标포트为 502 的 TCP 프레임(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 프레임详解
在 Wireshark 中选中一条 Modbus TCP 프레임,展开 "Modbus/TCP" 层。一个典型的读유지 레지스터请求프레임结构如下:
| 필드 | 바이트数 | 예제值 | 설명 |
|---|---|---|---|
| Transaction ID | 2 | 0x0001 | 트랜잭션 식별자,클라이언트自增,服务端原样返回 |
| Protocol ID | 2 | 0x0000 | 프로토콜标识,Modbus 固定为 0 |
| Length | 2 | 0x0006 | 后续바이트数(Unit ID + PDU) |
| Unit ID | 1 | 0x01 | 슬레이브 주소(Slave ID) |
| 기능 코드 | 1 | 0x03 | 기능 코드(03=读유지 레지스터) |
| Starting 주소 | 2 | 0x0000 | 시작레지스터주소 |
| Quantity | 2 | 0x000A | 읽을 수량(10个) |
对应的响应프레임包含同样的 MBAP 头 + 기능 코드 0x03 + 바이트计数 0x14(20바이트=10个레지스터)+ 데이터区。
Wireshark 显示过滤器技巧
显示过滤器(Display Filter)用于在已抓取的프레임中快速筛选目标데이터。以下是常用的 Modbus 相关过滤器:
# 筛选所有 Modbus 프로토콜프레임
modbus
# 筛选指定기능 코드(如 03 读유지 레지스터)
modbus.func_code == 3
# 筛选异常响应
modbus.exception_code
# 筛选指定슬레이브 주소
modbus.unit_id == 1
# 筛选包含异常的프레임
modbus.exception_code != 0
# 组合过滤:슬레이브 1 的기능 코드 16(写多레지스터)
modbus.unit_id == 1 and modbus.func_code == 16
# 按 IP 주소和 Modbus 기능 코드过滤
ip.addr == 192.168.1.100 and modbus.func_code == 3
# 只看 MBAP 头 Transaction ID 为 5 的请求-响应对
modbus.trans_id == 5
实战案例:用 Wireshark 排查 Modbus 통신故障
案例1:读不到데이터——슬레이브无响应
抓包后发现只有请求帧没有响应帧(或出现 TCP RST/重传),설명슬레이브设备没有正确响应。检查方法:
- 确认 TCP 포트(默认 502)在슬레이브设备上已开放
- 检查슬레이브 주소(Unit ID)是否与요청 내一致
- 보기是否有 TCP 层异常(重传、RST),如有则설명네트워크层有문제
案例2:返回异常码 02(非法데이터주소)
Wireshark 可以看到요청 내시작주소 + 数量超出了슬레이브的레지스터范围。在 Wireshark 中右键点请求프레임 → "Follow → TCP Stream",可以看到完整的请求和异常响应对话。
案例3:데이터值异常——바이트序문제
읽기到的 32 位浮点数在 Wireshark 中显示正常,但在마스터程序中显示为 NaN 或极大值。这설명통신层没문제,是마스터程序的바이트序분석有误。可以在 Wireshark 中手动계산验证:右键레지스터데이터 → "복사 → Value" 获取16진수原始值,用 IEEE 754 계산器在线验证。
抓取 Modbus RTU(시리얼 포트)프레임
Modbus RTU 通过 RS-232 或 RS-485 物理层传输,不能直接用 Wireshark 抓取。常见方案:
方案1:USB 转시리얼 포트 + USBPcap
在 Windows 上安装 USBPcap(Wireshark 安装时可选组件),可以抓取 USB 转시리얼 포트设备上的原始데이터。但需要自行분석 RTU 帧(주소 + 기능 코드 + 데이터 + CRC)。
方案2:시리얼 포트监控软件
推荐使用专门的시리얼 포트监控도구:
- Serial Port Monitor(Windows 商业软件):可直接监控和분석 Modbus RTU 帧
- CAS Modbus RTU Parser:무료온라인 도구,粘贴16진수바이트自动분석
- PortMon(Windows 무료):微软出品的底层시리얼 포트监控도구
方案3:在 RTU 转 TCP 게이트웨이上抓包
如果现场使用了시리얼 디바이스 서버(如 MOXA NPort),可以在 TCP 侧用 Wireshark 抓包,프레임콘텐츠即为 RTU 帧。
Wireshark Modbus 分析进阶技巧
통계分析:I/O 图表
菜单 → Statistics → I/O Graph,设置过滤器为 modbus,可以观察到 Modbus 통신的频率和时间分布。如果发现周期性尖峰或间隙,可能是轮询매개변수설정不当。
보기完整的 TCP 流
右键任意 Modbus TCP 프레임 → Follow → TCP Stream,可以보기一次完整 TCP 연결中所有 Modbus 请求和响应的原始데이터。这是排查"읽기데이터错位"문제的利器。
导出 Modbus 데이터
File → Export Packet Dissections → As CSV,可以将所有解码后的 Modbus 프레임导出为 CSV 형식,方便用 Excel 或 Python 进行批量分析。
总结
Wireshark 是 Modbus 프로토콜디버깅中不可替代的도구。它能够将"看不见"的통신过程可视化,帮助엔지니어링师精准定位문제发生在프로토콜栈的哪一层——是 TCP 연결建立失败、MBAP 头필드错误、기능 코드不일치、레지스터주소越界还是데이터바이트序분석错误。对于任何从事 Modbus 통신개발和디버깅的엔지니어링师,掌握 Wireshark 抓包分析是必备技能。
답글 작성