← 所有文章

PLC Watchdog 觸發時 辨別執行超時與遺漏週期

· 站長

以執行過久與遺漏週期兩種案例辨別 Watchdog 原因,建立負載證據與不放寬門檻的排查順序。

Watchdog 是時間保護不是延遲開關

Watchdog 觸發表示任務的時間行為超出平台允許範圍,但原因可能不同:任務已開始卻執行太久,或任務根本沒有在期限內開始。兩者的排查方向不同。CODESYS Task 文件把一般 watchdog 描述為任務執行時間超過設定值,也另外說明 Omitted Cycle watchdog 用來處理任務沒有開始執行的情況。不要只看到超時就把時間放寬。

本文用一個合成任務案例:週期 10 ms,正常執行約 2 ms。案例A在隔離測試中加入昂貴排序,執行時間升到14毫秒;案例B是另一條獨立時間線,描述高優先任務長時間占用CPU時低優先任務沒有開始的情況。不可把A故障後的下一個掃描當成B仍會自然運行。兩者都可能在畫面上被簡化成『Watchdog error』,但需要用任務監看、優先級、週期與程式段證據分類。

類型 關鍵問題 第一份證據
執行超時 任務是否已開始並跑太久 執行時間與程式段
遺漏週期 期限內是否根本沒開始 排程、優先級與啟動紀錄
連續超時 是否多周期累積 敏感度與連續次數
外部原因 是否由系統或 I/O 等待造成 平台診斷與資源負載

CODESYS 文件指出 watchdog 可有 Time 與 Sensitivity,某些設定以週期百分比表示;預設範圍依裝置而異。這些數字不是 Q 系列或其他平台的通用值。先取得目標 CPU 的設定與例外行為,再決定驗收條件。

先保存超時前後的時間線

  1. 記錄 CPU、工程軟體、任務名稱、週期、優先級、watchdog time 與 sensitivity。

  2. 確認錯誤發生時是單次、連續多次,或任務完全沒有執行。

  3. 保存程式版本、最近變更、輸入條件與同時運行的其他任務。

  4. 以合成負載在測試環境重現,不在正式設備上盲目增加負載。

  5. 將修正前後的最大、平均與抖動分開比較。

不要把系統時間戳當成任務執行時間。任務啟動與完成最好有同一時基的計數或平台監看值;若只拿 HMI 顯示時間,畫面刷新會掩蓋短暫超時。案例紀錄也應包括錯誤前最後一次成功週期,因為它能提示負載是逐步增加還是突然出現。

獨立案例與紀錄 執行時間 高優先任務 結果
A101 2.1 ms 未占用 正常
A102 2.3 ms 未占用 正常
A103 14.0 ms 未占用 執行超時候選
B1 無資料 持續占用 遺漏週期候選

如果錯誤後輸出被重置,這可能是平台設定的結果,不是程式主動把輸出關掉。CODESYS 文件提到啟用 PLC Settings 的 Update I/Os 時,錯誤後可能將輸出重設為定義的預設值;目標系統是否如此要查自己的文件。報告必須把平台行為和應用邏輯分開。

案例A與B分別由相同正常基線開始。A的最後一筆完成耗時可能因watchdog提前中止而無法取得,表列14毫秒代表離線假設負載,不是故障後一定能讀到的完成紀錄。B應另記未開始的持續時間,不能只憑單筆無資料判定遺漏週期。

辨別執行太久與根本沒開始

第一個判斷是找任務開始標記。若開始標記有更新但完成標記很晚或沒有更新,偏向執行超時或程式卡在某段。若開始標記長時間不變,而其他高優先任務仍在跑,偏向遺漏週期、優先級競爭或排程資源問題。標記本身也要放在安全且可觀察的位置,不能在初始化失敗時就被誤解。

CODESYS 任務文件說明優先級 0 為最高,單核心上高優先任務可能中斷低優先任務;同優先任務可用 round-robin。多核心還涉及核心綁定與作業系統。這表示『把週期改小』可能讓情況更糟,『把優先級調高』也可能壓住其他必要工作。任何改動都要有負載和功能回歸測試。

  1. 在測試版加入開始、完成與錯誤序號,並限制記錄量。

  2. 分別注入單次長計算和高優先任務占用,形成兩組基準。

  3. 比較任務開始序號、完成序號、執行時間與 watchdog 計數。

  4. 檢查同核心任務、程式呼叫順序和 I/O 更新時機。

  5. 恢復原始設定,確認診斷程式不改變正式控制行為。

