Modbusデバッグにおける“スイスアーミーナイフ”
Modbusデバイスの日常的なデバッグでは、Wiresharkパケットを開いたり、Pythonスクリプトを書いたりする必要はありません。16進メッセージのシーケンスをデコードしたり、Unknownのデバイスのレジスタ範囲をスキャンしたり、コマンドラインで読み書きリクエストをテストしたりするなど、1つの機能をすばやく検証する必要がある場合があります。この記事では、modbus.orgが推奨する最も軽量で実用的なModbusガジェットをまとめました。
Modbus RTU/TCPメッセージオンラインパーサ
シリアルアシスタントからModbusメッセージの文字列を受信したり、コードのデバッグ中にModbusバイナリデータを表示したりすると、そのデータの意味をすばやく知る必要があります。オンラインModbusメッセージパーサは最速のソリューションです-ソフトウェアをインストールする必要はなく、ブラウザが開いているときに使用できます。
オンラインModbus RTU Parser
推奨ツールCAS Modbus RTU Parser(チプキン·オートメーション·システムズ)
訪問者:store.chipkin.com/products/tools#modbus-rtu-parser
これは純粋なウェブツールです。16進Modbus RTUメッセージの列を貼り付けるだけです。
01 03 00 00 00 0A C5 CDクリックすると、ツールが自動的に表示されます。
- スレーブアドレスSlave ID = 1
- ファンクションコード= 03 Read Holding Registers
- 開始アドレス= 0
- リクエスト数= 10レジスタ
- CRCチェック= 0 x CDC 5(正しいことを確認する✓)
オンラインModbus TCP Parser
訪問者:store.chipkin.com/products/tools#modbus-tcp-parser
RTUバージョンと似ているが、MBAPヘッダ(Transaction ID、Protocol ID、Length、Unit ID)のParseが追加されている。以下のTCPメッセージを送信します:
00 01 00 00 00 06 01 03 00 00 00 0AトランザクションID=1、プロトコル=Modbus、スレーブ=1、ファンクションコード= 0 3、開始アドレス=0、Quantity=10の結果となります。
Modbusデバイスアドレス空間スキャンツール
CAS Modbus Scanner
アドレスをダウンロード:store.chipkin.com/products/tools/cas-modbus-scanner
完全なレジスタマッピングマニュアルがないModbusデバイスを入手した場合、最も簡単な方法は“スキャン”です。Modbusスキャナを使用してデバイスのアドレス空間を横断し、どのアドレスが有効なデータを返したかを記録します。
使用方法は:
- 接続方式の設定(TCP入力IP Port、RTU選択シリアルポート)
- スキャンするアドレス范囲を选択します0-100の小范囲を推奨
- スキャンするデータの種類を選択します:コイル、ディスクリート入力、ホールドレジスタ、入力レジスタ
- 開始スキャンをクリックして結果を確認
- 有効なデータを返すアドレスを記録する
- 機器実物と合わせて検証(物理量の変更,対応レジスタ変化の観察)
スキャン技術。:
- ほとんどのデバイスの設定と測定データがここにあるため、最初にホールドレジスタ(4 xxxx)をスキャンします。
- アドレスが例外コード0 2(不正データアドレス)を返す場合、そのアドレスは無効です。
- 0が返されても例外がない場合、値=0がtrueか、デバイスがアドレスを実装していないかを判断する必要があります(スキャンだけでは区別できません)。
- 物理的な励起(加熱、ロータリーエンコーダなど)を変更した後、繰り返し掃引し、どのアドレス値が変化するかを確認します。
コマンドラインプロトコルテスト:modbus-cliトリック
特殊なツールに加えて、Modbusテストには多くの汎用コマンドラインツールが使用できます。
NetcatによるTCP接続のテスト
Modbus TCPデバイスがオンラインかどうかテストする
nc -zv 192.168.1.100 502
#“Connection to 192.168.1.100 502 port [tcp/*] succeeded!”と出力された場合オンラインで説明しますPythonでの1行コマンドテスト
#pymodbusをインストールした後、1行のテストが保持レジスタを読み取る
Python 3-C“
from pymodbus.client import modbusTcpClient
c = ModbusTcpClient('192.16 8.1.100')
c.connect
= c.read_h
print 'Values' r.registers if not r.isError else rr
c. cl
"xxdによるバイナリModbusデータのParse
#Modbusバイナリデータファイルがある場合は、xxdで確認できます。
xxd modbus_d.bin
#またはhexdumpフォーマットで表示する
hexdump -C modbus_dump.bin|ヘッド-20Modbusプロトコル関数早見表
デバッグはしばしば機能コード対応表をチェックする必要がありますが、以下は一般的な機能コードのクイックチェックです。
| 関数コードの特徴 | 名前は | データ型 | オペレーション·オペレーション |
|---|---|---|---|
| 01 (0x01) | Read Coils | コイル(0 xxxx) | 1-bitを読む |
| 02 (0x02) | Read Discrete Inputs | ショップ型入力(1 xxxx) | 1-bitを読む |
| 03 (0x03) | Read Holding Registers | 保持レジスタ(4 xxxx) | 16-bitを読む |
| 04 (0x04) | Read Input Registers | 入力レジスタ(3 xxxx) | 16-bitを読む |
| 05 (0x05) | Write Single Coil | コイルコイルコイル | 1-bitを書く |
| 06 (0x06) | Write Single Register | レジスタを保持する。 | 16-bitで書く |
| 15 (0x0F) | Write Multiple Coils | コイルコイルコイル | 書き込みは1ビット。 |
| 16 (0x10) | Write Multiple Registers | レジスタを保持する。 | 16-bitの書き込み |
| 23 (0x17) | Read/Write Multiple Registers | レジスタを保持する。 | 読み取りと書き込みの組み合わせ |
Modbus例外コードの高速チェック
| 異常コード。 | 意味の意味 | よくある原因 |
|---|---|---|
| 01 | 違法な機能コード | デバイスは機能コードをサポートしていません。 |
| 02 | 違法なデータアドレス | 要求されたアドレス範囲がデバイスの使用可能範囲を超えている |
| 03 | 不正なデータ値 | 書き込みされた値が許容範囲外です |
| 04 | スレーブ機器の障害 | デバイス内部エラー、要求を処理できません |
| 05 | Confirm(ACK) | リクエストは受理されたが処理に時間がかかる |
| 06 | 駅の設備が忙しい | デバイスはビジーです。後で再試行してください。 |
概要まとめ
Modbusデバッグは毎回重いツールを必要としない。メッセージの迅速なデコードに適したオンラインパーサ、Unknownのデバイスのレジスタマッピングをリバースするスキャナ、自動テストに適したコマンドラインツール。これらの“ガジェット”をマスターすることで、Modbusデバッグの効率が2倍になります。問題が発生した場合は最も軽量なツールを使用し、詳細な分析が必要な場合はWiresharkのような重いツールを使用してください。
Leave a Reply