なぜか。用 Wireshark 分析 Modbus?
Wireshark 是全球最流行的开源网络协议分析器,由 Gerald Combs 于 1998 年作成,现由 Wireshark 基金会维护。官网 www.wireshark.org。它内置了完全的 Modbus TCP 协议解析器(dissector),可以自动识别和解析 Modbus TCP 报文中的 MBAP 头、function code、データ区和異常コード。。对于 Modbus RTU message,Wireshark 也可以経由 USB 转シリアルポート适配器或远程抓包的方式进行分析。
在工业自動化的デバッグ现场,最も一般的な的痛点就是"通信通信不可但不知道なぜか。"。Wireshark 能让你看到バス上的每一フレームデータ——リクエスト发了什么、レスポンス回了什么、タイムアウト发生在哪个环节、異常コードとは?——把看不见的通信过程变成可追踪的证据链。
Wireshark 对 Modbus protocol的サポート
Wireshark 的 Modbus protocol解析器位于 epan/dissectors/packet-modbus.c,能够自动识别以下内容:
- Modbus/TCP:デフォルトポート 502,自动识别 MBAP 头(Transaction ID、Protocol ID、Length、Unit ID)和各機能コード的 PDU
- 機能コード解析:FC01-FC06、FC15-FC16、FC23 等常用機能コード的リクエスト和応答の形式
- Exception Code:自动标注異常な応答,并表示異常コード。含义(01=Illegal function、02=Illegal data address、03=Illegal data value、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
从 官网下载ページ Download Windows インストール包。インストール时需勾选 Npcap(Windows 抓包驱动)和 USBPcap(如需抓 USB 转シリアルポートデータ)。
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 端直接抓包
open Wireshark,選択与目标デバイス通信的网卡(如イーサネット(イーサネット)卡或 Wi-Fi),在 Capture Filter 中入力 tcp port 502,点击开始抓包。此时运行你的 Modbus マスター程序(如 Modbus Poll),即可捕获到完全的 Modbus TCP 通信过程。
Modbus TCP 报文详解
在 Wireshark 中选中一条 Modbus TCP message,展开 "Modbus/TCP" 层。一个典型的リードホールドレジスタリクエスト报文構造如下:
| field | byte count | サンプル值 | 説明 |
|---|---|---|---|
| Transaction ID | 2 | 0x0001 | Transaction identifier,クライアント側は自增,サーバー側。そのまま戻る。 |
| Protocol ID | 2 | 0x0000 | 协议标识,Modbus 固定为 0 |
| Length | 2 | 0x0006 | 后续Bytesの数(Unit ID + PDU) |
| Unit ID | 1 | 0x01 | slave address(Slave ID) |
| Function Code | 1 | 0x03 | function code(03=read holding registers) |
| Starting Address | 2 | 0x0000 | Starting register address |
| Quantity | 2 | 0x000A | Reading quantity(10个) |
对应的レスポンス报文包含同样的 MBAP 头 + function code 0x03 + バイト计数 0x14(20バイト=101つのレジスタ)+ data area。
Wireshark 表示过滤器技巧
表示过滤器(Display Filter)用于在已抓取的报文中快速筛选目标データ。以下是常用的 Modbus 相关过滤器:
# 筛选すべての Modbus protocolmessage
modbus
# 筛选指定機能コード(如 03 Read the hold register)
modbus.func_code == 3
# 筛选異常な応答
modbus.exception_code
# 筛选指定駅からの住所
modbus.unit_id == 1
# 筛选包含異常的报文
modbus.exception_code != 0
# 组合过滤:slave 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/重传),説明スレーブデバイスない正确レスポンス。チェック方法:
- Confirm TCP port(デフォルト 502)在スレーブデバイス上已开放
- チェック駅からの住所(Unit ID)是否与リクエスト中的一致
- 表示ありますか? TCP 层異常(重传、RST),如有则説明网络层有問題
案例2:例外コードを返す 02(Illegal data address)
Wireshark 可以看到リクエスト中的開始アドレス + 数量超出了スレーブ的レジスタ範囲。在 Wireshark 中右クリック点リクエスト报文 → "Follow → TCP Stream",可以看到完全的リクエスト和異常な応答对话。
案例3:データ值異常——バイトオーダー問題
読み取り到的 32 ビット浮動小数点数在 Wireshark 中表示正常,但在マスター程序中表示为 NaN 或最大値は。这説明通信层没問題,是マスター程序的バイトオーダー解析有误。可以在 Wireshark 中手動計算验证:右のレジスタ。データ → "Copy → Value" 取得十六进制元の值,用 IEEE 754 計算器オンライン验证。
抓取 Modbus RTU(serial port)message
Modbus RTU 経由 RS-232 或 RS-485 物理層は传输,不能直接使用する。 Wireshark 抓取。常见方案:
方案1:USB 转シリアルポート + USBPcap
在 Windows 上インストール USBPcap(Wireshark インストール时可选组件),可以抓取 USB 转シリアルデバイス上的生データ。但需要自行解析 RTU フレーム(address + function code + data + CRC)。
方案2:シリアルポートモニタリング软件
推奨される使用专门的シリアルポートモニタリング工具:
- Serial Port Monitor(Windows 商业软件):可直接モニタリング和解析 Modbus RTU フレーム
- CAS Modbus RTU Parser:無料オンライン工具,貼り付け十六进制バイト自动解析
- PortMon(Windows free):微软出品的底层シリアルポートモニタリング工具
方案3:在 RTU 转 TCP ゲートウェイ上抓包
もし现场使用了シリアルサーバー(如 MOXA NPort),可以在 TCP 侧用 Wireshark 抓包,报文内容即为 RTU フレーム。
Wireshark Modbus 分析上級技巧
统计分析:I/O 图表
菜单 → Statistics → I/O Graph,設定过滤器为 modbus,可以观察到 Modbus 通信的频率和时间分布。もし发现周期性尖峰或间隙,可能是ポーリング参数設定不当。
表示完全的 TCP 流
右クリック任意 Modbus TCP message → Follow → TCP Stream,可以表示一次完全 TCP 连接中すべての Modbus リクエスト和レスポンス的生データ。这是トラブルシューティング"読み取りデータ错位"問題的利器。
export Modbus data
File → Export Packet Dissections → As CSV,可以将すべての解码后的 Modbus 报文导出为 CSV format,方便用 Excel 或 Python 进行批量分析。
总结
Wireshark 是 Modbus protocolデバッグ中不可替代的工具。它能够将"看不见"的通信过程可视化,帮助エンジニア正確ポジショニング問題发生在プロトコルスタック的哪一层——是 TCP connection establishment失敗、MBAP 头字段エラー、機能コード不マッチング、レジスター·アドレス越界まだデータバイトオーダー解析エラー。对于任何从事 Modbus 通信开发和デバッグ的エンジニア,掌握 Wireshark バッグの分析。是必备技能。
Leave a Reply