
Modbus RTUプロトコル
Modbusはマスタースレーブ構造に基づく通信プロトコルである。データ転送には、RS-485、RS-422、RS-232インタフェース、およびイーサネットTCP/IPネットワーク(Modbus TCPプロトコル)を使用します。
Modbus RTUメッセージは:
- SlaveIDデバイスのアドレス
- 関数コードの特徴
- 関数コードに依存する特殊なデータ
- CRC-16(Modbus)
構造は以下の通り。
SlaveID 機能コード特殊データ CRC 16
SlaveIDアドレスとCRC-16(Modbus)を削除すると、PDU(Protocol Data Unit)が得られます。
SlaveIDはデバイスのアドレスで、0 ~ 247の間で値を選択できます。248から255までのアドレスは予約されています。
モジュール内のデータは4つのテーブルに格納され、そのうち2つは読み取り専用で、他の2つは読み取り専用です。各テーブルは9999個の値を保持できます。
表の概要を以下に示します。
- ディスクリート出力コイルDOレジスタ番号1-9999、HEXアドレス範囲0000 ~ 270E
- ディスクリート入力接点DI:読み取り専用、レジスタ番号10001-19999、HEXアドレス範囲0000 ~ 270E
- アナログ入力レジスタAI:読み取り専用、レジスタ番号300 01 ~ 39999、HEXアドレス範囲0000 ~ 270E
- アナログ出力保持レジスタAOレジスタ番号40001-49999、HEXアドレス範囲0000 ~ 270E
各テーブルにはレジスタ番号(AOの場合は40001など)があり、これはアドレス(0000など)に対応します。この违いを“オフセット”と呼ぶ。テーブルのオフセットは、それぞれ1,10001、300 01、40001です。
例を挙げると、40108から40110までのレジスタからデバイスアドレス17のAI値を取得するModbus RTUリクエストは次のとおりです。
11 03 006B 0003 7687
この分解は以下の通り。
11:SlaveIDデバイスアドレス(10進法で17、HEXで11)03::関数コード006B最初のレジスタのアドレス0003:必要なレジスタ数(40108から40110までの3つのレジスタを取得)7687CRCチェックサム
Modbus RTUスレーブは応答します:
11 03 06 AE41 5652 4340 49AD
これは以下の通り。
- デバイスのアドレス:
11(または10進数で17) - 機能コード:
03 - バイト数(6バイトが后に続くことを意味する):
06 - 値AO0、AO1、AO2を2バイトシーケンスとして登録
- CRC値は
49AD与えられた
アナログ出力レジスタの値は、以下のような様々な方法で解釈できます。
- 16ビット符号なし整数0 ~ 6553 5の范囲として
- 16ビット符号付き整数(範囲-32 7 6 8 ~ 32 7 6 7)
- 2文字のASCII文字列
- 離散的なオン/オフ値(0または1)として
- 32ビット符号なし整数(範囲0 ~ 4,294,96 7,295)
- 32ビット符号付き整数として范囲-2,147,483,648 ~ 2,147,483,647
- 32ビット単精度IEEE浮動小数点数(範囲1.2×10^−38 ~ 3.4×10^+38)
- 4文字のASCII文字列として

