10.5.11
(0x0F)寫多個線圈
1. 功能說明
15功能碼用于將連續(xù)的多個線圈或離散輸出設(shè)置為ON/OFF狀態(tài),支持廣播模式,在廣播模式下,所有從站設(shè)備的同一地址的值將被統(tǒng)一修改。15功能碼中,起始地址字段由2字節(jié)構(gòu)成,取值范圍為0x00000xFFFF:而寄存器數(shù)量字段由2字節(jié)構(gòu)成,取值范用為0x00010x07B0。
2. 查詢報文
查詢報文中包含請求數(shù)據(jù)字段,用于定義ON或OFF狀態(tài)。數(shù)據(jù)字段中為邏輯1的位對應(yīng)ON;邏輯0的位對應(yīng)OFF。其中,ON/OFF與數(shù)據(jù)字段的對應(yīng)關(guān)系可參考前面的童節(jié)“01(0x01)讀取線圈,離散量輸出狀態(tài)(Read Coilstatus/DOs)”中的內(nèi)容舉例說明,假設(shè)從站設(shè)備地址為5,需要設(shè)置線圈地址20~30的狀態(tài)如下表所示。
線圈狀態(tài):
那么,寫入的數(shù)據(jù)字段被劃分為2字節(jié),值分別為0xD1,對應(yīng)于27~20的線圈,值0x05對應(yīng)于30~28的線圈,注意細體會其中的高低位的對應(yīng)關(guān)系。需要注意的是,在查詢報文中,Modbus協(xié)議的起始地址為19(0x13),即比線圈起始地址20少1。如下表所示,其中字節(jié)數(shù)字段表示需要變更數(shù)據(jù)的字節(jié)總數(shù)。
功能碼15查詢報文示例:
字段 |
例 (Hex) |
ASCII 模式字符型 |
RTU模式8位 (Hex) |
幀頭 | “:” | ||
從設(shè)備地址 | 0x05 | “0”,“5” | 0x05 |
功能碼 | 0x0F | “0”,“F” | 0x0F |
起始地址 (高位) |
0x00 | “0”,“0” | 0x00 |
起始地址 (低位) |
0x13 | “1”,“3” | 0x13 |
寄存器數(shù) (高位) |
0x00 | “0”,“0” | 0x00 |
寄存器數(shù) (低位) |
0x0B | “0”,“B” | 0x08 |
字節(jié)數(shù) | 0x02 | “0”,“2” | 0x02 |
變更數(shù)據(jù) (高位) |
0xD1 | “D”,“1” | 0xD1 |
變更數(shù)據(jù) (低位) |
0x05 | “0”,“5” | 0x05 |
差錯校驗 | LRC(2字符) | CRC(2字節(jié)) | |
幀尾 | CR/LF | ||
合計字節(jié)數(shù) | 23 | 11 |
3. 響應(yīng)報文
對于從設(shè)備,在正常情況下,響應(yīng)報文包括功能碼、起始地址以及寫入的線圈數(shù)量,如下表所示。
功能碼15響應(yīng)報文示例:
字段 |
例 (Hex) |
ASCII 模式字符型 |
RTU模式8位 (Hex) |
幀頭 | “:” | ||
從設(shè)備地址 | 0x05 | “0”,“5” | 0x05 |
功能碼 | 0x0F | “0”,“F” | 0x0F |
起始地址 (高位) |
0x00 | “0”,“0” | 0x00 |
起始地址 (低位) |
0x13 | “1”,“3” | 0x13 |
寄存器數(shù) (高位) |
0x00 | “0”,“0” | 0x00 |
寄存器數(shù) (低位) |
0x0B | “0”,“B” | 0x08 |
差錯校驗 | LRC(2字符) | CRC(2字節(jié)) | |
幀尾 | CR/LF | ||
合計字節(jié)數(shù) | 17 | 8 |
10.5.12
(0x10)寫多個保持寄存器
1. 功能說明
16功能碼用于設(shè)置或?qū)懭霃脑O(shè)備保持寄存器的多個連續(xù)的地址塊(1~123個寄存器),支持廣播模式,在廣播模式下,所有從站設(shè)備的同一地址的值將被統(tǒng)一修改。本功能碼中,起始地址字段由2字節(jié)構(gòu)成,取值范圍為0x0000~0xFFFF;而寄存器數(shù)量字段由2字節(jié)構(gòu)成,取值范圍為0x0001~0x007B。
2. 查詢報文
查詢報文包含請求數(shù)據(jù)字段。數(shù)據(jù)字段保存需要寫入的數(shù)值,各數(shù)據(jù)按每個寄存器2字節(jié)存放。舉例說明,從站設(shè)備地址為5,需要將保持寄存器地址40020~40022設(shè)置為如下表所示的數(shù)值。
寄存器的設(shè)置:
寄存器地址 | 設(shè)定值 | 寄存器地址 | 設(shè)定值 |
40020 | 0X0155 | 40022 | 0x0157 |
40021 | 0x0156 | — | — |
對應(yīng)于40020~40022的寄存器,注意仔細體會其中的高低位的對應(yīng)關(guān)系。需要注意的是,在查詢報文中,Modbus協(xié)議的起始地址為19(0x13),即比寄存器起始地址20少1。如下表所示,其中字節(jié)數(shù)字段表示需要變更數(shù)據(jù)的字節(jié)總數(shù)。
功能碼16查詢報文示例:
字段 |
例 (Hex) |
ASCII 模式字符型 |
RTU模式8位 (Hex) |
幀頭 | “:” | ||
從設(shè)備地址 | 0x05 | “0”,“5” | 0x05 |
功能碼 | 0x10 | “0”,“F” | 0x0F |
起始地址 (高位) |
0x00 | “0”,“0” | 0x00 |
起始地址 (低位) |
0x13 | “1”,“3” | 0x13 |
寄存器數(shù) (高位) |
0x00 | “0”,“0” | 0x00 |
寄存器數(shù) (低位) |
0x03 | “0”,“B” | 0x08 |
字節(jié)數(shù) | 0x06 | “0”,“6” | 0x06 |
變更數(shù)據(jù)1 (高位) |
0x01 | “0”,“1” | 0x01 |
變更數(shù)據(jù)1 (低位) |
0x55 | “5”,“5” | 0x56 |
變更數(shù)據(jù)2 (高位) |
0x01 | “0”,“1” | 0x01 |
變更數(shù)據(jù)2 (低位) |
0x56 | “5”,“6” | 0x56 |
變更數(shù)據(jù)3 (高位) |
0x01 | “0”,“1” | 0x01 |
變更數(shù)據(jù)3 (低位) |
0x57 | “5”,“7” | 0x57 |
差錯校驗 | LRC(2字符) | CRC(2字節(jié)) | |
幀尾 | CR/LF | ||
合計字節(jié)數(shù) | 31 | 15 |
3. 響應(yīng)報文
對于從設(shè)備,在正常情況下,響應(yīng)報文包括功能碼、起始地址及寫入的寄存器數(shù)量,如下表所示。
功能碼16響應(yīng)報文示例:
字段 |
例 (Hex) |
ASCII 模式字符型 |
RTU模式8位 (Hex) |
幀頭 | “:” | ||
從設(shè)備地址 | 0x05 | “0”,“5” | 0x05 |
功能碼 | 0x10 | “1”,“0” | 0x10 |
起始地址 (高位) |
0x00 | “0”,“0” | 0x00 |
起始地址 (低位) |
0x13 | “1”,“3” | 0x13 |
寄存器數(shù) (高位) |
0x00 | “0”,“0” | 0x00 |
寄存器數(shù) (低位) |
0x03 | “0”,“3” | 0x03 |
差錯校驗 | LRC(2字符) | CRC(2字節(jié)) | |
幀尾 | CR/LF | ||
合計字節(jié)數(shù) | 17 | 8 |
在實際開發(fā)過程中,功能碼“16(0x10)寫多個寄存器(Preset MultipleRegisters)”通常用于方便用戶寫入多字節(jié)類型的數(shù)據(jù)。
例如,假設(shè)從站設(shè)備地址為5,需要向保持寄存器寫入一個32位(4字節(jié))的浮點數(shù),那么此浮點數(shù)將占用2個寄存器地址。假設(shè)浮點數(shù)將存放在40001和40002寄存器中,設(shè)定值為1.235(即0x3F9E 147A)實際的查詢和響應(yīng)報文如下(其中標記部分為設(shè)定的浮點數(shù)值,假設(shè)字節(jié)序為AB-CD,參考第5.3.7章字節(jié)序和大小端的內(nèi)容)。
查詢報文:05 10 00 00 00 02 04 3F 9E 14 7A 05 86
響應(yīng)報文:05 10 00 00 00 02 40 4C
對于64位(8字節(jié))的雙精度浮點數(shù),同理將占用4個寄存器地址共8字節(jié)的空間。特別需要注意的是字節(jié)序及大小端的問題,前面討論過多字節(jié)存在大小端問題,因此主站設(shè)備和從站設(shè)備必須保持一致的規(guī)則處理,約定Modbus傳輸中的數(shù)據(jù)字段的字節(jié)序,否則會因為大小端不一致而產(chǎn)生數(shù)據(jù)處理錯誤。
-
線圈
+關(guān)注
關(guān)注
14文章
1844瀏覽量
45106 -
寄存器
+關(guān)注
關(guān)注
31文章
5401瀏覽量
122773 -
功能碼
+關(guān)注
關(guān)注
0文章
10瀏覽量
2206 -
報文
+關(guān)注
關(guān)注
0文章
39瀏覽量
4132
原文標題:寫多個線圈與寫多個保持寄存器 - RZ MPU工業(yè)控制教程連載(35)
文章出處:【微信號:瑞薩MCU小百科,微信公眾號:瑞薩MCU小百科】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
NXP RC522 寫寄存器問題,哪位大神給點建議
NI提供的modbus工具包功能測試結(jié)果,但是讀線圈讀不回來,寫多個寄存器也只能寫進去起始地址那個是什么原因呢?
Modbus協(xié)議———常用功能碼詳解
如何把庫函數(shù)寫的文件和寄存器寫的文件結(jié)合起來用?
無法理解Modbus RTU協(xié)議寫多個寄存器的這兩個參數(shù)
無法理解Modbus RTU協(xié)議寫多個寄存器的這兩個參數(shù)!
調(diào)試AD7124-8驅(qū)動時,對各寄存器配置之后再次讀各寄存器的值,多個寄存器的值都為fffffffd是為什么?
寄存器尋址方式
32位寄存器,32位寄存器是什么意思
使用寄存器級讀&寫控制基于PXI平臺的FPGA
STM32系列MCU,寫寄存器Or利用固件庫

評論