WiresharkでModbusを分析する理由
Wiresharkは、1998 yearにGerald Combsによって作成され、現在はWireshark Foundationによって維持されている世界で最も人気のあるオープンソースのネットワークプロトコルアナライザです。公式サイトwww.wireshark.org。完全なModbus TCPプロトコルパーサdissectorが内蔵されており、Modbus TCPメッセージ内のMBAPヘッダ、ファンクションコード、データゾーン、例外コードを自動的に識別してParseすることができます。Modbus RTUメッセージの場合、WiresharkはUSB-シリアルアダプタまたはリモートパケットキャプチャを介してParseすることもできます。
産業オートメーションの試運転現場で最も一般的な苦痛点は、“Communicationできないが理由がわからない”ことです。Wiresharkを使用すると、バス上のすべてのデータフレーム(リクエストが送信されたもの、レスポンスが返されたもの、タイムアウトが発生した場所、例外コードが何であるかなど)を確認でき、見えないCommunicationを追跡可能な証拠のチェーンに変えます。
WiresharkのModbusプロトコルのサポート
WiresharkのModbusプロトコルリゾルバepan/dissectors/packet-modbus.c以下を自動的に識別できます。
- Modbus/TCP:MBAPヘッダ(Transaction ID、Protocol ID、Length、Unit ID)と各機能コードのPDUを自動的に識別するデフォルトポート502
- 関数コードのParseFC 01-FC 06、FC 15-FC 16、FC 23などの一般的な機能コードのリクエストとレスポンスのフォーマット
- 異常コード。:自動的に異常応答をマークし、異常コードの意味を表示します(0 1 =不正機能、0 2 =不正データアドレス、0 3 =不正データ値、0 4 =スレーブ機器の故障など)。
- 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
#ログアウト後の再ログインWindows
fromから公式ダウンロードページWindowsインストールパッケージをダウンロードします。インストール時の選択Npcap(Windowsのパッケージ)とUSBPcap(USBデータを取得する必要がある場合)。
macOS
brew install --cask wiresharkModbus TCPメッセージの取得
Linuxサーバ侧パッケージ
Modbus TCPトラフィックがLinuxサーバまたはゲートウェイで発生する場合、tcpdumpを直接使用してパケットをキャプチャするのが最も効率的です。
すべての宛先ポート502(Modbus TCPデフォルトポート)のTCPパケットを取得します。
sudo tcpdump -i 0-w mod_capture. ap 'tport 502
特定のIPデバイスからのCommunicationのみを取得する
sudo tcpdump -i 0-w mod_capture. ap 'host 192.168.1.100 and tport 502
Ctrl+Cを押してパケットをStopする
Wiresharkを使用したコンピュータに.pcapファイルを転送します。Windows側のダイレクト·キャプチャ
Wiresharkを開き、ターゲットデバイスとCommunicationするネットワークカードEthernetカードやWi-Fiなどを選択し、Capture Filterに入力します。tcp port 502パックを開始します。Modbus PollなどのModbusマスタープログラムを実行すると、完全なModbus TCP Communicationをキャプチャできます。
Modbus TCPメッセージの詳細
WiresharkでModbus TCPメッセージを選択し、Modbus/TCPレイヤを展開します。典型的なリードホールドレジスタ要求メッセージ構造は以下の通りです。
| フィールドフィールド | Bytesの数 | 値の例 | 説明書は |
|---|---|---|---|
| Transaction ID | 2 | 0x0001 | トランザクション識別子、クライアントは自己増加、サーバはそのまま返す |
| Protocol ID | 2 | 0x0000 | プロトコル識別、Modbusは0に固定 |
| Length | 2 | 0x0006 | 以降のバイト数ユニットID + PDU |
| Unit ID | 1 | 0x01 | スレーブアドレスSlave ID |
| Function Code | 1 | 0x03 | 機能コード(03=リードホールドレジスタ) |
| Starting Address | 2 | 0x0000 | 開始レジスタアドレス |
| Quantity | 2 | 0x000A | 読み取り回数(10回) |
対応する応答メッセージには、同じMBAPヘッダ+関数コード0 x 0 3+バイトカウント0 x 14(20バイト=10レジスタ)+データ領域が含まれます。
Wiresharkディスプレイフィルタ
[表示フィルタ] Display Filterは、取得したメッセージ内のターゲットデータをすばやくフィルタ処理するために使用します。以下は、一般的なModbus関連フィルタです。
#すべてのModbusプロトコルメッセージをフィルタリング
modbusの
#指定された関数コードをフィルタリングする(例:0 3リードホールドレジスタ)
modbus.func_code == 3
#異常応答の選択
modbus.exception_code
#スレーブアドレス指定のフィルタリング
mod._id == 1
#例外を含むメッセージをフィルタリング
mod.exception_code!= 0
#組み合わせフィルタリング:ステーション1の関数コード16から(マルチレジスタ書き込み)
mod._id == 1およびmod.c_code == 16
#IPアドレスとModbus関数コードでフィルタリング
ip.addr == 192.168.1.100 and modbus.func_code === 3
#MBAPヘッダトランザクションID 5のリクエストとレスポンスのペアのみを参照してください。
modbus.trans_id == 5WiresharkでModbus 通信障害をトラブルシューティングする
ケース1:データが読めない-スレーブが応答しない
パケットをキャプチャした後、リクエストフレームだけが応答フレームを持たないことがわかりました(またはTCP RST/再送信が発生します)。検査方法:
- スレーブデバイスでTCPポート(デフォルト502)が開いていることを確認します。
- スレーブアドレスUnit IDが要求内のと一致しているかどうかを確認します
- TCP層の例外(再送、RST)がないか確認し、ネットワーク層に問題がある場合
ケース2:例外コード02(不正なデータアドレス)が返される
Wiresharkは、リクエスト内の開始アドレス+の数がスレーブのレジスタ範囲を超えていることを確認できます。Wiresharkでリクエストメッセージ→“フォロー”→“TCPストリーム”を右クリックすると、リクエストと例外レスポンスの完全な会話が表示されます。
ケース3:データ値の例外-エンディアンの問題
読み込まれた32ビット浮動小数点数はWiresharkでは正常に表示されますが、マスタープログラムではNaNまたはMaximumとして表示されます。これは通信層に問題がないことを示しており、マスタープログラムのエンディアンParseエラーです。検証はWiresharkで手動で計算できます。右レジスタのデータ→コピー →値→ 16進数の生値を取得し、IEEE 754電卓を使用してオンラインで検証します。
Modbus RTU(シリアル)メッセージの取得
Modbus RTUはRS-232またはRS-485 物理層を介して送信され、Wiresharkで直接取得することはできない。通常のプログラム:
シナリオ1:USBからシリアルポートへ+USB Pcap
WindowsにUSBPcap(Wiresharkインストール時のオプションコンポーネント)をインストールすると、USB-Serialデバイスから生データを取得できます。ただし、RTUフレーム(アドレス+関数コード+データ+ CRC)を独自にParseする必要があります。
方案2:シリアルポート監視ソフトウェア
専用の監視ツールの使用をお勧めします。
- Serial Port Monitor(Windows商用ソフトウェア):Modbus RTUフレームを直接監視·Parse
- CAS Modbus RTU Parser:無料オンラインツール、ペースト16進バイト自動解析
- PortMon(Windows無料):マイクロソフトの低レベルシリアル監視ツール
シナリオ3:RTUからTCPへのパケットキャプチャ
フィールドでシリアルサーバ(MOXA NPortなど)を使用する場合は、WiresharkでTCP側でパケットをキャプチャすることができ、メッセージ内容はRTUフレームになります。
Wireshark ModbusParseの詳細
統計分析I/Oグラフ
メニュー → Statistics → I/O Graph、フィルタを設定modbusModbus Communicationの周波数と時間分布が観察されます。周期的なスパイクまたはギャップが見つかった場合は、ポーリングパラメータが不適切に設定されている可能性があります。
完全なTCPフローを見る
任意のModbus TCPメッセージを右クリック→フォロー → TCPストリームをクリックし、完全なTCPコネクション内のすべてのModbusリクエストとレスポンスの生データを表示します。これは、“読み取りデータの誤り”の問題をチェックするツールです。
Modbusデータのエクスポート
File → Export Packet Dissections → As CSVは、デコードされたModbusメッセージをすべてCSV形式にエクスポートすることができ、ExcelやPythonで簡単にバッチ分析できます。
概要まとめ
WiresharkはModbusプロトコルのデバッグにかけがえのないツールです。“見えない”Communicationプロセスを可視化することで、エンジニアは問題が発生しているプロトコルスタックのどのレイヤー(TCPコネクションの確立失敗、MBAPヘッダフィールドのエラー、ファンクションコードの不一致、レジスタアドレスの範囲外、データエンディアンParseエラーなど)を特定するのに役立ちます。Modbus Communicationの開発とデバッグに携わるエンジニアにとって、WiresharkパケットParseの習得は必須のスキルです。
Leave a Reply