觀察組合 較合理分類 仍需確認
開始+,完成延遲 執行超時 卡住的程式段
開始不變,其他任務忙 遺漏週期候選 優先級與核心
單次錯誤後恢復 單次超時 敏感度設定
每次都未開始 排程或啟動問題 任務使能與系統狀態

找出真正的負載來源

執行超時的常見候選包括大型迴圈、排序、字串處理、檔案或通訊等待、一次複製大量陣列,以及多個程式在同一任務內連續呼叫。不要一看到某個函式就宣稱它是根因;先以分段計時或平台分析工具確認。量測工具本身也可能增加負載,應用少量標記和短測試窗。

把單次尖峰和長期平均分開。平均 2 ms 不代表不會偶爾出現 20 ms;watchdog 可能正是被尖峰觸發。以固定輸入重播最壞路徑,例如最大陣列長度、最長字串和所有設備同時回覆。若無法取得真實最壞資料,報告要標記假設,不用正常資料推導保證。

程式段 正常 最壞測試 處置方向
輸入整理 0.2 ms 0.4 ms 保留
排序 0.8 ms 9.5 ms 分批或改演算法
通訊解析 0.6 ms 3.1 ms 限制長度與等待
報表統計 0.4 ms 6.0 ms 移至低頻任務

將工作拆到不同任務不是自動安全解法。資料交換會引入一致性、優先級與更新時序問題;還要確認總負載沒有只是從一個任務移到另一個任務。若平台支援週期任務、事件任務或狀態任務,依官方語意選擇,並檢查短事件是否可能漏掉。

為什麼不應單純放寬 watchdog

把 watchdog time 調大會降低誤觸發,但同時延後發現任務卡住或排程失效的時間。若原本 10 ms 任務偶爾跑到 40 ms,直接改成 100 ms 只是掩蓋負載問題,也可能讓資料更新和現場反應變慢。正確順序是先保存證據、降低或分散負載、確認週期需求,再依平台允許的範圍設定監控。

若初始化確實需要較長時間,先拆解為可觀察的階段,記錄進度、等待上限及完成前禁止接受的工作。任何例外監控策略都需要目標平台明確支援,並驗證恢復監控的生命週期;本文不提供停用watchdog的操作步驟。

  1. 先重現並取得最壞執行時間,不先調高門檻。

  2. 找出造成尖峰的程式段,限制資料量或改為分段處理。

  3. 若必須重排任務,檢查共享資料與 I/O 更新的一致性。

  4. 依設備文件設定合理 watchdog 與 sensitivity,記錄理由。

  5. 以正常、最壞與故障注入三組測試驗證仍能被偵測。

驗收應同時包含『不該觸發時不誤觸發』與『真的卡住時要觸發』。只跑正常流程只能證明沒有立刻報錯,不能證明保護還有效。案例中的長計算只有在超過實際Time與Sensitivity規則時才應觸發;優先任務占用也需滿足目標平台的遺漏週期門檻才會診斷,並留下平台對輸出的處理結果。

驗收 交接與常見問題

驗收項 通過條件 證據
分類 執行超時與遺漏週期分開 開始/完成序號
負載 最壞路徑低於合理門檻 分段時間表
監控 真正卡住仍被偵測 故障注入紀錄
恢復 錯誤後狀態符合平台規格 CPU/輸出診斷
交接 設定與版本可回查 專案與報告

問:Watchdog 一直觸發,先把值加大可以嗎?不應作為第一步,先判別任務超時或遺漏週期並找負載。問:錯誤後輸出一定會關閉嗎?不一定,要查目標系統與 I/O 設定。問:高優先級就能解決遺漏週期嗎?可能壓住其他任務,必須量測整體影響。問:初始化能不能永久停用 watchdog?這會失去重要診斷,只有平台明確支援且有邊界的特定情境才討論。

適用型號與限制:本文引用 CODESYS Task 的任務、優先級、週期、sensitivity 與 Omitted Cycle 概念作為診斷框架;沒有把它們宣稱為 Q 系列 CPU 或 GX Works 的同名設定。正式工程須核對目標 CPU 的 watchdog 類型、例外處理、輸出狀態與任務排程;所有程式片段僅為教學邏輯。

參考:CODESYS 任務與 Watchdog

延伸閱讀


使用 PLC 工具箱 →