10.5.4
0x03)讀取保持寄存器值
1. 功能說明
03功能碼用于讀取從設備保持寄存器的內容,不支持廣播模式。消息頓中指定了需要讀取的保持寄存器的起始地址和數目。而保持寄存器中各地址的具體內容和意義則由設備開發者自行規定。
2. 查詢報文
在查詢報文中,必須指定保持寄存器的開始地址和需要讀取的寄存器數量,例如,如下表所示,從設備地址為7(0x07),需要讀取保持寄存器地址40201~40203共計3個寄存器的內容即讀取Modbus協議地址200~202的內容,在報文中表示如下。
起始地址:0x00C8(十進制200)。
讀取數量:0x0003(十進制3)。
功能碼03查詢報文示例:
字段 | 例(Hex) | ASCII模式字符型 |
RTU模式8位 (Hex) |
幀頭 | “:” | ||
從設備地址 | 0x07 | “0”,“7” | 0x07 |
功能碼 | 0x03 | “0”,“3” | 0x03 |
起始地址 (高位) |
0x00 | “0”,“0” | 0x00 |
起始地址 (低位) |
0xc8 | “c”,“8” | 0xc8 |
寄存器數 (高位) |
0x00 | “0”,“0” | 0x00 |
寄存器數 (低位) |
0x03 | “0”,“3” | 0x03 |
差錯校驗 | LRC(2字符) | CRC(2字節) | |
幀尾 | CR/LF | ||
合計字節數 | 17 | 8 |
本功能碼的起始地址由2字節構成,取值范圍為0x00000xFFFF;寄存器數量由2字節構成取值范圍為0x00010x007D(即十進制1~125),即最多可以連續讀取125個寄存器。
需要特別注意的是,Modbus的保持寄存器和輸入寄存器是以字(Word)為基本單位的(1Word=2Byte),所以如果讀取保持寄存器地址為40001開始的一個16位(bit)的無符號數,那么返回2字節,并可以從40002開始讀取下一個16位的無符號數。如果需要讀取寄存器地址為40001開始的一個32位浮點數,則需要返回4字節,即必須連續讀取40001和40002的內容,而且下一個32位的浮點數必須從40003開始讀取。對于浮點數(或者32位的整數)而言,連續讀取的兩個寄存器之間存在字節序和大小端的問題,這一點在開發時必須引起注意。
3. 響應報文
響應報文的各項構成和意義如下表所示。因為Modbus的保持寄存器和輸入寄存器是以字為基本單位的,在上面的例子中,查詢報文連續讀取3個寄存器的內容,將返回6 字節,參考表下表中數據1~3的高位和低位。
功能碼03響應報文示例:
字段 | 例(Hex) | ASCII模式字符型 |
RTU模式8位 (Hex) |
幀頭 | “:” | ||
從設備地址 | 0x07 | “0”,“7” | 0x07 |
功能碼 | 0x03 | “0”,“3” | 0x03 |
數據域字節數 | 0x06 | “0”,“6” | 0x06 |
數據1(高位) | 0x03 | “0”,“3” | 0x03 |
數據1(低位) | 0x53 | “5”,“3” | 0x53 |
數據2(高位) | 0x01 | “0”,“1” | 0x01 |
數據2(低位) | 0xF3 | “F”,“3” | 0xF3 |
數據3(高位) | 0x01 | “0”,“1” | 0x01 |
數據3(低位) | 0x05 | “0”,“5” | 0x05 |
差錯校驗 | LRC(2字符) | CRC(2字節) | |
幀尾 | CR/LF | ||
合計字節數 | 23 | 11 |
10.5.5
(0x04)讀取輸入寄存器值
1. 功能說明
與功能碼03類似,04功能碼用于讀取從設備輸入寄存器的內容,不支持廣播模式。消息頓中指定了需要讀取的輸入寄存器的起始地址和數目,而輸入寄存器中各地址的具體內容和意義則由設備開發者自行規定。
2. 查詢報文
在查詢報文中必須指定輸入寄存器的起始地址和需要讀取的寄存器數量。例如,如表4-9所示,從設備地址為7(0x07),需要讀取輸入寄存器地址30301~30303共計 3個寄存器的內容即讀取Modbus協議地址300~302的內容,在報文中表示如下。
起始地址:0x012C(十進制300)。
讀取數量:0x0003(十進制3)。
功能碼04查詢報文示例:
字段 | 例(Hex) | ASCII模式字符型 |
RTU模式8位 (Hex) |
幀頭 | “:” | ||
從設備地址 | 0x07 | “0”,“7” | 0x07 |
功能碼 | 0x04 | “0”,“4” | 0x04 |
起始地址 (高位) |
0x01 | “0”,“1” | 0x01 |
起始地址 (低位) |
0x2c | “2”,“c” | 0x2c |
寄存器數 (高位) |
0x00 | “0”,“0” | 0x00 |
寄存器數 (低位) |
0x03 | “0”,“3” | 0x03 |
差錯校驗 | LRC(2字符) | CRC(2字節) | |
幀尾 | CR/LF | ||
合計字節數 | 17 | 8 |
本功能碼中,起始地址由2字節構成,取值范圍為0x0000~0xFFFF;寄存器數量由2字節構成,取值范圍為0x0001~0x007D(即十進制1~125),即最多可以連續讀取125個寄存器同樣有一點需要注意,Modbus的保持寄存器和輸入寄存器是以字為基本單位的。所以對于浮點數(或者32位的整數)而言,連續讀取的兩個寄存器之間存在字節序和大小端的問題,這一點在開發時必須引起注意。
3. 響應報文
響應報文的各項構成和意義如下表所示。因為Modbus的保持寄存器和輸入寄存器是以字為基本單位的,上面的例子中,查詢報文連續讀取3個寄存器的內容,那么將返回6字節,參考下表中數據1~3的高位和低位。
功能碼04響應報文示例:
字段 | 例(Hex) | ASCII模式字符型 |
RTU模式8位 (Hex) |
幀頭 | “:” | ||
從設備地址 | 0x07 | “0”,“7” | 0x07 |
功能碼 | 0x04 | “0”,“4” | 0x04 |
數據域字節數 | 0x06 | “0”,“6” | 0x06 |
數據1(高位) | 0x03 | “0”,“3” | 0x03 |
數據1(低位) | 0x53 | “5”,“3” | 0x53 |
數據2(高位) | 0x01 | “0”,“1” | 0x01 |
數據2(低位) | 0xF3 | “F”,“3” | 0xF3 |
數據3(高位) | 0x01 | “0”,“1” | 0x01 |
數據3(低位) | 0x05 | “0”,“5” | 0x05 |
差錯校驗 | LRC(2字符) | CRC(2字節) | |
幀尾 | CR/LF | ||
合計字節數 | 23 | 11 |
-
寄存器
+關注
關注
31文章
5421瀏覽量
123290 -
MODBUS
+關注
關注
28文章
1995瀏覽量
78940 -
功能碼
+關注
關注
0文章
10瀏覽量
2225
原文標題:讀取保持寄存器值 - RZ MPU工業控制教程連載(31)
文章出處:【微信號:瑞薩MCU小百科,微信公眾號:瑞薩MCU小百科】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
基于Modbus協議的485總線,當功能碼為03H,讀取N個讀寄存器數據時,從設備需要進行N次消息回送嗎?
Modbus協議說明及VC代碼
Modbus庫開發筆記之九:利用協議棧開發Modbus TCP Server應用
modbus協議筆記
libmodbus寄存器個數的疑問
Modbus協議的理解
C#使用Modbus協議讀寫匯川PLC的M區寄存器

評論