← 所有文章

模組診斷緩衝區如何整理成可搜尋的故障紀錄

· 站長

依模組契約保存原始診斷資料,整理批次、去重鍵、環形覆蓋與搜尋案例。

一 來源與契約

要把模組診斷整理成故障紀錄,先分清來源。CPU自我診斷、智慧型模組緩衝記憶體和模組錯誤歷史不是同一張通用表。緩衝記憶體可能只有目前錯誤狀態,未必有事件時間與歷史序號。先盤點Q06UDVCPU實際連接的模組型號、位置與版本,再查每個模組自己的手冊。

最小證據是sourceType、slot、model、rawCode、rawWords、eventTime、readAt、readResult。eventTime是模組描述的發生時刻,readAt是收集器讀取時刻,分開保存才不會把延遲誤當故障時間。

欄位 用途
sourceType 來源分類
slot/model 定位版本
rawCode/rawWords 原始證據
eventTime/readAt 分開時間

建立來源規格時記錄欄位位址、字數、有號或無號、碼值進位、更新條件及清除行為。本文不提供尚未核對模組的通用位址;同一數字在不同模組可能代表不同事件,因此搜尋和翻譯都必須帶上型號與來源身份。

再確認一次讀取涵蓋的資料是否一致。歷史表可能在讀取期間新增或旋轉,先讀到的索引與後讀到的內容未必屬同一輪。依該模組已提供的穩定讀法或序號核對;沒有保證時保存開始與結束時間,把一致性限制列入紀錄。

二 原始層與批次

讀到資料先寫immutable raw record,再產生normalized record。原始層保存來源、槽位、字組、事件時間、讀取時間和結果;正規化層才加入severity和關鍵字。讀取失敗不可複製上一筆正常值,否則通訊中斷會被誤報成恢復。只有目前狀態時標snapshot,不可冒充歷史。

每次收集建立批次編號,原始觀察逐次保存。若來源確實提供不重複事件序號,事件身份可採控制器身份、模組身份、來源重啟世代及序號;同一身份重讀可在查詢層合併。只有碼值和低解析度時間時,兩次真實事件可能相同,不宜直接刪掉其中一筆。

欄位 例值 作用
batchId B2026-01 追收集批次
來源事件身份 CPU-A/槽3/世代E2/序號17 只有已確認唯一性才合併
collectorEpoch E4 重啟分段
readResult OK/Timeout 失敗不補值

不要把所有欄位用加號串成未定義字串作唯一鍵。分欄保存身份或使用有明確欄位邊界的結構,避免槽位與碼值組合碰撞。收集器重啟編號只描述收集器,不一定等於模組重啟;若模組序號會重置,需另記來源世代與其判定依據。

原始層保留每次讀取,查詢層再增加中文說明、類別及映射版本。發現先前翻譯錯誤時,用新映射重建檢視即可,不能把原始字組改成新的診斷碼。未認得的碼保留原值與待解碼標記,並附實際手冊版本。

三 案例與環形覆蓋

以下完全是假設模組契約,不是某一三菱模組的碼表:槽3來源世代E2、事件序號17、原始碼0x21,來源時間09:59:58.400。收集器於10:00:00.120與10:00:01.000各讀到同一身份。原始層有兩筆觀察,事件檢視一筆、觀察次數為二;這不代表故障發生兩次。

若模組採環形歷史,最新事件可能覆蓋最舊項目。讀取器要保存讀取順序、lastReadAt和缺口;事件序號倒退、指標跳動或時間缺口時標possibleOverwrite,不能因資料庫有一筆就宣稱模組從未覆蓋。槽5無事件時間時eventTime=null,不能把readAt冒充發生時間。

時間 來源 結果
09:59:58.400 假設來源事件17 事件時間
10:00:00.120 第一次收集 原始觀察一
10:00:01.000 再讀事件17 原始觀察二
10:00:03.000 槽5無來源時間 僅保存讀取時間

假設之後出現事件序號18,碼值仍為0x21,就必須作為另一事件。相反地,某個目前狀態字由異常改正常,只支持兩個觀察點之間狀態改變;來源沒有明確關聯時,不能擅自宣告它是事件17的恢復版本。狀態快照與事件生命週期分開處理。

若歷史序號由17跳到20,先查18與19是否屬同一完整事件流、是否有篩選、重啟或覆蓋。只有已確認連續規則才可計算缺失兩筆。把序號倒退一律寫成環形覆蓋也不對,來源重置同樣可能造成倒退。

四 查詢與失敗先查

查CPU-A槽3在09:59至10:01的來源事件時,以控制器與模組身份、來源事件時間的半開區間篩選,再顯示讀取時間。槽5若沒有事件時間,不會憑空落入來源時間查詢;另外提供收集時間查詢,清楚標示它回答的是何時讀到,而非何時發生。

搜尋不到事件先查資料是否由模組提供、讀取是否成功、槽位型號是否寫反、歷史是否已覆寫。只有目前狀態而無歷史時,提高輪詢頻率不能補回消失事件;應另存snapshot。不要把CPU自我診斷碼當模組碼,也不要把清除LED當刪除歷史。timeout、格式錯誤、權限拒絕和不支援要分開記錄。驗收用新事件、相同事件重讀、讀取失敗三筆。

查詢 條件 結果
槽位 slot=3、時間區間 保留延遲
原始碼 rawCode=0x21 跨映射版本
覆蓋 quality=possibleOverwrite 列缺口

第二種查詢是相同型號與原始碼的歷史分布。查0x21時同時限制來源型號及碼表版本,避免把別的模組同碼混成同一故障。先看事件數,再看原始觀察數;本例兩次重讀同一事件應分別顯示一個事件與兩次觀察。

測試查詢還要加入一次逾時。逾時紀錄包含批次與失敗原因,但沒有新讀到的診斷值,不能用上次正常值填入。畫面可另顯示最後可信值及其時間,必須明確標成舊資料,避免操作員誤以為模組剛回報正常。

五 FAQ與限制

交付附raw、正規化結果、mappingVersion、手冊版本、收集器版本和batchId。CSV保留十六進位前綴及null,不把Unknown轉成零。完成預期是事件可查、重讀不重複、覆蓋有警示、失敗可追溯。

問:所有模組共用一張CPU診斷表嗎?答:不共用,先查實際模組手冊及來源類型。

問:同碼同時間可直接去重嗎?答:不保證。時間解析度或重複發生會碰撞,先確認事件身份規則,原始觀察應保留。

問:沒有事件時間怎麼搜尋?答:可按收集時間搜尋,但不能稱為故障發生時間查詢。

問:翻譯文字可以取代原始字組嗎?答:不能。保留原始資料與映射版本,才能日後重新解讀。

限制是未核對欄位不可自動解碼,Q06UDVCPU、序號及智慧型模組組合可能不同。本文不宣稱SM、SD或指令通用。

參考:QnUCPU手冊 第3.17與3.18節 CPU自我診斷及錯誤歷史範圍;特定模組緩衝記憶體仍須另查模組手冊

延伸閱讀


使用 PLC 工具箱 →