MODBUS共通機能コード学習とModbusメッセージフォーマット例

転載: http://www.dzkfw.com.cn/Article/plc/7740.html

Modbus共通機能コードの学習と例

1. MODBUSレジスタの種類の説明

MODBUS は多くの機能コードをサポートしていますが、関係するレジスタはコイル レジスタ、ディスクリート入力レジスタ、保持レジスタ、入力レジスタの 4 つだけです。
レジスタの性質と関数コード間の関係を理解し​​ていれば、関数コードを理解することは実際には非常に簡単です。

レジスタの種類 読み取りおよび書き込みステータス ビット演算 ワード演算 適用機能コード
コイルレジスター 読み書き 少し 01H (読み取り); 05H (単一ビットの書き込み); 0FH (複数ビットの書き込み)
ディスクリート入力レジスタ 読み取り専用 少し 02H
保持レジスター 読み書き キャラクター 03H (読み取り); 06H (単一バイトの書き込み); 0FH (複数バイトの書き込み)
入力レジスタ 読み取り専用 キャラクター 04H

コイルレジスタ: スイッチ値と比較することができ、各ビットは信号のスイッチ状態に対応します。したがって、1 バイトで 8 方向の信号を同時に制御できます。たとえば、外部 8 ウェイ IO のレベルを制御します。コイルレジスタは、ソレノイドバルブのスイッチ状態の制御や読み取りなど、読み取りと書き込みをサポートします。対応する機能コードは次のとおりです: 0x01 0x05 0x0f

ディスクリート入力レジスタ: ディスクリート入力レジスタはコイル レジスタの読み取り専用モードに相当し、各ビットはスイッチ値を表し、そのスイッチ値は読み取りのみ可能で書き込みはできません。入力状態は外部設定によってのみ変更でき、たとえば外部ボタンが押されたか離されたかを読み取ることはできますが、ボタンを制御することはできません。対応する機能コードは次のとおりです: 0x02

保持レジスタ: レジスタの単位はビットではなく 2 バイトです。つまり、特定の量のデータを格納でき、読み書き可能です。たとえば、センサーのアラームの上限と下限を読み取り、そのサイズを設定することもできます。対応する機能コードは次のとおりです: 0x03 0x06 0x10

入力レジスタ: 入力レジスタは、保持レジスタの読み取り専用モードと同等で、読み取りのみをサポートしますが、書き込みはサポートしません。レジスタも 2 バイトのスペースを占有します。たとえば、現在のアナログ サンプリング値は、入力レジスタを読み取ることで取得できます。対応する機能コードは0x04です。

2. MODBUSファンクションコードの一部

MODBUS は多くの機能コードをサポートしていますが、実際のアプリケーションで一般的に使用されるものはほんのわずかです。

Modbus の 4 つのレジスタ タイプ (コイル レジスタ、ディスクリート入力レジスタ、ホールディング レジスタ、入力レジスタ) を上で紹介し、対応する機能コードをレジスタの観点から理解します。一般的に使用される機能コードを以下に示します。

ファンクションコード 名前 データの種類 効果
0x01 コイルレジスタの読み取り 少し ロジックコイル群の現在の状態(ON/OFF)を取得します。
0x02 ディスクリート入力レジスタの読み取り 少し スイッチ入力グループの現在の状態(ON/OFF)を取得します。
0x03 保持レジスタの読み取り 整数、浮動小数点、文字 1 つ以上の保持レジスタ内の現在のバイナリ値を取得します
0x04 入力レジスタの読み取り 整数、浮動小数点 1 つ以上の入力レジスタの現在のバイナリ値を取得します
0x05 シングルコイルレジスタを書き込む 少し ロジックコイルのオン/オフ状態を強制します。
0x06 単一の保持レジスタに書き込みます 整数、浮動小数点、文字 特定のバイナリ値を保持レジスタにロードします
0x0f 複数のコイルレジスタを書き込む 少し 連続するロジック コイルのチェーンのオンとオフを強制します。
0x10 複数の保持レジスタを書き込む 整数、浮動小数点、文字

特定のバイナリ値を連続した一連の保持レジスタにロードします。

3. MODBUSファンクションコード例

1. ファンクションコード:01H コイルレジスタ読み出し

