【Modbus通信仕様】開発者のための最低限知識

本記事では、開発者が最低限保持しておくべき、Modbusの通信仕様について、記載している。
そのため、Modbusの細かい仕様や仕組みについての説明は省き、最低限知っておけば設計・コーディングは進められるというレベルまでの説明のみを行う。
詳しい説明は他の人が書いている説明を確認してほしい。
Modbus概説書_NM6(三菱電機の概説書。クリックするとPDFを取得する。)

1. Modbusの通信様式

Modbusはマスタ/スレーブという関係で通信を行う。

  • マスタ(Master):通信を開始する側。クライアント相当。
  • スレーブ(Slave):要求に応答する側。サーバ相当
    ※スレーブは複数台接続可能で、各スレーブは Unit ID(アドレス) を持つ

マスタ・スレーブは以下のような関係となっており、マスタがUnitId1を設定した場合はスレーブ1、マスタがUnitId2を設定した場合はスレーブ2と通信を行う。

2.スレーブのデータ空間

Modbus では、データは以下の4種類に分類される。

種類読み書き用途
Coils1ビットのコイルへのデータ読み書き
Discrete Inputs×1ビットのコイルへのデータ読み取り
Input Registers×16ビット(2バイト)のデータ読み取り
Holding Registers16ビット(2バイト)のデータ読み書き

3. Modbus RTU の通信フレーム構造

Modbus RTU のフレームは以下の構造となっている。

Slave AddrFunction CodeData (可変長)CRC(2byte)

● 各フィールドの意味

  • Slave Address:対象スレーブの Unit ID。上記で記載したUnitIdを指定する。
  • Function Code:実行したい操作(読み取り/書き込み)。後述する設定方法を記載する。
  • Data:アドレス・データ長・書き込み値を設定する。
        データの内容は各Function Codeにより、異なる。
  • CRC:誤り検出用のチェックサム(通信方式によってはない場合がある。)

4.Function Codeの設定内容

Functionコードは2桁の値を設定する。
それぞれの以下のような値を設定する。

コード名称説明
01 (0x01)Read CoilsCoil(デジタル出力)を読み取る
02 (0x02)Read Discrete InputsDiscrete Input(デジタル入力)を読み取る
03 (0x03)Read Holding RegistersHolding Register(設定値・制御値)を読み取る
04 (0x04)Read Input RegistersInput Register(アナログ入力・計測値)を読み取る
05 (0x05)Write Single Coil1点の Coil を書き込む(ON/OFF)
06 (0x06)Write Single Register1点の 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]の細かい説明を省いているのは、ラッピングされているため説明を省いても問題ないことが多いと考えて記載を省いている。

コメント

タイトルとURLをコピーしました