本記事では、開発者が最低限保持しておくべき、Modbusの通信仕様について、記載している。
そのため、Modbusの細かい仕様や仕組みについての説明は省き、最低限知っておけば設計・コーディングは進められるというレベルまでの説明のみを行う。
詳しい説明は他の人が書いている説明を確認してほしい。
Modbus概説書_NM6(三菱電機の概説書。クリックするとPDFを取得する。)
1. Modbusの通信様式
Modbusはマスタ/スレーブという関係で通信を行う。
- マスタ(Master):通信を開始する側。クライアント相当。
- スレーブ(Slave):要求に応答する側。サーバ相当
※スレーブは複数台接続可能で、各スレーブは Unit ID(アドレス) を持つ
マスタ・スレーブは以下のような関係となっており、マスタがUnitId1を設定した場合はスレーブ1、マスタがUnitId2を設定した場合はスレーブ2と通信を行う。

2.スレーブのデータ空間
Modbus では、データは以下の4種類に分類される。
| 種類 | 読み | 書き | 用途 |
| Coils | 〇 | 〇 | 1ビットのコイルへのデータ読み書き |
| Discrete Inputs | 〇 | × | 1ビットのコイルへのデータ読み取り |
| Input Registers | 〇 | × | 16ビット(2バイト)のデータ読み取り |
| Holding Registers | 〇 | 〇 | 16ビット(2バイト)のデータ読み書き |
3. Modbus RTU の通信フレーム構造
Modbus RTU のフレームは以下の構造となっている。
| Slave Addr | Function Code | Data (可変長) | CRC(2byte) |
● 各フィールドの意味
- Slave Address:対象スレーブの Unit ID。上記で記載したUnitIdを指定する。
- Function Code:実行したい操作(読み取り/書き込み)。後述する設定方法を記載する。
- Data:アドレス・データ長・書き込み値を設定する。
データの内容は各Function Codeにより、異なる。 - CRC:誤り検出用のチェックサム(通信方式によってはない場合がある。)
4.Function Codeの設定内容
Functionコードは2桁の値を設定する。
それぞれの以下のような値を設定する。
| コード | 名称 | 説明 |
| 01 (0x01) | Read Coils | Coil(デジタル出力)を読み取る |
| 02 (0x02) | Read Discrete Inputs | Discrete Input(デジタル入力)を読み取る |
| 03 (0x03) | Read Holding Registers | Holding Register(設定値・制御値)を読み取る |
| 04 (0x04) | Read Input Registers | Input Register(アナログ入力・計測値)を読み取る |
| 05 (0x05) | Write Single Coil | 1点の Coil を書き込む(ON/OFF) |
| 06 (0x06) | Write Single Register | 1点の Holding Register を書き込む |
| 15 (0x0F) | Write Multiple Coils | 複数の Coil を書き込む |
| 16 (0x10) | Write Multiple Registers | 複数の Holding Register を書き込む |
5.Modbusの実装時の注意点
Modbusは通信仕様は上記のようになっているが、使用しているOSSによってラッピングしてくれていることが多い。
例えばPythonのOSSであるpymobusの場合は[Function Code]はコードを直接設定する必要がなく、関数を指定する(例:read_coils)ことで設定することが出来る。
余談だが、[Data]の細かい説明を省いているのは、ラッピングされているため説明を省いても問題ないことが多いと考えて記載を省いている。

コメント