Modbus RTUコマンドとは?
以下はModbus RTUレジスタの読み書きに使用されるコード表です。
| 関数コードの機能 | 機能的な操作 | データ型 | アクセスの種類 |
|---|---|---|---|
| 01 (0x01) | DOの読み取り | 離散出力コイル状態 | Read ingとは |
| 02 (0x02) | 読み取りDI | 個別入力ステータス | Read ingとは |
| 03 (0x03) | AOの読み取り | レジスタを保持する。 | 16位。 |
| 04 (0x04) | AIを読む | 入力レジスタ。 | 16位。 |
| 05 (0x05) | Doを書く。 | 強制シングルコイル | ディスクリート |
| 06 (0x06) | 略称はAO。 | プリセットシングルレジスタ | 16位。 |
| 15 (0x0F) | マルチDO書き込み | 強制マルチコイル | ディスクリート |
| 16 (0x10) | 複数の書き込み。 | プリセットマルチレジスタ | 16位。 |
Modbus RTUコマンドを送信して離散出力を読み取る方法コマンド0 x 0 1
このコマンドは、DOデジタル出力の値を読み込むために使用します。
PDU要求は、最初のDOレジスタの開始アドレスと、それ以降に必要なDO値の数を指定します。PDUでは、DO値はゼロからアドレッシングされます。
応答のDO値は、ビットの値に対応する1バイトです。
ビット値は、1 = ON、0 = OFFと定義されます。
最初のデータバイトの下位ビットには、リクエストで指定されたアドレスのDO値が含まれます。残りのDO値は、バイトの最大値まで増加した値に従います。右から左へ。
要求されたDO値が8未満の場合、レスポンスの残りのビットはゼロでパディングされます(ローバイトからハイバイトへ)。バイトカウントはさらに、応答内のデータの完全なバイト数を示します。
デバイスのSlaveIDアドレス17に対する、20から56までのDOクエリの例。最初のレジスタのアドレスは、アカウントがアドレス0から始まるため、0 0 1 3 16進数=19になります(0 0 1 4 16進数=20、-1ゼロオフセット= 0 0 1 3 16進数=19となります)。
| バイト数 | リクエストリクエスト | バイト数 | Replyとは |
|---|---|---|---|
| (Hex) | フィールド名Field Name | (Hex) | フィールド名Field Name |
| 11 | デバイスアドレス | 11 | デバイスアドレス |
| 01 | 関数コードの機能 | 01 | 関数コードの機能 |
| 00 | 最初のレジスタアドレスハイバイト | 05 | バイト数が増える。 |
| 13 | 最初のレジスタアドレスはローバイトです。 | CD | DO 27-20のレジスタ値1100 1101 |
| 00 | レジスタ数高バイト | 6B | DO 35-28のレジスタ値0110 1011 |
| 25 | レジスタ数低バイト | B2 | DO 43-36のレジスタ値1011 0010 |
| 0E | CRC-16(Modbus) | 0E | DO 51-44のレジスタ値0000 1110 |
| 84 | CRC-16(Modbus) | 1B | DO 56-52のレジスタ値0001 1011 |
| 45 | CRC-16(Modbus) | ||
| E6 | CRC-16(Modbus) | ||
| DO27 -20の出力ステータスは、バイトCDの16進値、またはバイナリシステムでは1100 1101として表示されます。 |
レジスタDO56 -52では、右辺は5ビットを要求し、残りのビットはゼロでパディングされて完全なバイト(0001 1011)を得る。
| チャンネルチャンネル | - | - | - | DO 56 | DO 55 | DO 54 | DO 53 | DO 52 |
|---|---|---|---|---|---|---|---|---|
| ビット·ビット | 00 | 01 | 1 | 01 | 1 | |||
| 16進法 | 1B |
Modbus RTUコマンドを送信してデジタル入力を読み取る方法コマンド0 x 0 2
このコマンドは、数値入力DIの値を読み取るために使用します。
デバイスのSlaveIDアドレス17に対するレジスタ# 10197から10218までのDI要求の例。アカウントはアドレス0から始まるため、最初のレジスタのアドレスは00 C 4 16進数=196になります。
| バイト数 | リクエストリクエスト | バイト数 | Replyとは |
|---|---|---|---|
| (Hex) | フィールド名Field Name | (Hex) | フィールド名Field Name |
| 11 | デバイスアドレス | 11 | デバイスアドレス |
| 02 | 関数コードの機能 | 02 | 関数コードの機能 |
| 00 | 最初のレジスタアドレスハイバイト | 03 | バイト数が増える。 |
| C4 | 最初のレジスタアドレスはローバイトです。 | AC | DI 1020 4 -10197のレジスタ値(1010 1100) |
| 00 | レジスタ数高バイト | DB | DI10212 -10205のレジスタ値1101 1011 |
| 16 | レジスタ数低バイト | 35 | DI10218 -10213のレジスタ値0011 0101 |
| BA | CRC-16(Modbus) | 20 | CRC-16(Modbus) |
| A9 | CRC-16(Modbus) | 18 | CRC-16(Modbus) |
Modbus RTUコマンドを送信してアナログ出力を読み取る方法は?オーダー 0 x 0 3
このコマンドは、アナログ出力AOの値を読み込むために使用します。
レジスタ#40108から40110までのAO要求例、デバイスのSlIDアドレス17。最初のレジスタのアドレスは、アカウントがアドレス0から始まるため、0 0 6 B 16進数=107になります。
| バイト数 | リクエストリクエスト | バイト数 | Replyとは |
|---|---|---|---|
| (Hex) | フィールド名Field Name | ( |
Hex|フィールド名Field Name
11人。|デバイスアドレス|11人。|デバイスアドレス
0 3。|関数コードの機能|0 3。|関数コードの機能
0 0 0|最初のレジスタアドレスハイバイト|0 6.|バイト数が増える。
6 B。|最初のレジスタアドレスはローバイトです。|AEとは|#40108のレジスタ値が高い
0 0 0|レジスタ数高バイト|41歳。|#40108のレジスタ値が低い
0 3。|レジスタ数低バイト|56歳。|#40109の登録値が高い
76歳。|CRCチェックサム|52歳。|#40109のレジスタ値が低い
87歳。|CRCチェックサム|43歳。|#40110のレジスタ値が高い
40歳。|#40110のレジスタ値が低い
49 | CRC-16(Modbus)
AD | CRC-16(Modbus)
Modbus RTUコマンドを送信してアナログ入力を読み取る方法は?オーダー 0 x 0 4
このコマンドは、アナログ入力AIの値を読み取るために使用します。
レジスタ#300 09からデバイスのSlaveIDアドレス17に対するAIリクエストの例。最初のレジスタのアドレスは、アカウントがアドレス0から始まるため、0 0 08 16進数=8です。
| バイト数 | リクエストリクエスト | バイト数 | Replyとは |
|---|---|---|---|
| (Hex) | フィールド名Field Name | (Hex) | フィールド名Field Name |
| 11 | デバイスアドレス | 11 | デバイスアドレス |
| 04 | 関数コードの機能 | 04 | 関数コードの機能 |
| 00 | 最初のレジスタアドレスハイバイト | 02 | バイト数が増える。 |
| 08 | 最初のレジスタアドレスはローバイトです。 | 00 | #300 09の登録値が高い |
| 00 | レジスタ数高バイト | 0A | #300 09のレジスタ値が低い |
| 01 | レジスタ数低バイト | F8 | CRC-16(Modbus) |
| B2 | CRC-16(Modbus) | F4 | CRC-16(Modbus) |
| 98 | CRC-16(Modbus) |
Modbus RTUコマンドを送信して離散出力に書き込む方法は?コマンド0 x 0 5
このコマンドは、DOデジタル出力の値を記録します。
値FF 00の16进数は、出力をONにします。
値00 00の16进数は出力をOFFにします。
その他の値はすべて無効であり、出力値には影響しません。
このようなリクエストに対する通常の応答は、DOステータスが変更された後に返されるエコー(レスポンス内の繰り返しリクエスト)です。
例として、デバイスのSlaveIDアドレス17のレジスタ# 173のDOレコードが使用される。レジスタアドレスは0アドレスからをするため、00AC 16进数=172である。
| バイト数 | リクエストリクエスト | バイト数 | Replyとは |
|---|---|---|---|
| (Hex) | フィールド名Field Name | (Hex) | フィールド名Field Name |
| 11 | デバイスアドレス | 11 | デバイスアドレス |
| 05 | 関数コードの機能 | 05 | 関数コードの機能 |
| 00 | 最初のレジスタアドレスハイバイト | 00 | 最初のレジスタアドレスハイバイト |
| AC | 最初のレジスタアドレスはローバイトです。 | AC | 最初のレジスタアドレスはローバイトです。 |
| FF | ハイバイト値 | FF | ハイバイト値 |
| 00 | 低バイト値 | 00 | 低バイト値 |
| 4E | CRC-16(Modbus) | 4E | CRC-16(Modbus) |
| 8B | CRC-16(Modbus) | 8B | CRC-16(Modbus) |
| DO173出力ステータスがOFFからONに変更されました。 |
アナログ出力を記録するModbus RTUコマンドを送信する方法は?オーダー 0 x 0 6
このコマンドは、アナログ出力AOの値を記録します。
例として、デバイスのSlaveIDアドレス17のレジスタ# 40002のAOレコードが使用される。最初のレジスタのアドレスは0001 16進数=1で、アドレス0から記録が開始される。
| バイト数 | リクエストリクエスト | バイト数 | Replyとは |
|---|---|---|---|
| (Hex) | フィールド名Field Name | (Hex) | フィールド名Field Name |
| 11 | デバイスアドレス | 11 | デバイスアドレス |
| 06 | 関数コードの機能 | 06 | 関数コードの機能 |
| 00 | 最初のレジスタアドレスハイバイト | 00 | 最初のレジスタアドレスハイバイト |
| 01 | 最初のレジスタアドレスはローバイトです。 | 01 | 最初のレジスタアドレスはローバイトです。 |
| 00 | ハイバイト値 | 00 | ハイバイト値 |
| 03 | 低バイト値 | 03 | 低バイト値 |
| 9A | CRC-16(Modbus) | 9A | CRC-16(Modbus) |
| 9B | CRC-16(Modbus) | 9B | CRC-16(Modbus) |
Modbus RTUコマンドを送信して複数のディスクリートピンに書き込む方法コマンド0 x 0F
このコマンドは、DOデジタル出力の複数の値を記録するために使用します。
例として、デバイスのSlaveIDアドレス17のレジスタ# 20から# 29までの複数のDOを書き込みます。レジスタアドレスは0アドレスから記録が始まるため、0 013 16進数=19です。
| バイト数 | リクエストリクエスト | バイト数 | Replyとは |
|---|---|---|---|
| (Hex) | フィールド名Field Name | (Hex) | フィールド名Field Name |
| 11 | デバイスアドレス | 11 | デバイスアドレス |
| 0F | 関数コードの機能 | 0F | 関数コードの機能 |
| 00 | 最初のレジスタアドレスハイバイト | 00 | 最初のレジスタアドレスハイバイト |
| 13 | 最初のレジスタアドレスはローバイトです。 | 13 | 最初のレジスタアドレスはローバイトです。 |
| 00 | レジスタ数高バイト | 00 | 記録されたレジスタ数High Bytes |
| 0A | レジスタ数低バイト | 0A | 記録されたレジスタ数低バイト |
| 02 | バイト数が増える。 | 26 | CRC-16(Modbus) |
| CD | DO 27-20のバイト値1100 1101 | 99 | CRC-16(Modbus) |
| 01 | DO 29-28のバイト値(0000 0001) | ||
| BF | CRC-16(Modbus) | ||
| 0B | CRC-16(Modbus) |
答えは記録されたレジスタの数を返します。
複数のアナログ出力を記録するModbus RTUコマンドを送信する方法は?オーダー 0 x 10
このコマンドは、アナログ出力AOの複数の値を記録するために使用します。
例として、デバイスのSlaveIDアドレス17のレジスタ# 40002と# 40003から複数のAOを記録します。最初のレジスタのアドレスは0001 16進数=1で、アドレス0から記録が開始される。
| バイト数 | リクエストリクエスト | バイト数 | Replyとは |
|---|---|---|---|
| (Hex) | フィールド名Field Name | (Hex) | フィールド名Field Name |
| 11 | デバイスアドレス | 11 | デバイスアドレス |
| 10 | 関数コードの機能 | 10 | 関数コードの機能 |
| 00 | 最初のレジスタアドレスハイバイト | 00 | 最初のレジスタアドレスハイバイト |
| 01 | 最初のレジスタアドレスはローバイトです。 | 01 | 最初のレジスタアドレスはローバイトです。 |
| 00 | レジスタ数高バイト | 00 | 記録されたレジスタ数High Bytes |
| 02 | レジスタ数低バイト | 02 | 記録されたレジスタ数低バイト |
| 04 | バイト数が増える。 | 12 | CRC-16(Modbus) |
| 00 | 40002高い値 | 98 | CRC-16(Modbus) |
| 0A | 40002低値 | ||
| 01 | 40003高い値 | ||
| 02 | 40003の低値 | ||
| C6 | CRC-16(Modbus) | ||
| F0 | CRC-16(Modbus) |

Modbusリクエストのエラー
デバイスがリクエストを受信しても処理できない場合、デバイスはエラーコードで応答します。
レスポンスには、上位バイトが1の修正された機能コードが含まれます。
例:
| 元の値 | 結果の値 |
|---|---|
| リクエスト内の機能コード | 応答内の機能エラーコード |
| 01 (01 hex) 0000 0001 | 129 (81 hex) 1000 0001 |
| 02 (02 hex) 0000 0010 | 130 (82 hex) 1000 0010 |
| 03 (03 hex) 0000 0011 | 131 (83 hex) 1000 0011 |
| 04 (04 hex) 0000 0100 | 132 (84 hex) 1000 0100 |
| 05 (05 hex) 0000 0101 | 133 (85 hex) 1000 0101 |
| 06 (06 hex) 0000 0110 | 134 (86 hex) 1000 0110 |
| 15 (0F hex) 0000 1111 | 143 (8F hex) 1000 1111 |
| 16 (10 hex) 0001 0000 | 144 (90 hex) 1001 0000 |
エラーのある要求と応答の例:
| バイト数 | リクエストリクエスト | バイト数 | 応答する。 |
|---|---|---|---|
| (Hex) | フィールド名Field Name | (Hex) | フィールド名Field Name |
| 0A | デバイスアドレス | 0A | デバイスアドレス |
| 01 | 関数コードの機能 | 81 | 変更された機能コード |
| 04 | 最初のレジスタアドレスハイバイト | 02 | エラーコード |
| A1 | 最初のレジスタアドレスはローバイトです。 | B0 | CRC-16(Modbus) |
| 00 | レジスタ数高バイト | 53 | CRC-16(Modbus) |
| 01 | レジスタ数低バイト | ||
| AC | CRC-16(Modbus) | ||
| 63 | CRC-16(Modbus) |
エラーコードの説明
0 1。|承認された機能コードは処理できません。
0 2。|要求で指定されたデータアドレスは使用できません。
0 3。|クエリーデータフィールドに含まれる値は无効です。
0 4。|スレーブが要求された操作を実行しようとしたときに、回復不可能なエラーが発生しました。
0 5.|スレーブはリクエストを受け付け、処理中ですが、時間がかかります。このレスポンスでは、ホストがタイムアウト·エラーを生成することを防ぎます。
0 6.|スレーブはコマンドの処理で忙しいです。ホストは、スレーブがアイドル状態のときにメッセージを繰り返す必要があります。
0 7は|スレーブは要求で指定されたプログラム機能を実行できません。機能番号13または14を使用した失敗したプログラム要求は、このコードを返す。ホストはスレーブから診断情報またはエラーメッセージを要求する必要があります。
0 8。|スレーブステーションで拡張メモリの読み取り中にパリティエラーが検出されました。ホストはリクエストを繰り返すことができますが、通常はこの場合に修理が必要になります。
发表回复