← 所有文章

兩個流程共用一個資源 PLC 排他控制與公平排程

· 站長

用單一仲裁器分配共用模組,處理等待、釋放、取消及逾時鎖定。

先定義資源的唯一主人

兩個虛擬工站 A、B 共用一個檢測模組時,不能只把兩個允許線圈 OR 在一起;同一掃描可能同時得到允許,下一掃描也不知道誰該釋放。先建立 owner:NONE、A、B;request_a/request_b;busy;grant;release;timeout。資源規則是 owner 不是 NONE 時,另一站永遠不能進入使用段,且只有 owner 能釋放。

欄位 意義 改變者
owner 目前唯一使用者 仲裁器
request 等待使用的請求 工站
grant 本掃描核准脈衝 仲裁器
release 工作完成通知 owner 工站
timeout 逾時事件 監視器
  1. 先畫 NONE→A/B、A/B→NONE 的合法轉移。

  2. 規定同時請求時採先到先服務;同一掃描同時到達則固定 A 優先。

  3. 規定 owner 逾時後進入 FAULT_LOCK,人工確認或明確復歸才回 NONE。

選排程規則並消除掃描偏差

固定優先容易讓 B 飢餓;單純每掃描先檢查 A,也會讓掃描順序變成隱藏優先。這篇採簡化先到先服務:記錄 request_seq,請求成立時取得遞增序號;同掃描到達依A先B後分配序號,這是明訂的決勝規則。資源釋放後才選下一位,不能在 owner 尚未清除的同一邏輯段又授予另一站。

事件 A 序號 B 序號 owner 說明
S1 同時請求 1 2 A 先到先服務
S2 A 工作中 1 2 A B 等待
S3 A 釋放 1 2 NONE 只完成釋放
S4 仲裁 2 B 下一掃描授予 B
S5 B 完成 2 NONE 兩站皆有機會,且等待中的請求不會因掃描順序被永久跳過

若兩個 request 在同一掃描被置位,A 得 seq=1、B 得 seq=2 是規格中的固定結果;若需要真正同時性,應由上游事件時間戳提供排序,不要宣稱 PLC 掃描能觀察到物理上的同一瞬間。 另外,取消請求必須在仲裁前生效;已取得 owner 後的取消則走釋放或故障流程,不能直接刪除 owner。這個差異要在測試表中各做一次。

逾時 故障與資源回收

owner A 取得模組後,啟動本工作專屬的逾時計時。完成回饋來自 A 才能 release;若逾時,先撤銷 A 的使用允許,記錄 fault_owner=A 與 fault_code=TIMEOUT,再鎖住資源。不能直接把 owner 改 NONE 讓 B 立刻進入,因為模組可能仍處於未知狀態。維修或復歸條件完成後,才清除鎖定並依等待序號重新仲裁。

教學偽碼,非指定PLC語法:
NextOwner:=owner;Grant:=NONE
若fault_lock:保留owner,等待明確復歸流程
否則若owner≠NONE:
  若目前owner逾時:fault_lock:=TRUE;保存fault_owner
  否則若目前owner的release與工作序號有效:NextOwner:=NONE
否則(原owner為NONE):
  NextOwner:=選擇最早有效等待請求;Grant:=NextOwner
owner:=NextOwner
enable_a:=(owner=A) AND NOT fault_lock AND PermitA
enable_b:=(owner=B) AND NOT fault_lock AND PermitB
同次釋放不再仲裁;復歸需另確認模組可用才清鎖。
異常 狀態 操作員先做什麼
A 無完成回饋 FAULT_LOCK、owner=A 確認模組安全狀態與 A 的故障原因
B 取消請求 保留 A 或 NONE 刪除 B 的等待序號
PLC 重新啟動 依保持規格恢復或鎖定 確認模組實際狀態再復歸
兩站都要求釋放 只接受 owner 的 release 追查訊號交叉接用

公平不是讓兩站同時動,而是讓等待規則可預測。你可先算出最壞等待:若 A 每次最多使用 3 掃描、B 每次最多 2 掃描,採先到先服務時,等待上界需包含目前owner剩餘時間、前面請求使用時間、每次釋放後一掃描仲裁間隔與排程延遲;故障鎖定期間不能保證有限等待;超過上限就進入警告,不可默默覆蓋。仲裁器要在一個明確位置產生 owner,工站只提出 request 並回報 done,避免 A 子程式和 B 子程式互相寫 owner。若共用模組還需要初始化,初始化也算資源使用期間,必須由 owner 執行完後才 release。

