Modbusは産業機器で広く使われるアプリケーション層の通信プロトコルです。クライアントが要求を送り、サーバーはファンクションコードに従って応答します。プロトコルは通信形式を決めますが、温度などの値をどのレジスタに置くかは機器ごとに異なります。実機では必ずレジスタ表を参照してください。本文のファンクションコードと電文のバイトは16進数です。0Fは10進数の15、10は10進数の16です。
1. 四つのデータ領域
- コイル:読み書き可能な1ビット。主なコードは読出し01、単一書込み05、複数書込み0F。
- ディスクリート入力:読出し専用の1ビット。コード02。
- 入力レジスタ:読出し専用の16ビット。コード04。
- 保持レジスタ:プロトコル上は読み書き可能な16ビット。読出し03、単一書込み06、複数書込み10。ただし機器が書込みを制限する場合があります。
03と04はともに16ビットを読みますが、対象領域が異なります。機器の資料でコード、レジスタ番号、型、倍率、権限を確認しましょう。
2. Modbus RTUとModbus TCP
RTUはRS-485などのシリアル回線でよく使われます。フレームは局番、コードとデータ、CRC16で構成されます。同じバスの機器には異なる局番を設定し、通信速度、データビット、パリティ、ストップビットを一致させます。CRCは下位バイトを先に送ります。
Modbus TCPはTCP/IPを使用し、通常はポート502です。7バイトのMBAPヘッダーにはトランザクション識別子、プロトコル識別子、長さ、ユニット識別子が入ります。TCPフレームにRTUの末尾CRCはありません。TCP/シリアルゲートウェイではユニット識別子が接続先機器の選択に使われます。
3. 40001とアドレス0の関係
資料上の40001は通常、最初の保持レジスタを表します。先頭の4はデータ領域を示し、実際の要求には0から始まるオフセットを入れます。この方式では40001はコード03・開始アドレス0000、40002は0001です。ただし資料やツールによって表示方法が違います。隣のレジスタへ書き込む前にアドレス方式を確かめてください。
1レジスタは16ビットです。32ビット値は通常2レジスタを使いますが、ワードの並びは機器依存です。温度を10で割るような換算も機器の定義であり、Modbusの共通規則ではありません。
4. 二つの保持レジスタを読む例
例として40001と40002に温度と湿度があり、生値が250と400、換算係数が各0.1と資料に記載されているとします。コード03でオフセット0から2レジスタ読みます。数値と単位は説明用です。
PDU request: 03 00 00 00 02
PDU response: 03 04 00 FA 01 90
TCP request: 00 01 00 00 00 06 01 03 00 00 00 02
TCP response: 00 01 00 00 00 07 01 03 04 00 FA 01 90
要求PDUの03はコード、00 00は開始オフセット、00 02は個数です。応答の04は後続データのバイト数、00 FAは250、01 90は400を表します。仮定した換算で25.0 °Cと40.0%です。TCP例ではトランザクションIDが0001、プロトコルIDが0000、ユニットIDが01、MBAPの長さが0006と0007です。RTUでは同じPDUの前に局番、後に正しいCRC16を付けます。
5. 初回接続の確認手順
- 最初は書込みを避け、資料にある読出し可能な値を選びます。回線、局番またはIP、ポート、シリアル設定を確認します。
- データ領域とコードを選び、ツールが「40001」と「オフセット0」のどちらを求めるか確認します。
- 少数のレジスタを読み、応答コードとバイト数を検証してから資料に従って換算します。
- タイムアウトなら配線、ネットワーク、局番を調べます。83 02はファンクションコード03が例外02(不正なデータアドレス)を返したことを示します。開始オフセットと個数を確認してください。
安全性と資料
読出しや書込みは実機に影響し得ます。最初は書込みを避け、運用ネットワークへの接続を制限してください。従来のModbus TCPをインターネットに直接公開せず、対応機器のModbus Securityやネットワーク分離を検討します。