深入解析Modbus RTU命令与应答机制

freeFree Technical Resource

This content is free to read, suitable for basic learning and search traffic.

深入解析Modbus RTU命令与应答机制
深入解析Modbus RTU命令与应答机制イラスト

Modbus RTU协议説明

Modbus是基于主从構造的通信プロトコル。它使用RS-485, RS-422, RS-232接口,以及Ethernet TCP/IP网络(Modbus TCPProtocol)进行データ传输。

Modbus RTUメッセージ包括:

  • SlaveIDデバイス的アドレス
  • function code
  • 依赖于機能コード的特殊データ
  • CRC-16(Modbus)

構造如下:

SlaveID    function code 特殊データ    CRC16

もし你去掉SlaveIDアドレス和CRC-16(Modbus),你将得到PDU(协议データユニット)。

SlaveID是デバイス的アドレス,可以从0到247之间選択值。值得注意的是,从248到255的アドレス是保留的。

モジュール中的データストア在四个表中,其中2つ是読み取り専用的,另外2つ是読み書き的。每个表可以容纳9999个值。

以下是表的总结:

  • 离散出力コイル (DO):読み書き;Register number1-9999;HEXアドレス範囲0000到270E
  • ショップ型入力触点 (DI):読み取り専用;Register number10001-19999;HEXアドレス範囲0000到270E
  • 模拟入力レジスタ。 (AI):読み取り専用;Register number30001-39999;HEXアドレス範囲0000到270E
  • 模拟出力レジスタを保持する。 (AO):読み書き;Register number40001-49999;HEXアドレス範囲0000到270E

每个表都有一1つのレジスタ号(例如AO的40001),它对应于一アドレスはこちら。(例如0000)。这种差异被称为"偏移"。表的オフセットの量分别为1, 10001, 30001和40001。

以一个例子説明:从40108到40110レジスタ为デバイスアドレス17取得AI值的Modbus RTUリクエスト如下:

11 03 006B 0003 7687

这个分解如下:

  • 11:SlaveIDDevice address(十进制中的17或HEX中的11)
  • 03:function code
  • 006B:第一1つのレジスタ的アドレス(計算为40108-40001 = 107,这是HEX中的6B)
  • 0003:所需的レジスタの数(从40108到40110取得三1つのレジスタ)
  • 7687:CRC check和

Modbus RTU从デバイス会回复:

11 03 06 AE41 5652 4340 49AD

这转化为:

  • Device address:11(或十进制中的17)
  • function code:03
  • バイト计数(表示后面跟随6バイト):06
  • 登録值AO0、AO1和AO2作为两バイトオーダー列
  • CRC值由49AD给出

模拟出力レジスタ的值可以経由多种方式解释,例如:

  • 作为16ビット符号なし整数(範囲0至65535)
  • 作为16ビット符号付き整数(範囲-32768至32767)
  • 作为2つ文字的ASCIIストリング·ストリング
  • 作为离散开/关值(0或1)
  • 作为32ビット符号なし整数(範囲0到4,294,967,295)
  • 作为32ビット符号付き整数(範囲-2,147,483,648至2,147,483,647)
  • 作为32位单精度IEEE浮動小数点数(範囲1.2×10^−38至3.4×10^+38)
  • 作为四文字ASCIIストリング·ストリング
深入解析Modbus RTU命令与应答机制イラスト1

Modbus RTU命令是什么?

以下是用于読み取り和写入Modbus RTUレジスタ的代码表。

功能代码功能操作data typeアクセスタイプ
01 (0x01)readDO离散出力コイルの状態read
02 (0x02)readDIショップ型入力ステータスread
03 (0x03)readAOレジスタを保持する。16位
04 (0x04)readAI入力レジスタ。16位
05 (0x05)写入一个DO强制单コイル离散
06 (0x06)写入一个AO预设单レジスタ16位
15 (0x0F)多DO写入强制多コイル离散
16 (0x10)多AO写入预设多レジスタ16位

如何送信Modbus RTU命令来読み取り离散出力?Command0x01

此命令用于読み取りDO数字輸出した。值。

PDUリクエスト指定第一个DOレジスタ的開始アドレス和后续所需的DO值数量。在PDU中,DO值从零开始寻址。

レスポンス中的DO值为一バイト単位。,对应位的值。

位值定义为1 = ON,0 = OFF。

第一个データバイト的低位包含在リクエスト中指定アドレス的DO值。其余的DO值按照增加的值到バイト的最高值。即从右到左。

もしリクエスト的DO值少于八个,则レスポンス中的其余位将填充为零(从低バイト数到ハイバイト的方向)。バイト计数进一步表示レスポンス中データ完全に。Bytesの数。

