Modbus
Modicon社がPLC用に開発した通信プロトコル。
物理レイヤは規定されていない。
RS232CやRS485などのシリアル通信がよく使われる。
プロトコル仕様書が公開されていて利用無料!
公式
非公式だが日本語で分かりやすいもの
仕様概要
単一マスタ
複数スレーブ
伝送モード
ASCII
RTU
TCP
クエリ構造
Device address
0 ~ 247
Slaveは1~247で割り当てて、0宛のクエリはブロードキャストとみなす。
Function code
1 ~ 255
正常応答のときは同じコードをそのまま返す。
異常応答のときはMSBを立てて返す。
Query data
Function code による。
このフィールドが無いクエリもある。
Error check
ASCII
デリミタを除いたデータから算出する。
RTU
生成多項式は固定?
よく使われているのは CRC16-IBM ($ X^{16}+X^{15}+X^{2}+1) らしい。
データフレームのデリミタ
ASCII
クエリの先頭に " : " (0x3A) を付与する。
クエリの終端に " CR/LF " (0x0D0A) を付与する。
RTU
クエリの前後に最低3.5文字分の無通信時間を設ける。
データアドレス
データの種類ごとにアドレス範囲が定義されている。
クエリの値は、各アドレスの先頭からのオフセット値で決める。
0/1-indexed の違いに注意...
1 ~ 9999
Coil
デジタル出力などやデバイスのモード変更など、参照と変更が可能な2値のデータ
10001 ~ 19999
Input Status
デジタル入力やデバイスの状態入力など、参照のみ可能で変更はできない2値のデータ
30001 ~ 39999
Input Register
アナログ入力やデバイスの情報など、参照のみ可能で変更はできない16ビット長のデータ
複数の連続したアドレスを浮動小数点数とかに割り当てることも可能
40001 ~ 49999
Holding Register
アナログ出力やデバイスの設定情報など、参照と変更が可能な16ビット長のデータ
複数の連続したアドレスを浮動小数点数とかに割り当てることも可能