Baud
プロトコル一覧

Modbus RTU

工場の定番。アドレス、ファンクションコード、データ、CRC。RS-485 の上で。

要求: レジスタ 2 つを読む

マスタがスレーブ 1 に保持レジスタ 2 つを尋ねます。CRC は実際に計算した値です。フィールドごとにコマ送りしてください。

Modbus RTU 要求・レジスタ 2 つの読み出し0010000000103000000110000000000000000000000000000000200000010C4110001000B00001011スレーブア…ファンクシ…開始アドレス個数CRC-16フィールドをクリックして中身を見る

フレーム全体

8 バイト: 01 03 00 00 00 02 C4 0B。開始・終了の目印はありません。前後に 3.5 文字時間以上の無音を置くことでフレームを区切ります。

フィールド位置例の値意味
スレーブアドレス0 バイト目0x01 = 1どのデバイスが応答するか(1〜247。0 はブロードキャストで、誰も返事をしません)。RS-485 の 2 本線上の全デバイスがこのフレームを聞きますが、アドレス 1 だけが処理します。
ファンクションコード1 バイト目0x03 = 保持レジスタの読み出し何をするか。0x03 = 保持レジスタの読み出し。ほかに 0x01 コイル読み出し、0x04 入力レジスタ読み出し、0x06 レジスタ 1 つ書き込み、0x10 レジスタ複数書き込みなど。
開始アドレス2–3 バイト目0x0000 = レジスタ 0(資料上は 40001)読み出す最初のレジスタで、線上では 0 起点です。資料には 40001 と書かれることが多く(4xxxx は保持レジスタ帯)、これが線上のアドレス 0 にあたります。
個数4–5 バイト目2 レジスタ連続して読む 16 ビットレジスタの個数(1〜125)。
CRC-166–7 バイト目0x0BC4(下位バイトから送信)この前のすべてのバイトに対する CRC-16 です(初期値 0xFFFF、多項式 0xA001)。癖があり、下位バイトから送るため、値 0x0BC4 は線上で C4 0B の順に現れます。受信側が計算した CRC と合わなければ、フレームは黙って捨てられます。

概要

Modbus(1979 年)は産業機器の共通語です。電力計、インバータ、温調器、PLC など。RTU 方式はコンパクトなバイナリのフレームをシリアル回線(多くは RS-485)で送るので、数百 m の 1 対のより線を多数のスレーブで共有できます。

マスタが問い合わせ、スレーブは答えるだけです。データは番号付きの 16 ビットレジスタに置かれ、「温度を読む」はレジスタ N を読むことを意味します。フレームの目印はなく、3.5 文字時間の無音がフレームを区切り、CRC が内容を保証します。

基本情報

物理層
RS-485 (or RS-232)
フレーミング
UART、8E1 または 8N2 が一般的
よくある速度
9600 / 19200 baud
アドレス
1 – 247
最大長
256 バイト
誤り検出
CRC-16 (low byte first)

応答

スレーブはアドレスとファンクションを返し、続くバイト数を伝え、値を返します。

Modbus RTU 応答・レジスタ 2 つ0801000000010300000011040000010000000000000A0000101000000000001400010100DA110110103E00111110スレーブア…ファンクシ…バイト数レジスタ 0レジスタ 1CRC-16フィールドをクリックして中身を見る

フレーム全体

9 バイト: 01 03 04 00 0A 00 14 DA 3E。スレーブは問いかけられたときだけ答え、自分から話し始めることはありません。

フィールド位置例の値意味
スレーブアドレス0 バイト目0x01 = 1応答した本人が自分のアドレスを返し、マスタが誰の返事かを確認できるようにします。
ファンクションコード1 バイト目0x03要求のコードをそのまま返します。失敗したときはスレーブが最上位ビットを立て(0x83)、代わりに例外応答を返します。
バイト数2 バイト目4このあと続くデータのバイト数。2 レジスタ × 2 バイト = 4。
レジスタ 03–4 バイト目0x000A = 10レジスタ 0 の値で、ビッグエンディアン(上位バイトが先)です。たとえば 0.1 ℃ 単位の温度なら 10 = 1.0 ℃ になります。
レジスタ 15–6 バイト目0x0014 = 20レジスタ 1 の値(ビッグエンディアン)。0x0014 = 20。
CRC-167–8 バイト目0x3EDA(下位バイトから送信)この前のすべてのバイトに対する CRC-16 です(初期値 0xFFFF、多項式 0xA001)。癖があり、下位バイトから送るため、値 0x3EDA は線上で DA 3E の順に現れます。受信側が計算した CRC と合わなければ、フレームは黙って捨てられます。

失敗したとき

エラー応答はたった 5 バイトです。ファンクションコードの最上位ビットが目印になります。

Modbus RTU 例外応答0010000000183100000110200000010C011000000F111110001スレーブア…ファンクシ…例外コードCRC-16フィールドをクリックして中身を見る

フレーム全体

エラーは 5 バイトのフレームです。最上位ビットを立てたファンクションコードと、1 バイトの理由で構成されます。

フィールド位置例の値意味
スレーブアドレス0 バイト目0x01同じスレーブが答えています。
ファンクションコード + 0x801 バイト目0x83 = 0x03 | 0x800x03 に最上位ビットを立てて 0x83。この 1 ビットで、マスタは正常応答かエラーかを見分けます。
例外コード2 バイト目0x02 = 不正なデータアドレス失敗の理由。0x01 不正なファンクション、0x02 不正なデータアドレス(そのレジスタは存在しない)、0x03 不正なデータ値、0x04 デバイス障害。
CRC-163–4 バイト目0xF1C0(下位バイトから送信)この前のすべてのバイトに対する CRC-16 です(初期値 0xFFFF、多項式 0xA001)。癖があり、下位バイトから送るため、値 0xF1C0 は線上で C0 F1 の順に現れます。受信側が計算した CRC と合わなければ、フレームは黙って捨てられます。

1 回のポーリング

共有した 1 対の線を、交代で使います。

マスタPLC / PCスレーブ 1温度センサRequest01 03 00 00 00 02Response01 03 04 00 0A 00 14IDLEIDLEPROCESSDONEIDLE

やり取りの全体

厳格なマスタ/スレーブ方式です。マスタが問い、1 台が答え、線が静まる。タイミングはすべて線上の無音で決まります。

  1. 1マスタが問いかける

    マスタが共有の RS-485 で 8 バイトの要求を送ります。全スレーブが聞きますが、アドレスが合う 1 台だけが処理します。ほかは黙って待ちます。

  2. 2スレーブが答える

    3.5 文字時間以上の無音のあと、スレーブが 9 バイトの返事を送ります。マスタとスレーブは 1 対の線を交代で使い、半二重の線を 2 者が同時に駆動することはありません。

使われる場面

  • 電力量計、太陽光インバータ、ヒートポンプ
  • PLC、温度調節計、モータドライブ
  • Modbus TCP は同じファンクションコードを TCP パケットに入れます(CRC なし、代わりに 7 バイトのヘッダ)

つまずきやすい点

  • レジスタ番号の数え方が混乱の元です。マニュアルの 40001 は線上ではアドレス 0 です。ツールが 0 起点か 1 起点かを確認しましょう。
  • CRC は下位バイトが先、レジスタのデータは上位バイトが先です。
  • RS-485 は線の両端の終端(120 Ω)とバイアスが必要で、トランシーバの送受信切り替えも十分速くしなければなりません。

出典・規格

  • Modbus Application Protocol Specification V1.1b3
  • Modbus over Serial Line Specification V1.02

関連するプロトコル