Modbus功能碼/異常功能碼/錯誤碼
阿新 • • 發佈:2018-12-29
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(寫操作非法功能,可能是向輸入暫存器寫資料)