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