← 所有文章

PLC 掃描週期與輸入輸出更新

· 站長

用五次掃描表追蹤輸入快照、兩個內部位元與輸出命令,說明程式順序如何改變結果,以及短脈衝為什麼可能被漏掉。

先分清楚程式值與端子訊號

同一掃描內,前面程式剛寫入的內部位元,後面程式通常就會讀到新值;實體輸出端子則要依 I/O 更新機制改變。你若把「程式裡已經變成 ON」和「端子已經輸出」當成同一時刻,就很容易把正常時序誤判成程式慢一拍。

先用一個沒有接馬達的虛擬按鈕練習。我們要追蹤輸入快照、兩個內部位元及一個輸出命令,逐行推算五次掃描,再比較交換程式順序後的差異。讀完後,你應能指出每個值是在哪一行改變,以及下一段程式會讀到什麼。

觀察位置 代表什麼 本篇名稱
輸入端子 現場真正的電氣訊號 實體按鈕
輸入快照 本次更新後供程式讀取的值 Input
內部位元 程式執行中可讀寫的記憶資料 M10、M11
輸出命令 程式準備交給輸出更新的值 Out
輸出端子 輸出模組對外的實際狀態 實體輸出

M10、M11 在這裡只是便於討論的內部位元名稱;Out 也是虛擬變數,不綁定真實負載。本篇的三行式子是執行順序偽碼,並非可直接匯入 GX Works2 的完整程式。先把觀察位置講清楚,再談平台指令。

本篇採用的條件

假設只有一個每掃描執行的循環程式,初始 M10、M11、Out 都為 0;沒有中斷、其他程式或通訊寫入這三個變數。輸入只在更新點形成快照,程式執行期間快照不變。這些條件讓每一步結果都能用手算確認。

沿著一次循環追蹤資料

請先在紙上畫一個圈,把循環邊界、程式執行與下一個邊界連起來。對 Q06UDVCPU 所屬的 Universal model QCPU,原廠將 refresh mode 的 I/O 批次處理說明為在順序程式運算開始之前進行。不要把所有 PLC 都畫成同一張固定時序圖。

本例把邊界看成一次批次更新:前一輪留下的輸出命令交到輸出側,同時取得這一輪的輸入快照;程式接著按順序計算,完成後經過 END 等處理,再回到下一個更新邊界。用這種標法,可以清楚區分「本輪算出」與「下次更新生效」。

時點 做什麼 你應讀哪個值
本輪更新邊界 更新 I/O 資料 取得本輪 Input;套用前輪 Out
程式第 1 行 M10 := Input M10 立刻成為本輪 Input
程式第 2 行 M11 := M10 讀到第 1 行更新後的 M10
程式第 3 行 Out := M11 形成這輪的輸出命令
下一輪更新邊界 再次更新 I/O 本輪 Out 才按此模型套用至輸出側

冒號等號表示把右邊當下的值放進左邊。它不是把關係永久接起來:M11 := M10 執行後,後面若再改 M10,M11 不會自動跟著改,除非程式又執行一次對 M11 的賦值。

哪些情況要改用另一個模型

直接 I/O 存取、立即更新指令、網路 I/O、智能模組及中斷任務都有各自時序。遇到這些功能,先查實際 CPU 與模組手冊,不能把本例的單一快照假設直接套過去。輸入模組濾波、輸出模組響應及通信更新也不等於程式掃描時間。

先預測五次掃描的正常結果

我們讓 Input 依次為 0、0、1、0、0,只在第 3 次掃描為 ON。每輪皆依前頁的三行順序執行。先遮住下表結果,自己填一次;特別注意 M10 和 M11 並不需要各等一輪才更新。

掃描 Input 第1行後 M10 第2行後 M11 第3行後 Out 本輪邊界輸出
1 0 0 0 0 0
2 0 0 0 0 0
3 1 1 1 1 0
4 0 0 0 0 1
5 0 0 0 0 0

第 3 輪最關鍵。更新時拿到 Input=1,但邊界套用的是前輪 Out=0,所以實體側尚為 0。第 1 行把 M10 改成 1,第 2 行立即讀到這個 1,第 3 行再把 Out 改成 1。等到第 4 輪更新邊界,輸出側才套用這個命令。

第 4 輪程式算完,Out 已回到 0;但在下一次更新前,輸出側仍可能維持上次套用的 1。這正是監看工程值與測量端子時,必須記錄觀察時點的原因。表格最後一欄是本例的理想更新結果,不包含模組電氣延遲。

完成後應看到什麼結果

內部位元與 Out 的掃描末序列都應為 0、0、1、0、0;邊界套用輸出應為 0、0、0、1、0。若內部位元已經多延遲一輪,先檢查程式順序或是否有條件呼叫;若只是端子晚變,先查更新位置與模組響應。

