診斷位元為何需要計數
診斷位元瞬閃時,人工監看通常只看到最後狀態,無法回答它在一段時間內翻轉幾次。把問題改成事件計數,先定義取樣週期、位元來源、重啟規則與未知值處理,再談計數結果。本文只提供可重算的概念演算法,不是三菱ST語法,沒有宣稱已編譯或在PLC上執行。
離散樣本0、0、1、1、0、1的差分是:第一次0到0沒有變化,第二次0到1是一個上升,1到1沒有變化,1到0是一個下降,0到1再一個上升。因此上升次數為2、下降次數為1。這個計數描述的是採樣點之間可見的邊緣,不是實體輸入在採樣間隔內所有脈衝的保證總數。
啟動後第一次讀到1時,若沒有前一個可靠樣本,不能自動算成上升事件。應把第一次讀值設為baseline,標記「基線建立」,從下一筆與它比較。若啟動第一筆為0,後面第一筆變1,則可在假設啟動時狀態可信的前提下計數;這個假設要寫進紀錄。
本文固定採用缺口重建基線策略:讀取失敗或來源無效時,不把未知當0,也不跨缺口計算邊緣。保留已累計次數與缺口數,將基線有效旗標清除;下一個有效樣本只建立新基線,之後才恢復相鄰比較。缺口期間實際發生幾次仍為未知。
QnUCPU手冊的Error History和GX Works2診斷功能能協助查控制器事件,但不會替任意診斷位元保存每一個邊緣。若需求是捕捉瞬閃,必須核對該型號、模組和取樣功能;普通監看畫面不能當高速事件記錄器。
樣本 邊緣與基線
概念上保存前值、基線有效旗標、上升次數、下降次數及無效樣本數。每輪先查資料有效性:無效就增加無效次數並使基線失效;有效但沒有基線就只存前值;有效且有基線才比較0到1或1到0,最後更新前值。這是演算法說明,不是三菱宣告語法。
原序列第一筆建立基線0,第三筆上升一次,第五筆下降一次,第六筆再上升。若改為0、0、1、未知、0、1,第四筆造成缺口,第五筆只重建基線0,第六筆再上升;已觀察上升共二、下降零,另有一筆無效,真實總數仍不完整。
| 樣本序號 | 讀值/品質 | 動作 | 累計結果 |
|---|---|---|---|
| 1 | 0/Good | 建立baseline | Rise0 Fall0 |
| 2 | 0/Good | 無邊緣 | Rise0 Fall0 |
| 3 | 1/Good | 上升 | Rise1 Fall0 |
| 4 | 1/Good | 無邊緣 | Rise1 Fall0 |
| 5 | 0/Good | 下降 | Rise1 Fall1 |
| 6 | 1/Good | 上升 | Rise2 Fall1 |
重啟也形成觀察缺口。即使保留了重啟前的前值,也不能證明停機期間沒有翻轉;本篇重啟後一律以第一個有效樣本重建基線,將保留的累計數按來源世代管理。若產品本身有持續工作的硬體累計器,應按其獨立規格讀差分,不能混作軟體邊緣計數。
如果多個任務或來源同時更新同一計數資料,還要確認寫入者與讀取者的同步;本文只談單一明確採集流程。沒有單寫入者、原子快照或可證實的資料交換方式時,計數值本身只能標記為可能競態,不能拿來做精確稽核。
掃描與脈衝漏失
假設PLC掃描週期10ms,而診斷位元只在2ms內為1。若脈衝恰好發生並結束於兩次程式讀取之間,程式可能讀到0、0,完全沒有上升事件。這是取樣間隔與相位造成的漏失,不是計數公式錯誤。
HMI每500ms更新一次時,漏失風險更高。即使PLC內部曾讀到1,HMI仍可能只顯示前後兩個0;因此HMI趨勢適合呈現慢變狀態,不能用來證明2ms瞬閃沒有發生。
要處理瞬閃,先確認來源是否有事件鎖存、硬體計數、取樣trace或其他產品明載功能,再確認其最小脈寬、容量與讀取清除行為。本文不杜撰指令或特殊暫存器;若手冊沒有保證,就把「可能漏失」寫入驗收限制。
| 時間條件 | 可觀測結果 | 能否計數 | 限制 |
|---|---|---|---|
| 掃描10ms、脈衝2ms在兩次讀取間 | 0→0 | 不能 | 脈衝完全漏掉 |
| 掃描10ms、脈衝跨越一次讀取 | 0→1→0 | 可見一升一降 | 只知道取樣點間可見 |
| HMI500ms顯示 | 前後可能皆0 | 不能證明沒有事件 | 顯示刷新太慢 |
| 硬體事件計數 | 讀到累計值 | 依型號文件判斷 | 要核對溢位與清除 |
若把掃描改成5ms,2ms脈衝仍可能在相位不利時漏掉;加快輪詢只能降低某些風險,不能宣稱全抓到。測試時要改變脈衝相位與寬度,並保留來源波形或已核實的事件計數,否則單一次成功讀到不代表覆蓋全部條件。
診斷位元快速變化還可能來自資料品質翻轉、通訊重送或來源重啟。先把原始值、品質、來源時間和採樣序號分欄,不要只保存最後的布林值;只有這樣才能排查「真脈衝」和「資料層瞬變」的差別。
計數器回繞與失敗排查
假設外部無號十六位元累計器依模65536回繞。新值0、舊值65535,在來源未重置、身份一致且已證增量小於65536時,差分為(0−65535+65536) mod 65536=1。不是所有產品都採回繞而非飽和,先查產品規格,再使用此公式。
一般差分要證明區間增量小於一整圈,僅說最多一次回繞還不夠。例如舊值10、新值20,既可能增加10,也可能增加65546並回繞一次。用最大事件速率乘最大讀取間隔檢查上限,再查是否重置;證據不足就標未知,不能選較小值當事實。
失敗排查先看資料品質和取樣序號,再看baseline與重啟標記,最後才看計數差分。若RiseCount突然增加但UnknownCount也增加,不能直接把增加歸因於設備故障;可能是資料路徑恢復後的狀態跳變。
驗收可以用操作序列重算:輸入0、0、1、1、0、1,預期Rise2、Fall1;插入未知後,預期結果依既定未知策略標為不可判定;加入restart marker後,下一個可信值只建立新baseline。這些是演算法測試資料,不是硬體模擬或編譯結果。
適用限制包括Q系列CPU、模組、GX Works2版本和診斷來源差異。手冊章節可核對診斷、取樣與錯誤歷史的功能邊界,不能替專案保證掃描時序、輸入濾波或特殊模組行為。
FAQ與來源
FAQ1:樣本0、0、1、1、0、1的上升與下降是多少?答:上升2次、下降1次,前提是所有樣本Good且第一筆只建立baseline。
FAQ2:第一次讀到1是否算上升?答:沒有可靠前值時不算,先建立baseline;若需求明確假定啟動前狀態為0,才可另行計算並記錄假設。
FAQ3:PLC掃描10ms、脈衝2ms,能否保證計數?答:不能,脈衝可能完全落在兩次讀取之間;需核對有文件支持的鎖存或硬體計數功能。
問:65535變0是不是一次事件?答:在已核對模65536回繞、來源沒有重置且區間增量小於65536時可算1;若來源或計數規則不明,就不能如此推定。
參考:GX Works2 Version 1 Operating Manual Common:診斷、監看與Sampling Trace章節的文件核對。
參考:Mitsubishi QnUCPU User Manual:3.14 Sampling Trace與3.18 Error History的文件核對。