測試流程與驗收

仲裁採NextOwner單次決策:目前owner逾時優先於完成,fault_lock當次成立,最後產生輸出時立即遮罩;不會先放行另一站才鎖定。取消未獲授權請求可刪等待序號,取消已獲授權工作須完成受控停止與釋放。

為了驗證不會雙重使用,你可以把共用模組想成一扇只有一把鑰匙的門。每一掃描先處理釋放,再處理仲裁,最後依新的 owner 產生允許;同一掃描不直接重用剛釋放的鑰匙,下一掃描才授予下一站,時序最容易讀懂。request 要附上有效序號,取消後序號失效;重送同一請求不可取得第二把鑰匙。模組回報完成時,先核對 owner 和工作序號,兩者任一不符就記錄孤立回饋。逾時鎖定時保存當下輸入、輸出、經過時間與故障碼,復歸後先核對等待請求是否仍有效,失效才清除並要求重新請求。若有安全門、急停或外部控制器介入,這些訊號只能使 owner 進入受控停止,不能繞過資源狀態直接放行另一站。最後以連續壓力測試確認每一站都有服務紀錄,並檢查最長等待不超過規格。

仲裁結果要能在監看表重現:同一組輸入與序號,經過同一規則必須得到同一 owner。

  1. 只送 A 請求,確認 A 得到 grant 且 B 永不 enable。

  2. 在 A 使用中送 B 請求,確認 B 排隊;A 釋放後下一掃描才輪到 B。

  3. 同時送兩請求,依 seq 表核對結果;連續做十輪檢查沒有永久餓死。

  4. 切斷 A 的完成回饋,確認逾時鎖定,不讓 B 偷接資源。

測試流程與驗收 續

請用兩站交錯的事件驗證公平性:第一輪 A 先請求,第二輪 B 先請求,第三輪兩站同時請求。每輪都要記錄 request_seq、grant_scan、release_scan,並計算等待掃描數。以 A 工作 3 掃描、B 工作 2 掃描為例,A 在 S1 取得、S4 釋放,B 最早 S5 取得;若B也在S1提出請求,至S5授權的掃描索引差為4。下一輪 B 先請求時,A 不得因程式排列在前就插隊。若固定優先造成 B 等待超過上限,應產生 STARVATION_WARN,讓工程師選擇輪轉或調整優先規則。
還要定義取消與復歸的邊界。仲裁前取消 request_b,B 的序號作廢,不應留下空洞而阻塞後面請求;仲裁後 B 已是 owner,取消只能轉成受控停止,等模組回到安全狀態才 release。若 owner A 的完成訊號和逾時訊號同一掃描出現,故障優先,結果標成 TIMEOUT_RACE 並鎖定,不能自行判定成功。重新啟動後若 owner 被保持為 A,程式應先要求模組狀態確認;若不能確認,直接進故障鎖比猜測可用更安全。

驗收時把每一掃描的 owner、兩個 request、兩個 enable、grant、release 與 fault_lock 一起記錄。只看工站畫面上的忙碌圖示不夠,因為畫面更新可能晚於 PLC 掃描;以監看表的順序才可判斷是否短暫雙重放行。

完成後應看到什麼結果

任一時刻 owner 只有一個;使用中只有 owner 的允許有效;釋放後下一位依規則取得;逾時會留下可追蹤的故障鎖,不會靜默放行。

失敗時先查哪裡

先查 owner 是否由多處寫入,再查 grant 與 enable 是否脫離 owner,接著查 release 是否被非 owner 觸發,最後核對逾時計時與復歸條件。

適用型號與限制

可作為 Q06UDVCPU 控制共用設備的應用框架;Q 系列並不因此自動提供跨程式的資源鎖,需由工程師實作並依任務、中斷及通訊延遲驗證。

常見問題與來源

FAQ

問:固定 A 優先可以嗎?答:可以,但要接受 B 可能長期等待,或加最大等待時間。
問:逾時後能否自動交給 B?答:只有模組安全復歸被確認後才可,否則會重疊使用。
問:輪流排程一定更公平嗎?答:它改善順序偏差,但仍要定義取消、故障與連續請求。

參考:三菱 QnUCPU 使用手冊 程式執行與裝置資料

延伸閱讀


使用 PLC 工具箱 →