不要以人眼盯住監看視窗取代逐掃描記錄。畫面更新通常不能保證顯示每次掃描,短暫的一輪狀態可能完全看不到。驗證時應保存記錄表或使用目標平台支援的追蹤方式。

交換兩行為什麼會多延遲一輪

現在只交換前兩行:先執行 M11 := M10,再執行 M10 := Input,最後仍然是 Out := M11。三個式子都還在,條件也沒有改,但第 1 行讀到的是上一輪留下的 M10。這就是執行順序造成的差異。

掃描 Input 第1行後 M11 第2行後 M10 掃描末 Out 邊界輸出
1 0 0 0 0 0
2 0 0 0 0 0
3 1 0 1 0 0
4 0 1 0 1 0
5 0 0 0 0 1

第 3 輪 M10 最後雖然變成 1,但 M11 早已讀完舊值 0,所以 Out 仍為 0。到了第 4 輪,M11 才讀到上一輪的 1;再到第 5 輪邊界才套用輸出。請把原因指到某一行讀了舊值,而不是只說「PLC 反應比較慢」。

同一個變數被寫兩次時

若前段設定 Out=1,後段又無條件把 Out 改成 0,在本例的循環更新模型中,下一次更新拿到的是最後留下的 0。程式中間曾出現 1,不代表實體輸出一定出現過脈衝。使用交叉參照找出所有寫入點,再依真正執行順序列出它們。

失敗時先查哪裡

  1. 先確認這段程式本輪真的執行:是不是放在未呼叫的子程式、條件分支或不同任務。

  2. 再查同一變數的所有寫入位置,包括初始化、HMI 或通訊寫入。只看一個線圈不夠。

  3. 最後核對觀察時點:你看到的是本輪中間值、掃描末值、輸出快照,還是實體端子。

短脈衝與持續訊號如何被取樣

假設純運作模型每 10 ms 取得一次輸入快照,更新點為 0、10、20、30 ms。輸入在 2 ms 變成 ON、5 ms 已回 OFF,這兩個更新點都讀到 OFF,因此一般快照程式可能完全不知道曾經有這個脈衝。

訊號 ON 時段 10 ms 時讀值 20 ms 時讀值 本例判讀
2–5 ms 0 0 可能完全漏掉
8–12 ms 1 0 有一輪看到 ON
8–25 ms 1 1 至少兩次快照看到 ON

以上只研究取樣相位,沒有把輸入濾波和抖動加進來。脈衝落在更新點附近時,還要看模組門檻、濾波與時序。不能只因「脈衝比平均掃描稍長」就保證每次都抓得到;應依最差更新間隔與模組規格評估。

需要可靠擷取短脈衝時,優先核對設備是否支援高速計數、脈衝捕捉或適合的中斷輸入,以及最小脈寬。單純把普通程式改成上升緣判斷,並不能補回從未被取樣到的訊號。

在離線環境怎麼做這個練習

  1. 建立獨立測試專案,選 Q06UDVCPU 或你的目標 CPU,僅使用虛擬輸入與內部變數,不配置真實致動輸出。

  2. 依序輸入五筆測試值。採用平台支援的單掃描控制或程式內掃描索引,避免手動滑鼠點擊的速度被誤認為一個掃描。

  3. 分別記錄正向與交換順序兩個版本。比對每輪的內部狀態,不用軟體模擬器推定真實模組濾波或端子延遲。

適用範圍與常見問題

適用型號與限制

本篇以 Q06UDVCPU 所屬 Universal model QCPU 的循環執行與 refresh mode 為平台背景;三行邏輯及表格是獨立運作模型。其他 PLC 可使用逐行追蹤方法,但任務、I/O 更新和直接存取規則需重新核對。QJ71C24N 不參與這個虛擬掃描案例。

QnUCPU 官方手冊 SH-080807ENG-AF 的第 2.4 節說明掃描時間結構,第 2.8 節區分更新與直接模式。本文未指定 GX Works2 安裝版本。

內部位元也要等到下一掃描才變嗎

在本例中不用。賦值執行後,後續指令就讀到新值。你看到一輪延遲,應查讀取發生在寫入之前,或兩段程式不在同一個執行時序。

把掃描時間縮短就一定抓得到短脈衝嗎

不一定。還要看輸入模組響應、濾波、最差更新間隔與脈衝相位。先取得最小有效脈寬,再選支援的擷取功能;不要只用平均掃描時間做保證。

模擬表格對了就能接上實機嗎

還不能只憑這個結果。先確認完整專案的寫入點、啟動狀態與 I/O 更新設定,再驗證實體模組。此案例的目的,是讓你證明程式順序的影響,並不包含設備安全互鎖或輸出電氣測試。

參考:Mitsubishi QnUCPU User’s Manual SH-080807ENG-AF 第 2.4 與 2.8 節

延伸閱讀


使用 PLC 工具箱 →