1) 機能: スレーブ ステーションのコイル レジスタの読み取り、ビット操作、単一または複数の読み取りが可能
2) マスターがコマンドを送信: ホストは
次のデータを送信します:スレーブ ステーションのアドレス + ファンクション コード + レジスタ開始アドレス + レジスタ番号 + チェック コードが
スレーブを想定します。ステーションアドレスは0x01、コイルレジスタの開始アドレスは0x0021、終了アドレスは0x002c、つまりレジスタアドレス範囲は0x0021~0x0032で、合計12個の連続したコイルステータス値が読み取られ、ホストは、次の図に示すようにコマンドを送信します。

スレーブアドレス ファンクションコード レジスタ開始アドレス上位8ビット レジスタ開始アドレスの下位8ビット レジスタ数の上位8ビット レジスタ番号の下位8ビット CRCチェックの下位8ビット CRCチェック上位8ビット
0x01 0x01 0x00 0x21 0x00 0x0c 0xXX 0xXX

3) スレーブ局からのレスポンス返信:
スレーブ局レスポンスで返信されるデータは、スレーブ局アドレス + ファンクションコード + 返信バイト数 + データ値 + チェックコード
このうち、返信データ値の各ビットがコイルに対応します。状態、コイルの状態が ON の場合、その値は 1; 状態が OFF の場合、その値は 0;
[データはリトルエンディアン形式で保存されます。つまり、最下位ビットは、コイルの最下位アドレスに保存されます。メモリ (バイナリの右側にあります)。8 ビットごとに 1 バイトを構成し、コイル数が 8 の倍数に満たない場合は、残りのビットに 0 を加算します。

スレーブアドレス ファンクションコード バイト数を返します データ1 データ2 CRCチェックの下位8ビット CRCチェック上位8ビット
0x01 0x01 0x02 0xCB 0x0B 0xXX 0xXX

この例では、12 個のコイルが読み取られ、12/8 の商は 1、余りは 4 になるため、応答データを保存するために 2 バイトが必要となり、返されるバイト数は 2 になります。バイト 1 にはコイル番号 21 ~ 28 の値が格納されます (リトルエンディアンのバイトオーダー、コイル 28 の値は bit7 に格納され、コイル 21 の値は bit0 に格納されます)、バイト 2 にはコイル番号 29 ~ 32
の値が格納されます
、残りのビットは 0 を追加して埋めます。

上の表で、data1 は 0x0021 ~ 0x0028 のコイルの状態を示し、data1 の最下位ビットは最下位アドレスのコイルの状態を示します; data1:
0xCB=1100 1011 の場合、data1 のコイルの状態は次の表に示されます。

コイルアドレス ファンクションコード 0x28 0x27 0x26 0x25 0x24 0x23 0x22 0x21
価値 0x01 1 1 0 0 1 0 1 1

data2 はアドレス 0x0030 ~ 0x0038 のコイルのステータスを示します。これは 8 ビット未満であり、バイトの上位ビットは 0 で埋められます。
data2: 0x0B=0000 1011 の場合、data2 のコイルの状態は次の表に示されます。

コイルアドレス ファンクションコード 0x30 0x2f 0x2e 0x2d 0x2c 0x2b 0x2a 0x29
価値 0x01 0 0 0 0 1 0 1 1

2. ファンクションコード: 02H ディスクリート入力レジスタの読み取り

1) 機能: ディスクリート入力レジスタの読み取り、ビット操作、機能コード 0X01 と同様、単一または複数の読み取りが可能ですが、ここでは省略します。

3. ファンクションコード:03H リード保持レジスタ

1) 機能: スレーブ ステーション保持レジスタの読み取り、バイト操作、単一または複数の読み取りが可能; 各保持レジスタは 2 バイト (16 ビット) を占有; 2) マスターが命令を送信: マスターは次のデータを送信します: スレーブ ステーション アドレス + 機能コード
+
レジスタ開始アドレス + レジスタ番号 + チェックコード
スレーブ局のアドレスを 0x03、保持レジスタの開始アドレスを 0x003B、終了アドレスを 0x003D とすると、レジスタのアドレス範囲は 0x003B ~ 0x003D となり、 3 つの保持レジスタが読み取られたデータである場合、ホストは次の図に示すようにコマンドを送信します。

