Modbus関数コードは、Modbusメッセージフレーム(メッセージ)の重要な部分であり、ModbusプロトコルにおけるCommunicationトランザクション処理の基礎となる。

概要:概要
Modbus関数コードは1バイトを取り、値は1~127(すなわち0 x 0 1 ~ 0 x 7F)の範囲です。一方、関数コード+0 x 80は例外状態を表し、129~255は例外コードを表します。
Modbus標準プロトコルでは、3種類のModbus関数コードが規定されている。
- パブリック機能コード
- 明確に定義された機能コード;
- 独自性の確保
- Modbus Associationによって確認され、公開文書が提供されます。
- 適合性テストが可能です。
- プロトコル定義の機能コードと将来の使用のための予約機能コードが含まれます。
- ユーザー定義機能コード
- 2つのユーザー定義機能コード領域があり、それぞれ65です。
72と100110; - ユーザーカスタマイズ、一意性のはない。
- 2つのユーザー定義機能コード領域があり、それぞれ65です。
- 機能コードの予約
- 機能コードの保持は、歴史的な理由により、一部の企業のレガシー製品で現在使用されている機能コードが一般に使用されていない。
このチュートリアルでは、Modbusプロトコルの共通機能コードの一部を次の表に示します。
| コードコード。 | 名前は | 英語では | レジスタPLCアドレス | ビット/ワードOperation | オペレーション数 |
|---|---|---|---|---|---|
| 01 | コイル状態の読み取り | Read Coils | 00001~09999 | ビットOperation。 | 単一または複数。 |
| 02 | 離散入力ステータスの読み取り | Read Discrete Inputs | 10001~19999 | ビットOperation。 | 単一または複数。 |
| 03 | リードホールドレジスタ | Read Holding Registers | 40001~49999 | 言葉のOperation | 単一または複数。 |
| 04 | 読み取り入力レジスタ | Read Input Registers | 30001~39999 | 言葉のOperation | 単一または複数。 |
| 05 | シングルコイルを書く。 | Write Single Coil | 00001~09999 | ビットOperation。 | シングル |
| 06 | 単一保持レジスタの書き込み | Write Single Register | 40001~49999 | 言葉のOperation | シングル |
| 15 | 複数のコイルを書く。 | Write Multiple Coils | 00001~09999 | ビットOperation。 | 多くの人 |
| 16 | 複数の保持レジスタを書き込む | Write Multiple Registers | 40001~49999 | 言葉のOperation | 多くの人 |
機能コードのOperationは2種類にminけられます。
- ビットOperation--最小単位は1ビットbitであり、コイル状態機能コード01を読み取り、離散入力状態機能コード02を読み取り、単一コイル機能コード05を書き込み、複数コイル機能コード15を書き込むことを含む;
- ワードOperation - 最小単位は2バイトであり、リードホールドレジスタコード03、リード入力レジスタコード04、书き込みシングルホールドレジスタコード06、书き込みホールドレジスタコード16を含む。
関数コードの特徴
0 x 0 1コイル/ディスクリート出力値の読み取り
- このコードは、デバイスのコイルまたはvalueから出力される、すなわち各 DO(rete、出力)のON/OFFを読み取るためのものである。
- メッセージフレームには、リードするコイル開始アドレスとコイル数が指定されます。
- 開始アドレスは2バイトで構成され、値は0 x 0000から0 x FFFFの範囲です。
- コイルの数は2バイトで構成され、値の範囲は0 x 00 01から0 x 0 7 D0(すなわち10進法1~2000)です。
- Modbusプロトコルが規定するPDUでは、全てのコイル又はレジスタアドレスが0から計算されることが規定されていることに留意されたい。
0 x 0 2離散入力値の読み取り
- このコードは、スレーブのディスクリート入力、すなわちDI(rete)のON/OFFを読み出すために使用される。
- メッセージフレームには、開始アドレスと読み取りが必要な離散入力レジスタの数が指定され、1~2000個の連続した離散入力状態を読み取ることができます。
- スレーブデバイスがマスタデバイスからの要求を受け入れると、関数コード02が返信され、離散入力変数の現在の状態が返されます(返されたDIの数が8の整数倍でない場合、最後のデータバイトの残りのビットは0で埋められます)。
- 開始アドレスは2バイトで構成され、値は0 x 0000から0 x FFFFの範囲です。
- 離散量は2バイトで構成され、値は0 x 00 01 ~ 0 x 0 7 D0(すなわち10進数1~2000)の範囲で、一度に最大2000個の離散入力状態値を読み取ることができます。
0 x 0 3保持レジスタ値の読み取り
- この機能コードは、スレーブ保持レジスタの内容を読み取るために使用され、ブロードキャストモードをサポートしていません。
- メッセージフレームには、読み出す必要のあるホールドレジスタの開始アドレスと数が指定され、ホールドレジスタ内の各アドレスの具体的な内容と意味は、デバイス開発者自身によって定義されます。
- 開始アドレスは2バイトで構成され、値は0 x 0000から0 x FFFFの範囲です。
- レジスタ数は2バイトで構成され、値の範囲は0 x 00 01 ~ 0 x 0 0 7 D(すなわち10進数1~125)で、一度に最大125個のレジスタ値を連続して読み取ることができます。
- Modbusの保持レジスタと入力レジスタはワード(Word)を基本単位としていることに注意されたい(1Wordは2Bytes)。したがって、読み出し時にエンディアン(サイズ端)の問題に注意が必要である。
0 x 0 4入力レジスタ値の読み込み
- 機能コードはスレーブデバイス入力レジスタの内容を読み取るために使用され、ブロードキャストモードをサポートしません。(0 3と同じ)
- メッセージフレームには、読み取りが必要な入力レジスタの開始アドレスと数が指定され、入力レジスタ内の各アドレスの具体的な内容と意味は、デバイス開発者自身によって定義されます。
- 開始アドレスは2バイトで構成され、値は0 x 0000から0 x FFFFの範囲です。
- レジスタ数は2バイトで構成され、値の範囲は0 x 00 01 ~ 0 x 0 0 7 D(すなわち10進数1~125)で、一度に最大125個のレジスタ値を連続して読み取ることができます。
- エンディアンの問題にも注意が必要です。
0 x 0 5単一コイル書き込み/単一ディスクリート出力
- この機能コードは、単一のコイルレジスタ(またはディスクリート出力)をオンまたはオフに設定し、ブロードキャストモードをサポートします。
- ブロードキャストモードでは、すべてのスレーブデバイスの同じアドレスの値が均一に変更されます。
- メッセージフレームには、変更が必要なコイルアドレスと設定された状態値が指定されている。
- 開始アドレスは2バイトで構成され、値は0 x 0000から0 x FFFFの範囲です。
- ターゲットデータ(すなわち、クエリメッセージ内のON/OFF状態)は、メッセージデータフィールドの定数によって指定され、0 x FF 00はON状態、0 x 0000はOFF状態を表し、残りの値はすべて不正です。
- Modbusプロトコルが規定するPDUでは、全てのコイル又はレジスタアドレスが0から計算されることが規定されていることに留意されたい。
0 x 0 6シングルホールドレジスタへの書き込み
- この関数コードは、ブロードキャストモードをサポートするスレーブデバイスの単一のホールドレジスタの値を更新するために使用されます。
- ブロードキャストモードでは、すべてのスレーブデバイスの同じアドレスの値が均一に変更されます。
- メッセージフレームにはスレーブアドレスおよび変更が必要な保持レジスタアドレスと設定値を指定する必要がある.
- 開始アドレスは2バイトで構成され、値は0 x 0000から0 x FFFFの範囲です。
- 変更先データは2バイトで構成され、値の範囲は0 x 0000から0 x FFFFです。
- 保持レジスタはワード(Word)を基本単位とし,書き込み時にはターゲットデータのエンディアンに注意する必要がある.
0 x 0 8診断機能
- この機能コードはシリアルリンクでのみ使用され、主にマスタとスレーブ間の通信障害の検出、またはスレーブの各種内部障害の検出に使用され、ブロードキャストに対応していません。
- クエリメッセージには、スレーブアドレス、コード(Command)、およびサブコード(ic Sub-function)を指定する必要がある。このうち、サブコードフィールドは2バイトであり、各タイプをするために使用される。
- 通常のレスポンスメッセージでは、スレーブデバイスは機能コードとサブ機能コードをそのまま返信します。
一般的なModbus診断サブファンクションコードは以下の通りです。
| 関数コードの特徴 | サブ機能コード | 説明する。 | 説明書は |
|---|---|---|---|
| 08 | 00(0x00) | Return Data Query (Loop-back) | そのまま問い合わせメッセージを返す |
| 08 | 01(0x01) | Restart Communications | スレーブ·デバイスの初期化と再起動に使用 その中で、報告書 0 x 00,0 x 00はイベントログを保持する。 0xFF、0x00は、ロギングの消去を意味します。 |
| 08 | 02(0x02) | Return Diagnostic Register | 診断レジスタの内容を返す |
| 08 | 03(0x03) | Change ASCII Input Delimiter | |
| 08 | 04(0x04) | Force Listen Only Mode | アドレス指定されたスレーブデバイスを強制的にリスニング専用モードにする ネットワーク内の他のデバイスから切断し、応答を返さない |
| 08 | 10(0x0A) | Clear Counters and Diagnostic Registers | カウンタとレジスタのクリア |
| 08 | 11(0x0B) | Return Bus Message Count | バスメッセージカウント値を返す |
| 08 | 12(0x0C) | Return Bus Communication Error Count | バスCommunication CRCエラーカウントを返す |
| 08 | 13(0x0D) | Return Bus Exception Error Count | バス例外カウントを返す |
| 08 | 14(0x0E) | Return Slave Message Count | ステーションデバイスから受信したメッセージ数を返します。 |
| 08 | 15(0x0F) | Return Slave No Response Count | スレーブデバイスが応答を返さなかったメッセージ数を返します。 |
| 08 | 16(0x10) | Return Slave NAK Count | |
| 08 | 17(0x11) | Return Slave Busy Count | スレーブデバイスがビジーに応答したメッセージ数を返します。 |
| 08 | 18(0x12) | Return Bus Character Overrun Count | バス文字が超過したメッセージ数を返す |
| 08 | 19(0x13) | Return IOP Overrun Count (884) | |
| 08 | 20(0x14) | Clear Overrun Counter and Flag (884) |
0 x 0BCommunicationイベントカウンタの取得
- この機能コードは、主にスレーブCommunicationカウンタからステータスワードとイベントカウントの値を取得するために使用され、ブロードキャストモードをサポートしていません。
- スレーブデバイスがメッセージを正常に処理するかどうかは、Communicationメッセージの前後にCommunicationイベントカウント値を読み取ることで判断できます。
- イベントカウンタは、メッセージ処理と送信が正常に完了する場合には1増加します。例外応答、ポーリングコマンド、または読み取りイベントカウンタ(すなわち、0 x 0B関数コード)の場合には変更されません。
- イベントレジスタは、0 x 0 8診断機能の0 x 0 1サブ機能と0 x 0 Aサブ機能を使用してリセットできます。
0 x 0CCommunicationイベントログの取得
- 関数コードは、主にスレーブデバイスからステータスワード、イベントカウント、メッセージカウント、イベントバイトフィールドを取得するために使用されます。
- ステータスワードとイベントカウントは、関数コード0 x 0Bで取得された値と一致します。
- メッセージカウンタには、起動およびクリアされた後のメッセージ数が含まれ、0 x 0 8診断機能の0 x 0Bサブファンクションコードで取得された値と一致します。
- イベントバイトフィールドは、0~64バイトを含み、種々のイベントを定義する。
- 通常、応答メッセージには、2バイトステータスワードフィールド、2バイトイベントカウントフィールド、2バイトメッセージカウントフィールド、および0~64バイトのイベントフィールドが含まれます。
- イベントフィールドは可変長であるため、レスポンスデータの読み取りを容易にするために1バイトのデータ長フィールドが追加されました。
0 x 0F複数のコイルを書き込む
- この機能コードは、連続した複数のコイル(または離散出力)をONまたはOFFにするために使用され、放送モードに対応します。
- ブロードキャストモードでは、すべてのスレーブデバイスの同じアドレスの値が均一に変更されます。
- メッセージフレームには、変更すべきコイル開始アドレスとコイル数が指定されている。
- 開始アドレスは2バイトで構成され、値は0 x 0000から0 x FFFFの範囲です。
- レジスタ数フィールドは2バイトで構成され、値の範囲は0 x 00 01から0 x 0 7 B0です。
- データフィールドのうち論理1のビットはONに対応し、論理0のビットはOFFに対応する。
0 x 10複数の保持レジスタを書き込む
- この機能コードは、スレーブがレジスタを保持する複数の連続したアドレスブロック1~123個のレジスタをセットまたは書き込むために使用され、ブロードキャストモードをサポートする。
- ブロードキャストモードでは、すべてのスレーブデバイスの同じアドレスの値が均一に変更されます。
- メッセージフレームには、スレーブアドレスおよび変更が必要な保持レジスタアドレスと数を指定する必要がある。
- 開始アドレスは2バイトで構成され、値は0 x 0000から0 x FFFFの範囲です。
- レジスタ数フィールドは2バイトで構成され、値の範囲は0 x 00 01から0 x 0 0 7 B(すなわち10進法1~123)です。
- 実際の開発では、この関数コードは浮動小数点値などのマルチバイト型データを簡単に記述するためによく使われます。したがって、エンディアンの問題に注意が必要である。
0 x 11レポートスレーブID
- この機能コードはシリアルリンクでのみ使用され、スレーブデバイスのID、タイプ説明、現在のステータス、およびその他の情報を読み取るために使用され、ブロードキャストモードをサポートしていません。
- クエリーメッセージにデータフィールドはありません。
- 応答メッセージの構成は、スレーブ装置によって決定される。
概要まとめ
一般的なModbus共通機能コードは下表のとおりです。

放送モードをサポートする機能コードは以下のとおりです。
- 0 x 0 5シングルコイルの書き込み
- 0 x 0 6シングルホールドレジスタへの書き込み
- 0 x 0F複数のコイルを書き込む
- 0 x 10複数の保持レジスタを書き込む
ブロードキャストモードメッセージを除き、他のすべてのクエリメッセージは通常の応答メッセージを取得したいと考えています。すべてが正常であれば、スレーブデバイスは要求メッセージの機能コードと一致する機能コードを持つ通常の応答メッセージを返します。
また、ワードOperationの機能コードについては、マルチバイトメモリの大小の問題があるため、マスター装置とスレーブ装置は、Modbus伝送におけるデータフィールドのエンディアンを規定する一貫したルール処理を維持する必要があります。
Leave a Reply