先分清衝突 互斥與執行順序
輸送段同時收到前進與後退請求時,最先要決定的是規格:本例採兩個請求同時成立就保持停止,並回報命令衝突。命令衝突是輸入的問題;狀態互斥是流程規則;程式執行順序則是程式如何得到結果。把三件事混在一起,常會變成前進段先寫 ON、後退段再寫 OFF,最後只剩一個看似偶然的結果。
| 概念 | 本例定義 | 要觀察的資料 |
|---|---|---|
| ForwardReq | 要求向前 | 來源命令 |
| ReverseReq | 要求向後 | 來源命令 |
| Conflict | 兩者同時為 1 | 診斷旗標 |
| EffectiveCmd | 唯一有效命令 | 決策結果 |
| 輸出 | 由決策層集中寫入 | ForwardOut/ReverseOut |
本篇所有輸送段都是虛擬案例,不接馬達,不把一般邏輯當成安全互鎖。實體設備仍須依機械、驅動器和安全規格設計。
先寫命令優先矩陣
| 前進 | 後退 | 預期結果 | 衝突 |
|---|---|---|---|
| 0 | 0 | 停止 | 0 |
| 1 | 0 | 前進 | 0 |
| 0 | 1 | 後退 | 0 |
| 1 | 1 | 停止並報衝突 | 1 |
列出每個命令的來源、有效電平和取消條件。
決定同時成立時拒絕、固定優先或保持原狀;本例選拒絕並停止。
把命令衝突做成獨立旗標,讓 HMI 和診斷能看到原因。
只在一個決策層產生 ForwardOut、ReverseOut。
對矩陣每一列逐一測試,不用程式排列順序代替規格。
通用偽碼(需依目標 PLC 語法調整):Conflict := ForwardReq AND ReverseReq; ForwardOut := ForwardReq AND NOT ReverseReq; ReverseOut := ReverseReq AND NOT ForwardReq; IF Conflict THEN ForwardOut:=FALSE; ReverseOut:=FALSE; END_IF。實作時要確認目標 PLC 的布林語法、輸出更新和互鎖需求。
虛擬輸送段逐步案例
假設前進在掃描 2~4 成立,後退在掃描 4~5 成立。掃描 4 同時成立,依矩陣停止並設 Conflict;掃描 5 只剩後退,才允許後退。這個結果是依案例規格手算,不是模擬或實機結果。
| 掃描 | ForwardReq | ReverseReq | Conflict | ForwardOut | ReverseOut |
|---|---|---|---|---|---|
| 1 | 0 | 0 | 0 | 0 | 0 |
| 2 | 1 | 0 | 0 | 1 | 0 |
| 3 | 1 | 0 | 0 | 1 | 0 |
| 4 | 1 | 1 | 1 | 0 | 0 |
| 5 | 0 | 1 | 0 | 0 | 1 |
| 6 | 0 | 0 | 0 | 0 | 0 |
若掃描 4 仍前進,先查是否有其他程式段覆寫了決策結果;若掃描 5 仍停止,查 Conflict 是否被鎖存而沒有復歸,或命令輸入是否仍同時成立。
單一決策點與失敗排查
| 現象 | 先取得的證據 | 先查哪裡 |
|---|---|---|
| 同時命令仍前進 | 兩個請求、Conflict、輸出逐掃描值 | 決策層是否真的使用互斥條件 |
| 輸出忽開忽關 | 程式段與執行順序 | 是否多處寫同一輸出 |
| 衝突一直存在 | 輸入來源與復歸記錄 | 按鈕、HMI 或通訊命令是否未清 |
| 一側永遠無法動 | 矩陣與有效電平 | 位元極性或模式條件 |
完成後應看到:零命令時兩輸出皆 OFF;單一命令成立時只有對應輸出 ON;兩命令同時成立時兩輸出皆 OFF 且 Conflict=1。失敗時依序查命令來源、矩陣、決策層唯一寫入點,再查輸出模組。不要先交換程式段位置。
適用型號與限制:本文適用具有布林運算和輸出控制的 PLC 概念,包括 Q06UDVCPU、FX、S7 等;實際輸出刷新、互斥指令、任務順序和安全互鎖必須依目標平台及設備規格確認。
操作紀錄與復原演練
進一步操作時,先將所有命令強制設為零,確認兩個輸出關閉,再逐一打開前進、後退與停止。對同時命令要觀察 Conflict 是否只表示衝突,不要把它當成停止命令本身。若衝突解除後要求人工復歸,測試 Ack 之前輸出應維持關閉;若規格允許自動恢復,也要記錄恢復的條件和掃描。把每次結果與程式版本保存,修改矩陣後重新跑四種基本組合和所有新增組合。這樣能確認正常、異常和邊界都由同一決策層處理。
教學驗收時還要檢查輸出命令的唯一性。搜尋同一輸出位址、符號、別名、SET、RESET、MOV 與功能塊輸出,確認最後只有決策層寫入。若停止或警報具有最高優先,將其放在決策公式中而不是只放在程式最後一段。若方向切換需要停頓,另加狀態和定時條件,不能把前進與後退同時接通當成換向。驗收表中每個「若不同先查」都要能找到一筆證據,完成後才把案例標為通過。
把命令衝突當成可重現的測試,不要只在輸出燈上判斷。先建立測試表,記錄掃描序號、前進請求、後退請求、停止條件、Conflict、有效命令與兩個輸出。正常案例是只有前進時只開前進,只有後退時只開後退;邊界案例是兩個請求在同一掃描同時成立,預期兩個輸出都關閉並留下衝突原因。若兩個請求在相鄰掃描交替,依設備規格決定是否允許換向,不能讓排列順序偷偷決定。測試完成後先解除輸出命令,再清除測試旗標。
| 測試狀況 | 正常結果 | 異常時先查 |
|---|---|---|
| 前進單獨成立 | ForwardOut=1、ReverseOut=0 | 有效電平與決策條件 |
| 後退單獨成立 | ForwardOut=0、ReverseOut=1 | 命令來源與輸出寫入點 |
| 同時成立 | 兩輸出=0、Conflict=1 | 是否有互斥條件 |
| 衝突解除 | 依規格恢復或等待 Ack | Conflict 復歸策略 |
復原時先保存原始記錄,確認輸入、狀態、診斷旗標和輸出,再依規格清除或重試。這些是教學案例,不是 PLC 模擬或實機結果。
從原始請求追到唯一有效命令
把這個例子想成三層資料。第一層保存前進與後退的原始請求,第二層依矩陣決定停止、前進或後退,第三層才產生兩個互斥輸出。不要為了讓衝突消失而直接把其中一個原始請求清掉,因為你會失去診斷證據。操作畫面應能看到哪兩個來源同時提出要求。
例如現場按鈕要求前進,而遠端畫面仍保持後退。兩個來源單獨測試都正常,合在一起才停止。正確處理是查明遠端命令是否有解除或逾時規則,而不是把前進程式搬到最後一行強行覆蓋後退。程式順序改變後看似恢復,卻把原本明確的衝突變成難以預測的動作。
本篇基本矩陣採電平判斷,衝突一解除,剩下的單一命令就生效。因此掃描四停止、掃描五後退是刻意定義的結果。若你的設備要求衝突後必須放開兩鍵,再重新按下才可動作,就要增加待重新操作狀態;不能宣稱只靠本文三個布林公式已經具備這種行為。
練習時再加入停止請求,規定停止優先於任何方向。測試前進加停止、後退加停止、雙方向加停止三種組合,預期兩輸出都為零;衝突旗標仍可保留原始雙方向狀態。這樣診斷能同時說明停止被按下,以及方向來源存在衝突,不會把兩個原因混成一個模糊的未允許。
最後對照硬體限制。互斥只保證邏輯上不會同時提出兩方向,不能保證接觸器沒有黏住,也不能證明馬達已停穩。需要換向等待或回饋確認的設備,應另有狀態流程和適當硬體措施。本文虛擬矩陣的驗收範圍到命令決策為止,將這個界線寫清楚,才能正確移用。
常見問題與附錄
| 問題 | 回答 |
|---|---|
| 同時命令可以固定前進優先嗎? | 可以,但必須寫進矩陣並評估設備風險;本例採停止。 |
| 互斥條件能取代安全回路嗎? | 不能,一般 PLC 邏輯不是安全功能。 |
| 為什麼要保留 Conflict? | 輸出停止只告訴你結果,Conflict 才告訴你命令衝突原因。 |
| 多個程式段各寫一個輸出可以嗎? | 容易覆寫;建議集中決策與唯一實體寫入。 |
附錄驗收:保存命令矩陣、逐掃描表、輸出寫入交叉參照、衝突復歸條件和未驗證項目。若設備要在衝突後人工確認才恢復,另設 Ack 或 Reset 規則,不要讓輸入一消失就自動動作。
本篇依通用布林控制概念撰寫;未引用特定廠牌指令。案例和偽碼均為教學推導。