スレーブアドレス ファンクションコード レジスタ開始アドレス上位8ビット レジスタ開始アドレスの下位8ビット レジスタ数の上位8ビット レジスタ数の下位8ビット CRCチェックの下位8ビット CRCチェック上位8ビット
0x03 0x03 0x00 0x3B 0x00 0x03 0xXX 0xXX

3) スレーブ局応答返信:
スレーブ局応答で返されるデータは、スレーブ局アドレス + ファンクション コード + 返信バイト数 + データ値 + チェック コードを含みます。

スレーブアドレス ファンクションコード バイト数を返します データ1H データ1L データ2H データ2L データ3H データ3L CRCチェックの下位8ビット CRCチェック上位8ビット
0x03 0x03 0x06 0x1B 0x0B 0x0A 0x01 0xC2 0xDB 0xXX 0xXX

この例では、3 つの保持レジスタが読み取られ、各保持レジスタは 2 バイトを占有するため、応答データを格納するために 6 バイトが必要となり、返されるバイト数は 6 になります。
0x003B~0x003D 保持レジスタの値を下図に示します。

レジスタアドレス 0x003D 0x003C 0x003A
価値 0xC2 DB 0x0A 01 0x1B 0B

4. ファンクションコード:04H リード入力レジスタ

1) 機能: 入力レジスタの読み取り、バイト操作、機能コード 0X03 と同様、単一または複数の読み取りが可能ですが、ここでは省略します。

5. ファンクションコード:05H シングルコイルレジスタの書き込み

1) 機能: 単一コイルへの書き込み操作、ビット操作、いずれか 1 つだけ書き込み可能。0xFF00の書き込みはコイルをオンにすることを意味し、0x0000の書き込みはコイルをオフにすることを意味し、その他の値は無効です;
2) ホストが命令を送信: ホスト
は次のデータを送信します:スレーブステーションアドレス + ファンクションコード + レジスタ開始アドレス + データ値+ チェックコード
スレーブ局のアドレスを0x03、コイルレジスタの先頭アドレスを0x0032としてONにするには、マスタは下表のようなコマンドを送信します。

スレーブアドレス ファンクションコード レジスタ開始アドレス上位8ビット レジスタ開始アドレスの下位8ビット データH 到着 CRCチェックの下位8ビット CRCチェック上位8ビット
0x03 0x05 0x00 0x32 0xff 0x00 0xXX 0xXX

3) スレーブ局からのレスポンス返信 スレーブ
局のレスポンスデータには、スレーブ局アドレス + ファンクションコード + レジスタアドレス + 書き込み値 + チェックコードが
含まれます。 データ書き込みが成功した場合、レスポンスデータはリクエストデータと同じになります。 、次の表に示すように。

スレーブアドレス ファンクションコード レジスタ開始アドレス上位8ビット レジスタ開始アドレスの下位8ビット データH 到着 CRCチェックの下位8ビット CRCチェック上位8ビット
0x03 0x05 0x00 0x32 0xff 0x00 0xXX 0xXX

6. ファンクションコード: 06H 単一の保持レジスタに書き込みます|

1) 機能: 単一保持レジスタへの書き込み操作、バイト操作、1 つだけ書き込み可能。
2) ホストが命令を送信します。ホスト
は、スレーブ ステーション アドレス + ファンクション コード + レジスタ開始アドレス + データ値 + チェック コードを
含むデータを送信します。スレーブ ステーション アドレスが 0x01、コイル レジスタの開始アドレスが 0x0048 であると仮定します。書き込まれた値は 0x1234 で、ホストは次の表に示すコマンドを送信します。

スレーブアドレス ファンクションコード レジスタ開始アドレス上位8ビット レジスタ開始アドレスの下位8ビット データH 到着 CRCチェックの下位8ビット CRCチェック上位8ビット
0x01 0x06 0x00 0x48 0x12 0x34 0xXX 0xXX

3) スレーブ局からの応答:
スレーブ局の応答データには、スレーブ局アドレス + ファンクション コード + レジスタ アドレス + 書き込み値 + チェック コードが
含まれます。データの書き込みが成功した場合、応答データは要求データと同じになります。 。

おすすめ

転載: blog.csdn.net/chentiebo/article/details/131101913