10.5.11
(0x0F)寫多個線圈
1. 功能說明
15功能碼用于將連續的多個線圈或離散輸出設置為ON/OFF狀態,支持廣播模式,在廣播模式下,所有從站設備的同一地址的值將被統一修改。15功能碼中,起始地址字段由2字節構成,取值范圍為0x00000xFFFF:而寄存器數量字段由2字節構成,取值范用為0x00010x07B0。
2. 查詢報文
查詢報文中包含請求數據字段,用于定義ON或OFF狀態。數據字段中為邏輯1的位對應ON;邏輯0的位對應OFF。其中,ON/OFF與數據字段的對應關系可參考前面的童節“01(0x01)讀取線圈,離散量輸出狀態(Read Coilstatus/DOs)”中的內容舉例說明,假設從站設備地址為5,需要設置線圈地址20~30的狀態如下表所示。
線圈狀態:
那么,寫入的數據字段被劃分為2字節,值分別為0xD1,對應于27~20的線圈,值0x05對應于30~28的線圈,注意細體會其中的高低位的對應關系。需要注意的是,在查詢報文中,Modbus協議的起始地址為19(0x13),即比線圈起始地址20少1。如下表所示,其中字節數字段表示需要變更數據的字節總數。
功能碼15查詢報文示例:
字段 |
例 (Hex) |
ASCII 模式字符型 |
RTU模式8位 (Hex) |
幀頭 | “:” | ||
從設備地址 | 0x05 | “0”,“5” | 0x05 |
功能碼 | 0x0F | “0”,“F” | 0x0F |
起始地址 (高位) |
0x00 | “0”,“0” | 0x00 |
起始地址 (低位) |
0x13 | “1”,“3” | 0x13 |
寄存器數 (高位) |
0x00 | “0”,“0” | 0x00 |
寄存器數 (低位) |
0x0B | “0”,“B” | 0x08 |
字節數 | 0x02 | “0”,“2” | 0x02 |
變更數據 (高位) |
0xD1 | “D”,“1” | 0xD1 |
變更數據 (低位) |
0x05 | “0”,“5” | 0x05 |
差錯校驗 | LRC(2字符) | CRC(2字節) | |
幀尾 | CR/LF | ||
合計字節數 | 23 | 11 |
3. 響應報文
對于從設備,在正常情況下,響應報文包括功能碼、起始地址以及寫入的線圈數量,如下表所示。
功能碼15響應報文示例:
字段 |
例 (Hex) |
ASCII 模式字符型 |
RTU模式8位 (Hex) |
幀頭 | “:” | ||
從設備地址 | 0x05 | “0”,“5” | 0x05 |
功能碼 | 0x0F | “0”,“F” | 0x0F |
起始地址 (高位) |
0x00 | “0”,“0” | 0x00 |
起始地址 (低位) |
0x13 | “1”,“3” | 0x13 |
寄存器數 (高位) |
0x00 | “0”,“0” | 0x00 |
寄存器數 (低位) |
0x0B | “0”,“B” | 0x08 |
差錯校驗 | LRC(2字符) | CRC(2字節) | |
幀尾 | CR/LF | ||
合計字節數 | 17 | 8 |
10.5.12
(0x10)寫多個保持寄存器
1. 功能說明
16功能碼用于設置或寫入從設備保持寄存器的多個連續的地址塊(1~123個寄存器),支持廣播模式,在廣播模式下,所有從站設備的同一地址的值將被統一修改。本功能碼中,起始地址字段由2字節構成,取值范圍為0x0000~0xFFFF;而寄存器數量字段由2字節構成,取值范圍為0x0001~0x007B。
2. 查詢報文
查詢報文包含請求數據字段。數據字段保存需要寫入的數值,各數據按每個寄存器2字節存放。舉例說明,從站設備地址為5,需要將保持寄存器地址40020~40022設置為如下表所示的數值。
寄存器的設置:
寄存器地址 | 設定值 | 寄存器地址 | 設定值 |
40020 | 0X0155 | 40022 | 0x0157 |
40021 | 0x0156 | — | — |
對應于40020~40022的寄存器,注意仔細體會其中的高低位的對應關系。需要注意的是,在查詢報文中,Modbus協議的起始地址為19(0x13),即比寄存器起始地址20少1。如下表所示,其中字節數字段表示需要變更數據的字節總數。
功能碼16查詢報文示例:
字段 |
例 (Hex) |
ASCII 模式字符型 |
RTU模式8位 (Hex) |
幀頭 | “:” | ||
從設備地址 | 0x05 | “0”,“5” | 0x05 |
功能碼 | 0x10 | “0”,“F” | 0x0F |
起始地址 (高位) |
0x00 | “0”,“0” | 0x00 |
起始地址 (低位) |
0x13 | “1”,“3” | 0x13 |
寄存器數 (高位) |
0x00 | “0”,“0” | 0x00 |
寄存器數 (低位) |
0x03 | “0”,“B” | 0x08 |
字節數 | 0x06 | “0”,“6” | 0x06 |
變更數據1 (高位) |
0x01 | “0”,“1” | 0x01 |
變更數據1 (低位) |
0x55 | “5”,“5” | 0x56 |
變更數據2 (高位) |
0x01 | “0”,“1” | 0x01 |
變更數據2 (低位) |
0x56 | “5”,“6” | 0x56 |
變更數據3 (高位) |
0x01 | “0”,“1” | 0x01 |
變更數據3 (低位) |
0x57 | “5”,“7” | 0x57 |
差錯校驗 | LRC(2字符) | CRC(2字節) | |
幀尾 | CR/LF | ||
合計字節數 | 31 | 15 |
3. 響應報文
對于從設備,在正常情況下,響應報文包括功能碼、起始地址及寫入的寄存器數量,如下表所示。
功能碼16響應報文示例:
字段 |
例 (Hex) |
ASCII 模式字符型 |
RTU模式8位 (Hex) |
幀頭 | “:” | ||
從設備地址 | 0x05 | “0”,“5” | 0x05 |
功能碼 | 0x10 | “1”,“0” | 0x10 |
起始地址 (高位) |
0x00 | “0”,“0” | 0x00 |
起始地址 (低位) |
0x13 | “1”,“3” | 0x13 |
寄存器數 (高位) |
0x00 | “0”,“0” | 0x00 |
寄存器數 (低位) |
0x03 | “0”,“3” | 0x03 |
差錯校驗 | LRC(2字符) | CRC(2字節) | |
幀尾 | CR/LF | ||
合計字節數 | 17 | 8 |
在實際開發過程中,功能碼“16(0x10)寫多個寄存器(Preset MultipleRegisters)”通常用于方便用戶寫入多字節類型的數據。
例如,假設從站設備地址為5,需要向保持寄存器寫入一個32位(4字節)的浮點數,那么此浮點數將占用2個寄存器地址。假設浮點數將存放在40001和40002寄存器中,設定值為1.235(即0x3F9E 147A)實際的查詢和響應報文如下(其中標記部分為設定的浮點數值,假設字節序為AB-CD,參考第5.3.7章字節序和大小端的內容)。
查詢報文:05 10 00 00 00 02 04 3F 9E 14 7A 05 86
響應報文:05 10 00 00 00 02 40 4C
對于64位(8字節)的雙精度浮點數,同理將占用4個寄存器地址共8字節的空間。特別需要注意的是字節序及大小端的問題,前面討論過多字節存在大小端問題,因此主站設備和從站設備必須保持一致的規則處理,約定Modbus傳輸中的數據字段的字節序,否則會因為大小端不一致而產生數據處理錯誤。
-
線圈
+關注
關注
14文章
1813瀏覽量
44362 -
寄存器
+關注
關注
31文章
5325瀏覽量
120052 -
功能碼
+關注
關注
0文章
10瀏覽量
2104 -
報文
+關注
關注
0文章
38瀏覽量
4017
原文標題:寫多個線圈與寫多個保持寄存器 - RZ MPU工業控制教程連載(35)
文章出處:【微信號:瑞薩MCU小百科,微信公眾號:瑞薩MCU小百科】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論