0x01 初めて ModBus について知る
Modbus は、プログラマブル ロジック コントローラー (PLC) を使用した通信用に、Modicon Corporation (現 Schneider Electric) が 1979 年に公開したシリアル通信プロトコルです。現在の Modbus プロトコルは産業分野における通信プロトコルの業界標準となっており、産業用電子機器間の一般的な接続方式です。
Modbus プロトコルは、産業分野で最も広く使用されているプロトコルおよび業界標準となる可能性があり、次の特徴があります。
- 無料:これが大前提で、どの製品でも同じですが、無料だからこそ初期段階で最大限の利用が可能になります。
- シンプル: Modbus プロトコルのフレーム形式はシンプルかつコンパクトで、ユーザーにとって理解しやすく、メーカーにとっても統合が容易です。
- インターフェイス: Modbus プロトコルは、アプリケーション層プロトコルに属する単なるプロトコルであるため、シリアル ポート (485/232/422) に適用できるだけでなく、イーサネット、光ファイバー、Bluetooth などでも送信できます。無線。
0x02 ModBus パケット解析
フレーム構造:
住所コード | ファンクションコード | データを送る | CRCチェックコード |
---|---|---|---|
1バイト | 1バイト | nバイト | 2バイト |
アドレスコード:アドレスコードは、通信によって送信される最初のバイトです。このバイトは、ユーザーによってアドレス コードが設定されたスレーブが、マスターによって送信された情報を受信することを示します。また、各スレーブには固有のアドレス コードがあり、応答ループバックは独自のアドレス コードから始まります。マスターから送信されるアドレス コードは送信先のスレーブ アドレスを示し、スレーブから送信されるアドレス コードは返信先のスレーブ アドレスを示します。アドレスコードが 0 の場合、それはブロードキャストアドレスであり、すべてのスレーブがそれを認識でき、スレーブは応答しません。
ファンクションコード:通信によって送信される 2 番目のバイト。ModBus 通信プロトコルでは、1 ~ 127 の機能コードが定義されています。ホストリクエストとして送信し、ファンクションコードを通じて実行するアクションをスレーブに伝えます。スレーブからの応答として、スレーブが送信した機能コードの最上位ビットが 1 (つまり、機能コードが 127 より大きい) の場合、スレーブが操作に応答しないか、エラーを送信したことを示します。コードが同じであれば、スレーブがマスターの操作に応答したことを示します。例:ファンクションコード:00000003(03H)、スレーブマシンが正常に実行した場合は同じファンクションコードを返し、異常の場合は10000003(83H)を返します。
データ領域: データ領域は機能コードごとに異なります。データフィールドには、実際の値、設定値、マスターからスレーブへのアドレス、またはスレーブからマスターへのアドレスを指定できます。たとえば、関数コードがスレーブにレジスタの値を読み取るように指示する場合、データ領域には、読み取られるレジスタの開始アドレスと読み取り長が含まれている必要があります。スレーブが異なれば、アドレスとデータ情報も異なります。
CRCチェック: TCP/IPのCRCチェックと同様、データ伝送に誤りがないことを保証するために設定されます。計算およびチェックの対象となる内容は、アドレスコード、ファンクションコード、データのチェックデジットを除くすべての内容です。
0x03 ModBus共通機能コード
Modbus の共通機能コードを理解する必要があり、関連する機能コードを理解した後でのみ、Modbus プロトコルの関連する操作や特定の機能を深く分析できます。
ファンクションコード | 説明 | PLCのアドレス範囲 | レジスタアドレス範囲 | 操作ユニット | 操作の数 |
---|---|---|---|---|---|
0x01 | コイルレジスタの読み取り | 00001-99999 | 0x0000-0xFFFF | ビット単位で操作する | 1 または n |
0x02 | ディスクリート入力レジスタの読み取り | 10001-19999 | 0x0000-0xFFFF | ビット単位で操作する | 1 または n |
0x03 | 保持レジスタの読み取り | 40001-49999 | 0x0000-0xFFFF | バイト演算による | 1 または n |
0x04 | 入力レジスタの読み取り | 30001-39999 | 0x0000-0xFFFF | バイト演算による | 1 または n |
0x05 | シングルコイルレジスタを書き込む | 00001-99999 | 0x0000-0xFFFF | ビット単位で操作する | 1 |
0x06 | 単一の保持レジスタに書き込みます | 40001-49999 | 0x0000-0xFFFF | バイト演算による | 1 |
0x0F | 複数のコイルレジスタを書き込む | 00001-99999 | 0x0000-0xFFFF | ビット単位で操作する | 1 |
0x10 | 複数の保持レジスタを書き込む | 40001-49999 | 0x0000-0xFFFF | バイト演算による | 1 |
0x04 Modbus レジスタの解釈
上記のファンクションコードから、コイルレジスタ、ディスクリート入力レジスタ、保持レジスタ、入力レジスタの 4 種類の関連レジスタが操作されることがわかります。
コイル レジスタ:実際、スイッチ値 (リレー状態) と比較することができ、各ビットは信号のスイッチ状態に対応します。したがって、1 バイトで同時に 8 つの信号を制御できます。たとえば、外部 8 ウェイ IO のレベルを制御します。コイルレジスタは読み出しと書き込みの両方に対応しており、ファンクションコードの書き込みは単一のコイルレジスタへの書き込みと複数のコイルレジスタへの書き込みに分かれます。上記の対応する機能コードは、0x01 0x05 0x0f です。
ディスクリート入力レジスタ:ディスクリート入力レジスタは、コイル レジスタの読み取り専用モードに相当し、ビットごとのスイッチ値を表し、そのスイッチ値は入力スイッチ信号の読み取りのみが可能で、書き込みはできません。たとえば、外部ボタンが押されたか離されたかを読み取ります。したがって、関数コードは単に 0x02 を読み取るだけです。
保持レジスタ:このレジスタの単位はビットではなく 2 バイトです。つまり、特定の量のデータを格納でき、読み書き可能です。一般的には、年月日の時刻を設定するなどのパラメータ設定に相当しますが、現在時刻を書き込むだけでなく読み出すこともできます。書き込みもシングル書き込みとマルチ書き込みに分かれており、対応するファンクションコードは 0x03 0x06 0x10 の 3 つがあります。
入力レジスタ:保持レジスタと似ていますが、読み取りのみをサポートし、書き込みはサポートせず、通常はさまざまなリアルタイム データを読み取ります。レジスタも 2 バイトのスペースを占有します。対応する機能コードは 0x04 です。
0x05 Modbus プロトコルの分析例
1. 保持レジスタデータの読み出し
主机请求: 01 03 00 00 00 01 84 0A
从机回复: 01 03 02 12 34 B5 33
関連する分析:
#主机请求数据解析
01:PLC地址
03:功能码,查询保持寄存器
00 00:代表查询的寄存器的起始地址
00 01:代表查询的寄存器的结束地址
84 0A:循环冗余校验码
#从机回复数据解析
01:PLC地址
03:功能码,与主机请求相同,说明执行成功
02:代表后面寄存器的数据的字节数,一个寄存器有两个字节,所以这里的字节数肯定是查询的寄存器个数的2倍
12 34:寄存器的值
B5 33: 循环冗余校验码
2. 単一の保持レジスタへの書き込み
主机请求: 01 06 00 00 00 01 48 0A
从机回复: 01 06 00 00 00 01 48 0A
関連する分析:
# 主机请求数据解析
01:PLC地址
06:功能码,单个保持寄存器写入
00 00:要被写入发寄存器的地址
00 01:被写入的内容,也就是在寄存器00 00的位置写入数据 00 01
48 0A:循环冗余校验码
#从机回复
01:PLC地址
06:响应功能码,与请求中的相同,说明执行成功
00 00:被写入的地址
00 01:被写入的数据
48 0A:校验码
3. 複数の保持レジスタを書き込む
主机请求: 01 10 00 00 00 02 04 11 22 33 44 42 5A
从机回复: 01 10 00 00 00 02 41 C8
関連する分析:
# 主机请求解析
01:PLC地址
10:功能码,多个保持寄存器写入
00 00:被写入的寄存器的起始地址
00 02:代表被修改的寄存器的数量
04:代表别修改的总字节数
11 22 33 44:将要修改的值
42 5A:校验码
#从机回复数据解析:
01:PLC地址
10:功能码
00 00:寄存器中被写入的地址
00 02:说明被修改的寄存器数量
41 C8:校验码
0x06 参照内容
- https://blog.csdn.net/CAI____NIAO/article/details/124344164
- https://xw.qq.com/cmsid/20220328A0872C00
- https://blog.csdn.net/qq_36958104/article/details/124193794
- https://www.163.com/dy/article/G5P36B0R0538S33I.html