← 所有文章

Modbus 0x08診斷 讀計數器 回送測試與會改狀態的子功能

· 站長

以回送PDU與計數增量案例教讀者辨認0x08診斷的副作用,保存清除前資料並避免把逾時當零。

診斷功能不一定只是讀取

你想知道線路為什麼出錯,第一步通常是保存目前狀態。若先按清除計數器,原本能說明故障頻率與累積時間的證據就消失了。Modbus 0x08把多種診斷放在同一個功能碼下面,真正決定動作的是後面的兩位元組子功能。只在操作畫面寫「Diagnostics」不足以判斷它是否改變設備狀態。

官方V1.1b3將0x08標為Serial Line only。不要因一台設備有Modbus TCP端口,就假定該端口支援串列診斷;透過閘道傳遞是否可用,也需由閘道與下游手冊共同確認。實際PLC若由自訂通訊程式組包,仍要另查程式的發送條件、互斥、逾時和接收檢查。

類別 子功能例(十六進位) 操作前判斷
回送資料 0000 可測試請求與回覆路徑,仍需支援證據
讀取資訊 0002、000B、000C 確認欄位、計數定義與重置起點
改變通訊狀態 0001、0004 可能重啟或停止正常回覆
清除累積資訊 000A、0014 先保存故障資料與清除原因

不要遍歷全部子功能來試哪一個能用。表中的分類是挑選診斷方法的起點;保留碼、未知碼及原廠未支援的子功能都應留在待確認欄。若維修工具只有一個整數輸入框,先看它使用十進位還是十六進位,避免把十進位10與十六進位10當成同一個子功能。

先用回送案例學會逐欄核對

離線建立一筆回送PDU:08 00 00 12 34。08是功能碼,00 00是Return Query Data,12 34是本例希望原樣回傳的兩個位元組。預期正常PDU也是08 00 00 12 34。這個案例只驗證回送結構,不讀Holding Register,不把1234當成某個PLC的D裝置地址。

欄位 請求 預期正常回覆 檢查
功能碼 08 08 不是88例外回覆
子功能 00 00 00 00 兩個位元組都相同
本例資料 12 34 12 34 逐位元組比較,勿交換
傳輸封裝 本表未含 本表未含 RTU另含站號與CRC

收到相同字串也先別急著宣布設備正常。有些串列轉換器或測試配置會把本地發送回送到接收端;要先確認沒有local echo,把實際站號、收發方向及遠端回覆時間一併保存。若回送測試通過,只能支持該條件下這一筆診斷交易成立,不代表所有功能碼、全部站點或長時間負載都正常。

離線反例:請求資料12 34,收到08 00 00 34 12。長度相同、功能碼相同仍不可接納,因為資料被交換。另收到88 01時,應記錄例外回覆並查功能或子功能支援度;不能把最後01解成診斷計數一。完全沒有回覆則先查支援、站號、串列格式及工具回送設定,不反覆送出其他會改狀態的子功能。

計數器要看增量 也要知道從何時開始

累積值1000本身不告訴你最近一分鐘是否惡化。建立基線時,至少記錄讀取時間、設備身分、子功能、原始十六進位資料、換算值、最近重啟或清除時間。各計數器統計的對象不同:總線上看見的訊息、本站處理的訊息、CRC錯誤與例外回覆不可混用。計算錯誤率前,先確認分子與分母具有相同觀察期間和統計母體。

自訂觀察項目 10:00讀值 10:01讀值 區間增量
本站記錄的總線訊息計數 1000 1120 120
CRC錯誤計數 8 11 3
例外回覆計數 2 2 0
已知重啟/清除事件 仍須查紀錄是否完整

本例可說一分鐘內CRC錯誤計數增加3、訊息計數增加120。若要算3÷120=2.5%,必須先確認該產品訊息計數的收錄規則是否包含出錯訊框;否則只保存兩個增量,不把這個比例冠上「封包錯誤率」。診斷查詢本身也會增加通訊負載與某些計數,測試時要保持相同查詢方式。

再看溢位反例。假設產品明確定義16位元無號循環計數,從65530變成9,而且期間最多一次繞回、沒有重啟或清除,增量為65536−65530+9=15。若產品採飽和計數,或資料不足以排除重啟,就不能套此公式。讀值變小時先標記基線失效,查電源、重啟紀錄及清除操作,再決定是否可延續統計。

把會改狀態的操作另列程序

0004 Force Listen Only Mode會令設備進入只監聽、不作一般回覆的狀態,而且該操作本身沒有正常回覆。它不是適合隨手測試的「讀診斷」。若維修工具曾使用這個功能,後續逾時不能只歸咎於接線。依官方與設備文件確認0001 Restart Communications Option的恢復方式、事件清除及回覆條件,不能把設備所有逾時都用重啟來處理。

000A清除計數器及診斷暫存器,0014清除overrun相關計數與旗標,兩者範圍不同。需要清除時,先匯出原值、操作人、原因、設備時間與主站時間,再另建一個新觀察區間。不要把清除前後的值直接相減,也不要宣稱清除計數本身修好了線路。清完後不再增加錯誤才是值得追查的觀察,仍須相同工況驗證。

程序階段 完成後應看到 失敗時先查
只讀基線 原始PDU與各計數值能追溯 子功能是否支援、資料長度
人工核准變更 操作效果與恢復方式已確認 是否會重啟、清除或停止回覆
新區間觀察 新起點、相同負載與查詢頻率 是否混用清除前後資料
交接報告 前後比較與未確認事項分開 只有結果截圖而無條件紀錄

使用測試替身可先驗證報告程式:餵入正常增量、單次繞回、重啟後歸零、例外回覆和逾時五種紀錄。正常增量應可計算;其他狀況要依明訂條件給出數值或「不可比較」。不得因缺少資料就把錯誤計數填零,否則畫面看起來乾淨,實際上只是診斷失去連線。

FAQ與型號限制

FAQ1:功能碼08就是讀診斷暫存器嗎?不是。需再看兩位元組子功能;其中有回送、讀計數,也有改狀態及清除操作。

FAQ2:回送成功可以證明數值縮放正確嗎?不能。回送並未檢驗量測寄存器的倍率、型別或字序,這些仍要用設備資料表和已知輸入核對。

FAQ3:計數器降到零表示修好了嗎?不一定。設備可能重啟或被清除,必須重建觀察起點;沒有回覆時更不能把計數當零。

FAQ4:所有Modbus TCP設備都能送08嗎?不能推定。官方章節限定串列用途,產品或閘道是否提供轉送與擴充須查原廠文件。

本篇沒有指定目標從站、韌體或某個PLC程式,不能宣稱任何現場設備已支援全部子功能。以Q06UDVCPU搭配QJ71C24N時,還需核對實際通訊程式是否實作Modbus、可組送哪些PDU、如何轉呈例外與逾時;本篇不提供未經專案核對的緩衝記憶體位址或指令。

參考:Modbus Application Protocol V1.1b3,6.8與6.8.1:串列診斷、子功能及回覆條件。

延伸閱讀


使用 PLC 工具箱 →