Modbus RTU
工場の定番。アドレス、ファンクションコード、データ、CRC。RS-485 の上で。
要求: レジスタ 2 つを読む
マスタがスレーブ 1 に保持レジスタ 2 つを尋ねます。CRC は実際に計算した値です。フィールドごとにコマ送りしてください。
フレーム全体
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-16 | 6–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)
応答
スレーブはアドレスとファンクションを返し、続くバイト数を伝え、値を返します。
フレーム全体
9 バイト: 01 03 04 00 0A 00 14 DA 3E。スレーブは問いかけられたときだけ答え、自分から話し始めることはありません。
| フィールド | 位置 | 例の値 | 意味 |
|---|---|---|---|
| スレーブアドレス | 0 バイト目 | 0x01 = 1 | 応答した本人が自分のアドレスを返し、マスタが誰の返事かを確認できるようにします。 |
| ファンクションコード | 1 バイト目 | 0x03 | 要求のコードをそのまま返します。失敗したときはスレーブが最上位ビットを立て(0x83)、代わりに例外応答を返します。 |
| バイト数 | 2 バイト目 | 4 | このあと続くデータのバイト数。2 レジスタ × 2 バイト = 4。 |
| レジスタ 0 | 3–4 バイト目 | 0x000A = 10 | レジスタ 0 の値で、ビッグエンディアン(上位バイトが先)です。たとえば 0.1 ℃ 単位の温度なら 10 = 1.0 ℃ になります。 |
| レジスタ 1 | 5–6 バイト目 | 0x0014 = 20 | レジスタ 1 の値(ビッグエンディアン)。0x0014 = 20。 |
| CRC-16 | 7–8 バイト目 | 0x3EDA(下位バイトから送信) | この前のすべてのバイトに対する CRC-16 です(初期値 0xFFFF、多項式 0xA001)。癖があり、下位バイトから送るため、値 0x3EDA は線上で DA 3E の順に現れます。受信側が計算した CRC と合わなければ、フレームは黙って捨てられます。 |
失敗したとき
エラー応答はたった 5 バイトです。ファンクションコードの最上位ビットが目印になります。
フレーム全体
エラーは 5 バイトのフレームです。最上位ビットを立てたファンクションコードと、1 バイトの理由で構成されます。
| フィールド | 位置 | 例の値 | 意味 |
|---|---|---|---|
| スレーブアドレス | 0 バイト目 | 0x01 | 同じスレーブが答えています。 |
| ファンクションコード + 0x80 | 1 バイト目 | 0x83 = 0x03 | 0x80 | 0x03 に最上位ビットを立てて 0x83。この 1 ビットで、マスタは正常応答かエラーかを見分けます。 |
| 例外コード | 2 バイト目 | 0x02 = 不正なデータアドレス | 失敗の理由。0x01 不正なファンクション、0x02 不正なデータアドレス(そのレジスタは存在しない)、0x03 不正なデータ値、0x04 デバイス障害。 |
| CRC-16 | 3–4 バイト目 | 0xF1C0(下位バイトから送信) | この前のすべてのバイトに対する CRC-16 です(初期値 0xFFFF、多項式 0xA001)。癖があり、下位バイトから送るため、値 0xF1C0 は線上で C0 F1 の順に現れます。受信側が計算した CRC と合わなければ、フレームは黙って捨てられます。 |
1 回のポーリング
共有した 1 対の線を、交代で使います。
やり取りの全体
厳格なマスタ/スレーブ方式です。マスタが問い、1 台が答え、線が静まる。タイミングはすべて線上の無音で決まります。
1マスタが問いかける
マスタが共有の RS-485 で 8 バイトの要求を送ります。全スレーブが聞きますが、アドレスが合う 1 台だけが処理します。ほかは黙って待ちます。
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