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