一个从20到56的DO查询サンプル,针对デバイス的SlaveIDaddress17。第一1つのレジスタ的アドレス将是0013十六进制=19,因为帐户是从0アドレス始まりました。(0014十六进制=20, -1零偏移=我们得到0013十六进制=19)。

byteRequestbyteReply
(Hex)字段名(Hex)字段名
11Device address11Device address
01功能代码01功能代码
00第一个レジスター·アドレスハイバイト05もっと見る的Bytesの数
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)
DO 27-20的出力ステータス表示为バイトCD十六进制值,或在二进制系统中为1100 1101。

在レジスタDO 56-52中,右边リクエスト了5位,其余的位填充为零以得到完全的バイト(0001 1011)。

通道---DO 56DO 55DO 54DO 53DO 52
00011011
hexadecimal1B

如何送信Modbus RTU命令来読み取り数字入力?Command0x02

此命令用于読み取り数字入力DI的值。

从レジスタ# 10197到10218的DIリクエストサンプル,针对デバイス的SlaveIDaddress17。第一1つのレジスタ的アドレス将是00C4十六进制=196,因为帐户是从0アドレス始まりました。。

byteRequestbyteReply
(Hex)字段名(Hex)字段名
11Device address11Device address
02功能代码02功能代码
00第一个レジスター·アドレスハイバイト03もっと見る的Bytesの数
C4第一个レジスター·アドレス低バイト数ACDI 10204-10197的レジスタの値 (1010 1100)
00レジスタの数ハイバイトDBDI 10212-10205的レジスタの値 (1101 1011)
16レジスタの数低バイト数35DI 10218-10213的レジスタの値 (0011 0101)
BACRC-16(Modbus)20CRC-16(Modbus)
A9CRC-16(Modbus)18CRC-16(Modbus)

如何送信Modbus RTU命令来読み取り模拟出力?Command0x03

此命令用于読み取り模拟出力AO的值。

从レジスタ# 40108到40110的AOリクエストサンプル,针对デバイス的SlaveIDaddress17。第一1つのレジスタ的アドレス将是006Bhexadecimal=107,因为帐户是从0アドレス始まりました。。

byteRequestbyteReply
(Hex)字段名(

Hex) | 字段名
11 | Device address | 11 | Device address
03 | 功能代码 | 03 | 功能代码
00 | 第一个レジスター·アドレスハイバイト | 06 | もっと見る的Bytesの数
6B | 第一个レジスター·アドレス低バイト数 | AE | #40108的レジスタの値高位
00 | レジスタの数ハイバイト | 41 | #40108的レジスタの値低位
03 | レジスタの数低バイト数 | 56 | #40109的レジスタの値高位
76 | CRC check和 | 52 | #40109的レジスタの値低位
87 | CRC check和 | 43 | #40110的レジスタの値高位
40 | #40110的レジスタの値低位
49 | CRC-16(Modbus)
AD | CRC-16(Modbus)

如何送信Modbus RTU命令来読み取り模拟入力?Command0x04

此命令用于読み取り模拟入力AI的值。

从レジスタ# 30009的AIリクエストサンプル,针对デバイス的SlaveIDaddress17。第一1つのレジスタ的アドレス是0008十六进制=8,因为帐户是从0アドレス始まりました。。

byteRequestbyteReply
(Hex)字段名(Hex)字段名
11Device address11Device address
04功能代码04功能代码
00第一个レジスター·アドレスハイバイト02もっと見る的Bytesの数
08第一个レジスター·アドレス低バイト数00#30009的レジスタの値高位
00レジスタの数ハイバイト0A#30009的レジスタの値低位
01レジスタの数低バイト数F8CRC-16(Modbus)
B2CRC-16(Modbus)F4CRC-16(Modbus)
98CRC-16(Modbus)

如何送信Modbus RTU命令来写入离散出力?Command0x05

此命令用于记录DO数字輸出した。一个值。

值FF 00十六进制将出力設定为ON。

值00 00十六进制将出力設定为OFF。

すべての其他值都无效,且不会影响出力值。

对这样的リクエスト的普通の反応是回声(レスポンス中的重复リクエスト),在DOステータス已更改后戻る。

example,使用デバイス的SlaveIDaddress17的レジスタ# 173的DO记录。レジスター·アドレス为00AChexadecimal=172,因为从0アドレス开始记录。

byteRequestbyteReply
(Hex)字段名(Hex)字段名
11Device address11Device address
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命令来记录模拟出力?Command0x06

此命令用于记录模拟出力AO的一个值。

example,使用デバイス的SlaveIDaddress17的レジスタ# 40002的AO记录。第一1つのレジスタ的アドレス为0001十六进制=1,因为从0アドレス开始记录。

