Modbus RTUコマンドと応答メカニズムの詳細な解析

無料無料技术资料

这篇内容可直接阅读,适合用于基础学习和検索引流。

Modbus RTUコマンドと応答メカニズムの詳細な解析
Modbus RTUコマンドと応答メカニズムの詳細な解析插图

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コマンドと応答メカニズムの詳細な解析插图1

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最初のレジスタアドレスはローバイトです。CDDO 27-20のレジスタ値1100 1101
00レジスタ数高バイト6BDO 35-28のレジスタ値0110 1011
25レジスタ数低バイトB2DO 43-36のレジスタ値1011 0010
0ECRC-16(Modbus)0EDO 51-44のレジスタ値0000 1110
84CRC-16(Modbus)1BDO 56-52のレジスタ値0001 1011
45CRC-16(Modbus)
E6CRC-16(Modbus)
DO27 -20の出力ステータスは、バイトCDの16進値、またはバイナリシステムでは1100 1101として表示されます。

レジスタDO56 -52では、右辺は5ビットを要求し、残りのビットはゼロでパディングされて完全なバイト(0001 1011)を得る。

チャンネルチャンネル---DO 56DO 55DO 54DO 53DO 52
ビット·ビット00011011
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最初のレジスタアドレスはローバイトです。ACDI 1020 4 -10197のレジスタ値(1010 1100)
00レジスタ数高バイトDBDI10212 -10205のレジスタ値1101 1011
16レジスタ数低バイト35DI10218 -10213のレジスタ値0011 0101
BACRC-16(Modbus)20CRC-16(Modbus)
A9CRC-16(Modbus)18CRC-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レジスタ数低バイトF8CRC-16(Modbus)
B2CRC-16(Modbus)F4CRC-16(Modbus)
98CRC-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低バイト値
4ECRC-16(Modbus)4ECRC-16(Modbus)
8BCRC-16(Modbus)8BCRC-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低バイト値
9ACRC-16(Modbus)9ACRC-16(Modbus)
9BCRC-16(Modbus)9BCRC-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バイト数が増える。26CRC-16(Modbus)
CDDO 27-20のバイト値1100 110199CRC-16(Modbus)
01DO 29-28のバイト値(0000 0001)
BFCRC-16(Modbus)
0BCRC-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バイト数が増える。12CRC-16(Modbus)
0040002高い値98CRC-16(Modbus)
0A40002低値
0140003高い値
0240003の低値
C6CRC-16(Modbus)
F0CRC-16(Modbus)
Modbus RTUコマンドと応答メカニズムの詳細な解析插图2

Modbusリクエストのエラー

デバイスがリクエストを受信しても処理できない場合、デバイスはエラーコードで応答します。

レスポンスには、上位バイトが1の修正された機能コードが含まれます。

例:

元の値結果の値
リクエスト内の機能コード応答内の機能エラーコード
01 (01 hex) 0000 0001129 (81 hex) 1000 0001
02 (02 hex) 0000 0010130 (82 hex) 1000 0010
03 (03 hex) 0000 0011131 (83 hex) 1000 0011
04 (04 hex) 0000 0100132 (84 hex) 1000 0100
05 (05 hex) 0000 0101133 (85 hex) 1000 0101
06 (06 hex) 0000 0110134 (86 hex) 1000 0110
15 (0F hex) 0000 1111143 (8F hex) 1000 1111
16 (10 hex) 0001 0000144 (90 hex) 1001 0000

エラーのある要求と応答の例:

バイト数リクエストリクエストバイト数応答する。
(Hex)フィールド名Field Name(Hex)フィールド名Field Name
0Aデバイスアドレス0Aデバイスアドレス
01関数コードの機能81変更された機能コード
04最初のレジスタアドレスハイバイト02エラーコード
A1最初のレジスタアドレスはローバイトです。B0CRC-16(Modbus)
00レジスタ数高バイト53CRC-16(Modbus)
01レジスタ数低バイト
ACCRC-16(Modbus)
63CRC-16(Modbus)

エラーコードの説明

0 1。|承認された機能コードは処理できません。
0 2。|要求で指定されたデータアドレスは使用できません。
0 3。|クエリーデータフィールドに含まれる値は无効です。
0 4。|スレーブが要求された操作を実行しようとしたときに、回復不可能なエラーが発生しました。
0 5.|スレーブはリクエストを受け付け、処理中ですが、時間がかかります。このレスポンスでは、ホストがタイムアウト·エラーを生成することを防ぎます。
0 6.|スレーブはコマンドの処理で忙しいです。ホストは、スレーブがアイドル状態のときにメッセージを繰り返す必要があります。
0 7は|スレーブは要求で指定されたプログラム機能を実行できません。機能番号13または14を使用した失敗したプログラム要求は、このコードを返す。ホストはスレーブから診断情報またはエラーメッセージを要求する必要があります。
0 8。|スレーブステーションで拡張メモリの読み取り中にパリティエラーが検出されました。ホストはリクエストを繰り返すことができますが、通常はこの場合に修理が必要になります。

この資料を実際のプロジェクトに活用しませんか?

ツールセンターで電文解析、CRCチェック、デバイスデバッグを行うか、要件を送信して選定と接続のアドバイスを受けましょう。

エンジニア会員

この記事を実行可能なデバッグ資料に

登録すると、高度な電文解析、資料パックのダウンロード、コード例、エンジニアリングケース、優先技術サポートが利用可能に。実際のプロジェクト納品に最適です。

高度なツール無制限
資料パックとコードパック
完全なエンジニアリングケースライブラリ
優先技術サポート窓口

发表回复

あなたのメールアドレスアドレス不会被公开。 必須項目已用 * 标注