Modbus協定主要構成是位址碼/辨別碼,功能碼,寄存器位址,資料封包等内容。由于modbus協定是請求/應答通信協定,其其中功能碼主要用于表述該資料封包執行的功能,當伺服器對客戶機進行響應時,它使用功能碼域來訓示正常響應(無差錯)或者異常響應(即出現某種差錯),其中的modbus協定的功能碼衆多,在此我們一一列出與大家分享。
功能碼表
資料類型 | 功能描述 | 功能碼 | 功能碼(十六進制) | 異常功能碼 | |
比特通路 | 實體離散量輸入 | 讀輸入離散量 | 02 | 0x02 | 0x82 |
内部比特或者實體線圈 | 讀線圈 | 01 | 0x01 | 0x81 | |
寫單個線圈 | 05 | 0x05 | 0x85 | ||
寫多個線圈 | 15 | 0x0F | 0x8F | ||
16比特通路 | 輸入存儲器 | 讀輸入寄存器 | 04 | 0x04 | 0x84 |
内部存儲器或實體輸出存儲器(保持寄存器) | 讀多個寄存器 | 03 | 0x03 | 0x83 | |
寫單個寄存器 | 06 | 0x06 | 0x86 | ||
寫多個寄存器 | 16 | 0x10 | 0x90 | ||
讀/寫多個寄存器 | 23 | 0x17 | 0x97 | ||
屏蔽寫寄存器 | 22 | 0x16 | 0x96 | ||
檔案記錄通路 | 讀檔案記錄 | 20 | 0x14 | ||
寫檔案記錄 | 21 | 0x15 |
其中實體離散量輸入和輸入寄存器隻能有I/O系統提供的資料類型,即隻能是由I/O系統改變離散量輸入和輸入寄存器的數值,而上位機程式不能改變的資料類型,在資料讀寫上表現為隻讀,而内部比特或者實體線圈和内部寄存器或實體輸出寄存器(保持寄存器)則是上位機應用程式可以改變的資料類型,在資料讀寫上表現為可讀可寫。
錯誤代碼表
代碼 | 名稱 | 含義 |
01 | 非法功能 | 對于伺服器(或從站)來說,詢問中接收到的功能碼是不可允許的操作,可能是因為功能碼僅适用于新裝置而被選單元中不可實作同時,還指出伺服器(或從站)在錯誤狀态中處理這種請求,例如:它是未配置的,且要求傳回寄存器值。 |
02 | 非法資料位址 | 對于伺服器(或從站)來說,詢問中接收的資料位址是不可允許的位址,特别是參考号和傳輸長度的組合是無效的。對于帶有100個寄存器的控制器來說,偏移量96和長度4的請求會成功,而偏移量96和長度5的請求将産生異常碼02。 |
03 | 非法資料值 | 對于伺服器(或從站)來說,詢問中包括的值是不可允許的值。該值訓示了組合請求剩餘結構中的故障。例如:隐含長度是不正确的。modbus協定不知道任何特殊寄存器的任何特殊值的重要意義,寄存器中被送出存儲的資料項有一個應用程式期望之外的值。 |
04 | 從站裝置故障 | 當伺服器(或從站)正在設法執行請求的操作時,産生不可重新獲得的差錯。 |
05 | 确認 | 與程式設計指令一起使用,伺服器(或從站)已經接受請求,并且正在處理這個請求,但是需要長持續時間進行這些操作,傳回這個響應防止在客戶機(或主站)中發生逾時錯誤,客戶機(或主機)可以繼續發送輪詢程式完成封包來确認是否完成處理。 |
07 | 從屬裝置忙 | 與程式設計指令一起使用,伺服器(或從站)正在處理長持續時間的程式指令,當伺服器(或從站)空閑時,客戶機(或主站)應該稍後重新傳輸封包。 |
08 | 存儲奇偶性差錯 | 與功能碼20和21以及參考類型6一起使用,訓示擴充檔案區不能通過一緻性校驗。伺服器(或從站)裝置讀取記錄檔案,但在存儲器中發現一個奇偶校驗錯誤。客戶機(或主機)可重新發送請求,但可以在伺服器(或從站)裝置上要求服務。 |
0A | 不可用網關路徑 | 與網關一起使用,訓示網關不能為處理請求配置設定輸入端口值輸出端口的内部通信路徑,通常意味着網關是錯誤配置的或過載的。 |
0B | 網關目标裝置響應失敗 | 與網關一起使用,訓示沒有從目标裝置中獲得響應,通常意味着裝置未在網絡中。 |
我們以Modbus RTU協定為例,位址碼為0x01,寫操作0x10,寄存器位址為0x018E,CRC校驗。如寄存器可讀寫的話,傳回正常,如寄存器隻讀,傳回異常。
下發指令:01 10 01 8E 00 01 02 00 00 69 BE(向寄存器0x018E寫入一個數值為0的資料)
正确回應指令:01 10 01 8E 00 01 60 1E(向寄存器位址0x018E寫操作一個寄存器)
錯誤回應指令:01 90 01 8D C0(寫操作非法功能,可能是向輸入寄存器寫資料)