byteRequestbyteReply
(Hex)字段名(Hex)字段名
11Device address11Device address
06功能代码06功能代码
00第一个レジスター·アドレスハイバイト00第一个レジスター·アドレスハイバイト
01第一个レジスター·アドレス低バイト数01第一个レジスター·アドレス低バイト数
00ハイバイト值00ハイバイト值
03低バイト数值03低バイト数值
9ACRC-16(Modbus)9ACRC-16(Modbus)
9BCRC-16(Modbus)9BCRC-16(Modbus)

如何送信Modbus RTU命令来写入多个离散引脚?Command0x0F

此命令用于记录DO数字輸出した。多个值。

example,写入多个DO,从デバイス的SlaveIDaddress17的レジスタ# 20到# 29。レジスター·アドレス为0013十六进制=19,因为从0アドレス开始记录。

byteRequestbyteReply
(Hex)字段名(Hex)字段名
11Device address11Device address
0F功能代码0F功能代码
00第一个レジスター·アドレスハイバイト00第一个レジスター·アドレスハイバイト
13第一个レジスター·アドレス低バイト数13第一个レジスター·アドレス低バイト数
00レジスタの数ハイバイト00记录的レジスタの数ハイバイト
0Aレジスタの数低バイト数0A记录的レジスタの数低バイト数
02もっと見る的Bytesの数26CRC-16(Modbus)
CDDO 27-20的バイト值 (1100 1101)99CRC-16(Modbus)
01DO 29-28的バイト值 (0000 0001)
BFCRC-16(Modbus)
0BCRC-16(Modbus)

答案戻る已记录的レジスタの数。

如何送信Modbus RTU命令来记录多个模拟出力?Command0x10

此命令用于记录模拟出力AO的多个值。

example,记录多个AO,从デバイス的SlaveIDaddress17的レジスタ# 40002和# 40003。第一1つのレジスタ的アドレス为0001十六进制=1,因为从0アドレス开始记录。

byteRequestbyteReply
(Hex)字段名(Hex)字段名
11Device address11Device address
10功能代码10功能代码
00第一个レジスター·アドレスハイバイト00第一个レジスター·アドレスハイバイト
01第一个レジスター·アドレス低バイト数01第一个レジスター·アドレス低バイト数
00レジスタの数ハイバイト00记录的レジスタの数ハイバイト
02レジスタの数低バイト数02记录的レジスタの数低バイト数
04もっと見る的Bytesの数12CRC-16(Modbus)
0040002高位值98CRC-16(Modbus)
0A40002低位值
0140003高位值
0240003低位值
C6CRC-16(Modbus)
F0CRC-16(Modbus)
深入解析Modbus RTU命令与应答机制イラスト2

Modbusリクエスト的エラー

もしデバイス受信到一个リクエスト,但无法処理该リクエスト,该デバイス将以エラー代码进行レスポンス。

レスポンス将包含修改后的功能代码,高位バイト为1。

example:

元の值结果值
リクエスト中的功能代码レスポンス中的功能エラー代码
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

带有エラー的リクエスト和レスポンスサンプル:

byteRequestbyteResponse
(Hex)字段名(Hex)字段名
0ADevice address0ADevice address
01功能代码81已更改的功能代码
04第一个レジスター·アドレスハイバイト02エラー代码
A1第一个レジスター·アドレス低バイト数B0CRC-16(Modbus)
00レジスタの数ハイバイト53CRC-16(Modbus)
01レジスタの数低バイト数
ACCRC-16(Modbus)
63CRC-16(Modbus)

エラー代码説明

01 | 不能処理已接受的功能代码。
02 | リクエスト中指定的データアドレス不可用。
03 | 查询データ字段中包含的值是无效值。
04 | スレーブ尝试执行リクエスト的操作时发生不可恢复的エラー。
05 | スレーブ已接受リクエスト并処理中です。,但需要较长时间。此レスポンス防止マスター生成タイムアウトエラー。
06 | スレーブ正忙于処理命令。マスター在スレーブ暇なとき必须重复メッセージ。
07 | スレーブ无法执行リクエスト中指定的程序功能。使用功能编号13或14的不成功的程序リクエスト戻る此代码。マスター必须从スレーブリクエスト诊断信息或エラー信息。
08 | スレーブ在読み取り扩展内存时检测到奇偶検証エラー。マスター可以重复リクエスト,但通常在这种情况下需要维修。

Put this resource to use in a real project?

Go to the Tool Center for message parsing, CRC verification and device debugging, or submit your requirements for selection and integration advice.

Engineer Membership

Turn this article into actionable debugging resources

After activation, you can use advanced message parsing, resource pack downloads, code examples, engineering cases and priority technical support, suitable for real project delivery.

Unlimited Advanced Tools
Resource & Code Packs
Complete Engineering Case Library
Priority Technical Support

Leave a Reply

Your email address will not be published. Required fields are marked *.