← 所有文章

FIELD NOTES / 維護與故障排查

設備時間錯開時如何驗證事件排序規則

維護與故障排查作者:站長預估 5 分鐘閱讀

用偏移、補送、同時戳與重啟案例,驗證事件時間與接收時間的排序界線。

本文目錄

先決定畫面要回答哪一種先後

兩台設備的事件時間相差一秒,不能立刻認定其中一台先動作。設備時鐘可能有偏移,資料還會受到傳輸延遲、補送與接收端排隊影響。開始測試前,先寫清楚要驗證的是來源內部順序、伺服器收到順序,還是跨設備的實際發生順序;三者使用的證據不同。

本文適用於具備事件記錄與可重播測試資料的採集服務、HMI歷史事件及報表系統,沒有指定PLC時鐘位址或同步指令。先在測試資料中製造偏移,不直接調整運轉設備時間。實際控制器的校時方式、精度與時間跳變影響,須另依型號手冊驗證。

每筆測試事件保留來源名稱、啟動識別、來源序號、原始時間字串、時區、接收時間與時鐘品質。若產生校正時間,另外保存校正版本與依據。原始時間不可被覆蓋,否則日後無法分辨是設備當時報錯,還是後處理算錯。

先寫驗收規則:同一來源及啟動期間以可信序號核對產生順序;跨來源只能在時鐘誤差界限與其他證據足夠時判定。若只是提供穩定的列表順序,可加來源名稱與事件識別作為同時戳的排序鍵,但必須說明這是顯示規則,不代表物理先後。

用可計算的偏移案例檢查誤判

假設測試基準時間十二點整,設備甲在基準零秒發生事件,時鐘快五秒,回報十二點零分零五秒。設備乙在基準二秒發生事件,時鐘慢三秒,回報十一點五十九分五十九秒。直接依原始時間排序會把乙排前面,與已知測試輸入相反。

若測試確定甲偏移正五秒、乙偏移負三秒,校正值等於原始值減去偏移;甲回到零秒,乙回到二秒。完成後應同時看到原始欄與校正欄,並能指出校正使用哪次量測。不能只展示整理後的漂亮時間線,而把錯開的原始資料刪掉。

接著加入傳輸延遲:甲的事件在基準四秒才收到,乙在三秒收到。按接收時間排序也會把乙排前,但接收紀錄本身並沒有錯。這個案例用來驗證介面是否正確標示「接收時間」與「事件時間」,以及報表是否偷偷換了時間欄位。

將所有時間換成UTC只會統一時間表示方式,不會修正設備快五秒的誤差。沒有時區的字串應按既定來源設定解讀或標成不確定,不能由伺服器所在地任意猜測。Python的datetime文件可協助理解帶時區與不帶時區物件的差別,實際欄位仍由介面契約規定。

測試同時戳 倒退與重新啟動

來源每秒只保留整秒時間,可能在同一秒產生十筆事件。準備序號一到十且時間相同的資料,再打亂到達順序,檢查來源內排序能否保留序號資訊。如果系統只有整秒時間而沒有其他識別,就應承認無法還原那十筆的實際順序。

模擬時間向後調整:序號二十的時間為十秒,序號二十一變成八秒。來源順序仍可由序號表達,但時間線應提示時間跳變,不能把第二筆當成重複舊資料刪除。去重應採事件識別,不宜只以時間與數值相同作判斷。

再模擬重新啟動後序號歸零,啟動識別須改變。來源甲、舊啟動的序號一百與來源甲、新啟動的序號一,不可當作同一連續計數器比較。若設備沒有啟動識別,系統應明定重啟偵測與不確定區間,不能憑空假設序號永久遞增。

同一批資料重播兩次,顯示排序應保持穩定,事件也不應因重播而增加兩倍。測試輸入、排序欄、同值次序與去重鍵都要保存。失敗時先分辨「同時戳順序每次不同」與「事件遺失」兩種問題,前者可能是排序鍵不完整,後者需要追查接收和儲存鏈。

把時間不確定度留在驗收結果裡

假設甲的校正事件時間為零秒、可能誤差正負二秒;乙為一秒、誤差也正負二秒。兩個可能區間重疊,單憑時間不能判定甲一定先於乙。驗收可以要求標示順序不確定,不能要求系統為了列表整齊而產生沒有依據的因果結論。

若另有命令識別證明乙的事件是收到甲的特定命令後才產生,這是另一種關聯證據。仍應區分訊息的因果順序與實體機構到位時間;接收到命令不等於動作已完成,不能用通訊流程替代設備狀態的證明。

先查原始字串與時區,再查偏移量的符號、量測有效期間及來源重啟,最後才檢查畫面排序。偏移不一定長時間固定,若校正使用了過期量測,應降低可信度或停止套用。測試可加入偏移逐漸變化,確認系統不把一次校時視為永遠準確。

交付時附上輸入事件表、預期各種排序、實際輸出與不確定區間。成功標準是系統依約定表達可知與不可知的順序。

練習與常見問題

練習:甲的原始時間八秒且快三秒,乙的原始時間六秒且慢一秒。校正後甲為五秒、乙為七秒。若兩者誤差都在正負零點二秒,區間不重疊;若都可能誤差兩秒,區間便重疊,時間證據不足以唯一決定先後。

完成練習後,再把乙的接收時間設成九秒、甲設成十秒,確認接收列表與校正事件列表得到不同但各有明確意義的順序。若兩張列表仍完全相同,先查它們是否實際都使用了資料庫插入時間。

問:轉成UTC後就可以比較先後嗎?答:還需要時鐘準確度與事件時間的定義;UTC不會消除來源偏移。

問:序號較小就一定比較早嗎?答:只能在明確來源、啟動期間及序號規則內使用,還須處理回捲或重置。

問:接收端時間是否比較可靠?答:它可描述該接收端的觀測順序,但無法直接代表跨設備的發生順序。

問:無法判定先後算測試失敗嗎?答:若需求允許並正確標示不確定,就是符合限制的結果;若需求必須判定,則還缺同步精度或關聯證據。

參考:Python datetime官方文件:帶時區與不帶時區時間的表示差異。

延伸閱讀