10.5Modbus功能碼詳解
本節大部分內容參考《Modbus軟件開發實戰指南》。
10.5.1
功能碼概要
Modbus標準在協議中規定了以下3類Modbus功能碼。
公共功能碼:
①被明確定義的功能碼
②保證唯一性
③由Modbus協會確認,并提供公開的文檔
④可進行一致性測試
⑤包括協議定義的功能碼和保留將來使用的功能碼
用戶自定義功能碼:
①有兩個用戶自定義功能碼區域,分別是65~72和100~110。
②用戶自定義,無法保證唯一性。
保留功能碼:
保留功能碼因為歷史遺留原因,某些公司的傳統產品現行使用的功能碼不作為公共使用。
10.5.2
0x01)讀取線圈
1. 功能說明
01功能碼用于讀取從設備的線圈或離散量輸出的狀態,即各Do(DiscreteOutput,離散輸出)的ON/OFF狀態。消息幀中指定了需要讀取的線圈起始地址和線圈數目。需要注意的是,在Modbus協議規定的PDU中,所有線圈或寄存器地址都必須從0開始計算。
2. 查詢報文
如下表所示,查詢幀的消息中定義了從設備地址為3,并讀取從設備的Modbus地址0001900055(線圈地址 0002000056)共計37個狀態值。起始線圈地址為0x13(即十進制00019),因為線圈地址是從0開始計數的。
功能碼01查詢報文示例:
字段 | 例(Hex) | ASCII模式字符型 | RTU模式8位(Hex) |
幀頭 | “:” | ||
從設備地址 | 0x03 | “0”,“3” | 0x03 |
功能碼 | 0x01 | “0”,“1” | 0x01 |
起始地址 (高位) |
0x00 | “0”,“0” | 0x00 |
起始地址 (低位) |
0x13 | “1”,“3” | 0x13 |
寄存器數 (高位) |
0x00 | “0”,“0” | 0x00 |
寄存器數 (低位) |
0x25 | “2”,“5” | 0x25 |
差錯校驗 | LRC(2字符) | CRC(2字節) | |
幀尾 | CR/LF | ||
合計字節數 | 17 | 8 |
Modbus協議規定,起始地址由2字節構成,取值范圍為0x0000~0xFFFF。
線圈數量由2字節構成,取值范圍為0x0001~0x07D0(即+進制1~2000)另外,注意觀察ASCII模式和RTU模式的區別,ASCII模式直接按每4位拆分成對應的字符表示。
3. 響應報文
在響應報文的數據字段中,每個線圈占用1位(bit),狀態被表示為1=ON和O=OFF兩種類型。第1個數據字節的LSB(最低有效位)標識查詢報文中的起始地址線圈的狀態值,其他線圈以此類推,一直到這個字節的MSB(最高有效位)為止,并在后續字節中按照同樣的方式(由低到高)排列。
例如,下表中線圈20~27的狀態值分別是ON-ON-OFF OFF-ON-OFF-ON-OFF表示為二進制則為01010011(0x53),注意觀察對應的順序。1字節可以表示8個線圈的狀態如果最后的數據字節中不能填滿8個線圈的狀態,則用0填充。對應于查詢報文中需要讀取37個線圈的狀態,共需要5字節保存狀態值。
功能碼01響應報文示例:
字段 | 例(Hex) | ASCII模式字符型 | RTU模式8位(Hex) |
幀頭 | “:” | ||
從設備地址 | 0x03 | “0”,“3” | 0x03 |
功能碼 | 0x01 | “0”,“1” | 0x01 |
數據域字節數 | 0x05 | “0”,“5” | 0x05 |
數據1 | 0x53 | “5”,“3” | 0x53 |
數據2 | 0x6B | “6”,“B” | 0x6B |
數據3 | 0x01 | “0”,“1” | 0x01 |
數據4 | 0xF4 | “F”,“B” | 0xF4 |
數據5 | 0x1B | “1”,“B” | 0x1B |
差錯校驗 | LRC(2字符) | CRC(2字節) | |
幀尾 | CR/LF | ||
合計字節數 | 21 | 10 |
10.5.3
(0x02)讀取離散量輸入值
1. 功能說明
02功能碼用于讀取從設備的離散輸入,即DI(Discrete Input)的ON/OFF狀態。消息頓中指定了需要讀取的離散輸入寄存器的起始地址和數目,可以讀取1~2000個連續的離散量輸入狀態如果從設備接受主設備的請求則回復功能碼02,并返回離散量且輸入各變量的當前狀態。如果返回的離散輸入數量的個數不是8的整數倍,將用0填充最后的數據字節的剩余位。
2. 查詢報文
如下表所示,查詢頓的消息中定義了從設備的地址為3,并讀取從設備的離散輸入寄存器中地址10101~10120(Modbus地址表示為十進制100~119)共計20個離散輸入狀態值。從下表中可以發現,起始地址為0x64(即十進制100),因為消息PDU中的Modbus地址從0開始計數。
功能碼02查詢報文示例:
字段 | 例(Hex) | ASCII模式字符型 | RTU模式8位(Hex) |
幀頭 | “:” | ||
從設備地址 | 0x03 | “0”,“3” | 0x03 |
功能碼 | 0x02 | “0”,“2” | 0x02 |
起始地址 (高位) |
0x00 | “0”,“0” | 0x00 |
起始地址 (低位) |
0x64 | “6”,“4” | 0x64 |
寄存器數 (高位) |
0x00 | “0”,“0” | 0x00 |
寄存器數 (低位) |
0x14 | “1”,“4” | 0x14 |
差錯校驗 | LRC(2字符) | CRC(2字節) | |
幀尾 | CR/LF | ||
合計字節數 | 17 | 8 |
與5.4.2節中的功能碼(01(0x01)讀取線圈/離散量輸出狀態(ReadCoil status/DOs))一樣,本功能碼的起始地址由2字節構成,取值范圍為0x0000~0xFFFF;離散量數量由2字節構成,取值范圍為0x0001~0x07D0(即十進制1~2000),最多一次性可讀取2000人離散輸入狀態值。
3. 響應報文
響應報文的各項構成和意義與5.4.2章節的功能碼(01(0x01)讀取線圈/離散量輸出狀態(Re-ad Coil Status/DOs))一樣,如下表所示:
功能碼02響應報文示例
字段 | 例(Hex) | ASCII模式字符型 | RTU模式8位(Hex) |
幀頭 | “:” | ||
從設備地址 | 0x03 | “0”,“3” | 0x03 |
功能碼 | 0x02 | “0”,“2” | 0x02 |
數據域字節數 | 0x03 | “0”,“3” | 0x03 |
數據1 | 0x53 | “5”,“3” | 0x53 |
數據2 | 0x6B | “6”,“B” | 0x6B |
數據3 | 0x01 | “0”,“1” | 0x01 |
差錯校驗 | LRC(2字符) | CRC(2字節) | |
幀尾 | CR/LF | ||
合計字節數 | 21 | 10 |
需要技術支持?
如您在使用瑞薩MCU/MPU產品中有任何問題,可識別下方二維碼或復制網址到瀏覽器中打開,進入瑞薩技術論壇尋找答案或獲取在線技術支持。
-
MODBUS
+關注
關注
28文章
2118瀏覽量
79540 -
設備
+關注
關注
2文章
4667瀏覽量
71739 -
ModBus協議
+關注
關注
3文章
184瀏覽量
34383 -
功能碼
+關注
關注
0文章
10瀏覽量
2250
原文標題:Moubus功能碼詳解 - RZ MPU工業控制教程連載(30)
文章出處:【微信號:瑞薩MCU小百科,微信公眾號:瑞薩MCU小百科】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
臺達PLC通信支持modbus協議的4號功能碼嗎?
Modbus功能碼的回調函數如何編寫呢
什么是Modbus?Modbus用來干什么?Modbus的內容是什么?
基于Modbus功能碼細粒度過濾算法的研究

單片機程序中,Modbus功能碼的回調函數如何編寫--FreeModbus從站設計(10)

評論