先把記錄窗口算清楚
異常發生後才開始記錄,常看不到真正的前因。環形紀錄平時持續保存最近一段資料,觸發時再保留前後窗口,適合追查壓力、狀態與通訊值在故障前的變化。本篇用100ms取樣說明容量、觸發與資料完整性,先做可驗算設計,再套到實際平台。
需求若是包含觸發前10秒到觸發時刻兩端,且觸發剛好落在規則取樣點,所需樣本數是10/0.1+1=101。若還要記錄觸發後2秒,新增20點,整份窗口121點;觸發點已在101點中,不能再加一次造成122。
先區分時間跨度與樣本數。100筆等間隔100ms的資料,首末只跨9.9秒;101筆才跨10秒。若規格只要觸發之前不含觸發的100點,則是另一個邊界定義。表格應寫清楚含不含端點,讓驗收者不必猜。
環形陣列的用途是容量固定、舊資料依序被新資料覆蓋。它不是完整歷史庫,沒有觸發或另行匯出時,超過保留窗口的資料就會消失。先選真正需要的點位與頻率,再估每筆值、時間、品質和索引所占空間。
QnUCPU手冊提供取樣追蹤功能說明,但不同機種、工具與條件有各自限制。本篇描述自訂環形紀錄的資料設計,不把121筆宣稱成任何CPU內建追蹤的固定容量,也不指定未核實的PLC陣列或檔案指令。
用小陣列學會寫入與讀出順序
先用容量五筆的離線模型練習。依序寫A、B、C、D、E後陣列已滿,下一筆F覆蓋最舊A,實體槽位可能變F、B、C、D、E,但時間順序應輸出B、C、D、E、F。直接從槽位零列到四會把時間排錯。
本例讓write_index永遠指向下一個要寫的位置,寫完後加一並對容量取餘數;valid_count從零增加,滿容量後不再增加。未滿時最舊資料在槽位零,滿後最舊資料就在write_index。這是明示設計,不是所有既有程式都採同樣索引語意。
每筆至少保存樣本序號、取樣時刻、數值與有效性。序號用於辨識先後,時間用於判斷實際跨度,品質用於區分零值和缺測。若來源有自己的時間,再與PLC或採集端記錄時間分欄,避免把通訊收到時刻當成來源量測時刻。
寫一筆資料時要避免讀者看到一半新、一半舊。可以採單一寫入者與適合平台的完成標記或快照策略,但其原子性需按資料寬度和任務執行模型確認。不能只用一個布林Busy就假定跨中斷與外部讀取都已互斥。
若五筆模型能正確讀出順序,再換成實際容量並測多次繞回。特別測剛滿、覆蓋一次、write_index回零和尚未填滿。這些邊界比平常連續寫入更容易暴露漏一筆或多列一筆的錯誤。
若每筆資料內容假設三十二bytes,121筆的純內容是3872bytes;還要另計索引、狀態、緩衝副本與檔案格式開銷。這只是容量試算,不是PLC實際配置大小,最終以工程工具與目標記憶體限制確認。
觸發後保護前窗並收集後窗
對121點需求,可在101筆前窗環形區外,準備獨立事件區保存前窗與20筆後窗。觸發時鎖定本次事件識別、觸發時刻、當下索引和有效筆數,再依一致性策略複製前窗,之後把新樣本附加到事件區。
複製不是自動原子操作。若複製期間來源環形區仍被覆蓋,可能混入較晚資料。可依平台能力採雙緩衝、短暫受控快照或版本檢查等方案,但必須測量對原控制程序的影響。若直接凍結整個唯一緩衝區,就無法同時在其中繼續收後窗。
另一種做法是使用至少121筆的單一緩衝,觸發後再收20筆才凍結。要證明這20筆覆蓋的是觸發前10秒以外的更舊資料,並固定讀出起點。這種方案與立即凍結前窗不同,設計文件應選定一種,再寫對應驗收。
第二次異常可能在第一份後窗還沒收完時到來。本例可選第一事件優先,第二次只追加觸發時間與原因,並明示沒有建立獨立窗口;若需求是每次都有獨立窗口,就需要事件佇列或更多緩衝,不能無聲覆蓋第一份。
事件區收齊後仍需可靠匯出。檔案寫入失敗、儲存空間不足或通訊斷線都應留下待匯出狀態與原因。不要在送出命令後立即清除唯一事件資料,應依實際儲存介面的完成確認與保存策略決定何時釋放。
用時間戳驗證完整性
規則案例以觸發t=20.0秒為例,前窗10.0至20.0共101點,後窗20.1至22.0共20點。完成後檢查首末時間10.0與22.0、序號連續、觸發點只出現一次,以及每筆間隔100ms;只看到121筆不能證明時間沒有缺口。
若觸發在20.05秒而取樣點仍是整個0.1秒,觸發前10秒邊界是10.05。嚴格選區間內樣本時前窗為10.1至20.0,只有100筆,最舊點比需求邊界晚50ms。應保存真實觸發時間和偏移,不把20.0偽裝成20.05。
若規格要求覆蓋完整前10秒,可額外保留邊界之前的10.0秒樣本,並清楚標示它是邊界外的前一點。這需要按最長取樣間隔、抖動與窗口規則預留容量,不能只把所有非對齊事件硬湊成101筆。
若中間少了18.3秒那一筆,即使另有重複資料補足筆數,仍應標缺樣。事件報告列期望區間、實際首末時間、缺口、無效筆數與是否完成後窗。開機未滿10秒就觸發或後窗尚未收完就斷電,也必須標示不完整。
失敗時先查索引與有效筆數,再查時間來源、取樣是否真的執行、複製期間是否被覆蓋,以及匯出確認。完成後應能依序重建故障前後資料並看見所有缺口。
常見問題
問:100ms取樣十秒一定是100筆嗎?答:含首末兩端且對齊取樣點是101筆;需先定邊界。
問:121筆如何分配?答:本例101筆含觸發點,再加後續20筆,觸發點不能重算。
問:觸發時直接凍結還能收後窗嗎?答:需另一個仍在寫入的區域或改採延後凍結設計,不能同一區既凍結又持續更新。
問:筆數正確是否等於完整?答:還要檢查時間跨度、序號、缺樣、有效性及觸發偏移。
參考:QnUCPU User Manual,第3.14節Sampling Trace Function;本文環形區為自訂設計,非原生指令。