PLC 審查問題對應階梯圖
單車道雙向通行控制 —— 15 項問題的修正梯形圖與完整重構程式



對應文件: 《PLC 梯形圖程式設計審查報告》(2026-07-05)
內容範圍: 問題 1–11 與建議 12–15 之修正階梯圖
附錄: 修正後完整程式 Rung 1–23
文件日期: 2026 年 7 月 6 日

圖中符號採 IEC 慣用之 NO/NC 接點、線圈與功能方塊表示法;
變數名稱沿用原程式,狀態常數與 I/O 對照見第 1 節。

狀態常數與變數

值 狀態常數 變數 意義
0 INIT INPUT1 / INPUT2 A 端/B 端光電感測器
1 IDLE PB_RESET 故障復歸按鈕
2 FWD OUTPUT_1 / OUTPUT_2 車道占用燈/故障燈
3 HOLD STATE 狀態暫存器(INT)
4 REV M_INPUT1_Rise 等 邊緣旗標(單一掃描週期)
5 FAULT FaultLatch / SensorStuck 故障閂鎖/感測器卡住
6 REV_HOLD(新增) TON_1/2A/2B/3 10 s 駐留/5 min 卡住/60 s 逾時

梯形圖符號圖例

at (0.9,0) cno=VAR; at (2.4,0) NO 常開接點:變數為 1 時導通; at (0.9,-1.0) cnc=VAR; at (2.4,-1.0) NC 常閉接點:變數為 0 時導通; at (0.9,-2.0) cpe=VAR; at (2.4,-2.0) 上升緣接點(OSR/R_TRIG):0\(\to\)1 的那個掃描週期導通一次; at (0.9,-3.0) coil=VAR; at (2.4,-3.0) 輸出線圈:rung 導通時 ON,斷開時 OFF; at (0.9,-4.0) scoil=VAR; at (2.4,-4.0) 設定線圈(Latch):導通後保持 ON,需 U 復歸; at (0.9,-5.0) ucoil=VAR; at (2.4,-5.0) 復歸線圈(Unlatch):導通時將閂鎖變數復歸為 OFF; (0.9-1.05,-6.3-0.4) rectangle (0.9+1.05,-6.3+0.4); at (0.9,-6.3+0.21) EQU; at (0.9,-6.3-0.15) STATE=FWD; (0.9-1.23,-6.3) – (0.9-1.05,-6.3); (0.9+1.05,-6.3) – (0.9+1.23,-6.3);

at (2.4,-6.3) 比較方塊:條件成立(相等)時導通,作為接點使用; (0.9-1.15,-7.7-0.45) rectangle (0.9+1.15,-7.7+0.45); at (0.9,-7.7+0.24) MOV; at (0.9,-7.7-0.15) IDLE \(\to\) STATE; (0.9-1.33,-7.7) – (0.9-1.15,-7.7); (0.9+1.15,-7.7) – (0.9+1.33,-7.7);

at (2.4,-7.7) 傳送方塊:rung 導通時將來源值寫入目的暫存器; (0.9-1.05,-9.3-0.62) rectangle (0.9+1.05,-9.3+0.62); at (0.9,-9.3+0.4) TON_3; at (0.9-0.82,-9.3+0.16) IN; at (0.9+0.84,-9.3+0.16) Q; at (0.9,-9.3-0.36) PT: T#60s; (0.9-1.23,-9.3) – (0.9-1.05,-9.3); (0.9+1.05,-9.3) – (0.9+1.23,-9.3);

at (2.4,-9.3) 通電延遲計時器:IN 持續導通達 PT 後 Q = 1;IN 斷開立即復歸;

問題與 rung 對照

問題 摘要 完整程式對應 rung(第 5 節)
問題 1 INIT 無出口(上電死鎖) R3
問題 2 Reset 無條件回 IDLE R21
問題 3 REV 過早結束 R13、R16、R18
問題 4 計時器 Q 未限定狀態 R17、R18
問題 5 邊緣偵測標籤不一致 R1、R2(改用內建邊緣)
問題 6 逾時應進 FAULT R14、R15
問題 7 REV 不點占用燈 R22
問題 8 兩端同時來車死鎖 R9–R11
問題 9 卡住偵測共用計時器 R4–R6
問題 10 故障優先權與復歸耦合 R8、R21
問題 11 多車跟進(車輛計數) 選配(見 3.6 節)
建議 12–15 內建邊緣、集中化、命名、按鈕取緣 R1、R2、R21 及全篇

嚴重問題修正階梯圖(問題 1–5)

問題 1:INIT 狀態沒有出口 —— 上電死鎖

原程式沒有任何 rung 處理 STATE = INIT(上電預設值 0)。 修正:新增一條初始化 rung,等待兩支感測器皆淨空後才進入 IDLE; 若上電時感測器被遮斷,系統會停留在 INIT 直到車道淨空,不會誤動作。

 修正  新增 rung:INIT 且 A、B 皆淨空 \(\to\) IDLE

(0,0.85) – (0,-0.55); (13.6,0.85) – (13.6,-0.55); (0,0) – (0.27,0); (1.5-1.05,0-0.4) rectangle (1.5+1.05,0+0.4); at (1.5,0+0.21) EQU; at (1.5,0-0.15) STATE=INIT; (1.5-1.23,0) – (1.5-1.05,0); (1.5+1.05,0) – (1.5+1.23,0);

(2.73,0) – (3.32,0); at (3.7,0) cnc=INPUT1; (4.08,0) – (5.22,0); at (5.6,0) cnc=INPUT2; (5.98,0) – (10.77,0); (12.1-1.15,0-0.45) rectangle (12.1+1.15,0+0.45); at (12.1,0+0.24) MOV; at (12.1,0-0.15) IDLE \(\to\) STATE; (12.1-1.33,0) – (12.1-1.15,0); (12.1+1.15,0) – (12.1+1.33,0);

(13.43,0) – (13.6,0);

若平台提供首次掃描旗標(如 _SYSVA_FIRST_SCAN),亦可改以首次掃描觸發並在 感測器遮斷時直接閂鎖故障;上圖的「等待淨空」寫法較簡單且不需額外旗標。

問題 2:Rung 24 —— PB_RESET 無條件強制回 IDLE

 現況  原 Rung 24:按鈕電平直接寫入,任何狀態都會被覆寫

(0,0.85) – (0,-0.55); (13.6,0.85) – (13.6,-0.55); (0,0) – (0.92,0); at (1.3,0) cno=PB_RESET; (1.68,0) – (10.77,0); (12.1-1.15,0-0.45) rectangle (12.1+1.15,0+0.45); at (12.1,0+0.24) MOV; at (12.1,0-0.15) IDLE \(\to\) STATE; (12.1-1.33,0) – (12.1-1.15,0); (12.1+1.15,0) – (12.1+1.33,0);

(13.43,0) – (13.6,0);

 修正  加上三重限定:按鈕取上升緣、僅在 FAULT 狀態、且故障已成功解閂

(0,0.85) – (0,-0.55); (13.6,0.85) – (13.6,-0.55); (0,0) – (0.92,0); at (1.3,0) cpe=PB_RESET; (1.68,0) – (1.97,0); (3.2-1.05,0-0.4) rectangle (3.2+1.05,0+0.4); at (3.2,0+0.21) EQU; at (3.2,0-0.15) STATE=FAULT; (3.2-1.23,0) – (3.2-1.05,0); (3.2+1.05,0) – (3.2+1.23,0);

(4.43,0) – (5.02,0); at (5.4,0) cnc=FaultLatch; (5.78,0) – (10.77,0); (12.1-1.15,0-0.45) rectangle (12.1+1.15,0+0.45); at (12.1,0+0.24) MOV; at (12.1,0-0.15) IDLE \(\to\) STATE; (12.1-1.33,0) – (12.1-1.15,0); (12.1+1.15,0) – (12.1+1.33,0);

(13.43,0) – (13.6,0);

如此車輛通行中誤按復歸不再影響狀態機;故障未排除(FaultLatch 仍為 1)時 按住按鈕也不會造成 STATE 每週期震盪。

問題 3:Rung 16 —— REV 的離開條件錯誤

 現況  原 Rung 16:B 下降緣即回 IDLE,此時車輛仍在車道中間

(0,0.85) – (0,-0.55); (13.6,0.85) – (13.6,-0.55); (0,0) – (0.27,0); (1.5-1.05,0-0.4) rectangle (1.5+1.05,0+0.4); at (1.5,0+0.21) EQU; at (1.5,0-0.15) STATE=REV; (1.5-1.23,0) – (1.5-1.05,0); (1.5+1.05,0) – (1.5+1.23,0);

(2.73,0) – (3.32,0); at (3.7,0) cno=M_INPUT2_Fall; (4.08,0) – (10.77,0); (12.1-1.15,0-0.45) rectangle (12.1+1.15,0+0.45); at (12.1,0+0.24) MOV; at (12.1,0-0.15) IDLE \(\to\) STATE; (12.1-1.33,0) – (12.1-1.15,0); (12.1+1.15,0) – (12.1+1.33,0);

(13.43,0) – (13.6,0);

修正:REV 應在車輛抵達 A 感測器時才結束,並比照 FWD 增加 10 秒駐留緩衝狀態 REV_HOLD(新增常數,值 6)。

 修正  REV 且 A 上升緣 \(\to\) REV_HOLD

(0,0.85) – (0,-0.55); (13.6,0.85) – (13.6,-0.55); (0,0) – (0.27,0); (1.5-1.05,0-0.4) rectangle (1.5+1.05,0+0.4); at (1.5,0+0.21) EQU; at (1.5,0-0.15) STATE=REV; (1.5-1.23,0) – (1.5-1.05,0); (1.5+1.05,0) – (1.5+1.23,0);

(2.73,0) – (3.32,0); at (3.7,0) cno=M_INPUT1_Rise; (4.08,0) – (10.77,0); (12.1-1.15,0-0.45) rectangle (12.1+1.15,0+0.45); at (12.1,0+0.24) MOV; at (12.1,0-0.15) REV_HOLD \(\to\) STATE; (12.1-1.33,0) – (12.1-1.15,0); (12.1+1.15,0) – (12.1+1.33,0);

(13.43,0) – (13.6,0);

 修正  駐留計時:HOLD 與 REV_HOLD 共用 10 秒計時器 TON_1

(0,0.85) – (0,-1.7); (13.6,0.85) – (13.6,-1.7); (0,0) – (0.67,0); (1.9-1.05,0-0.4) rectangle (1.9+1.05,0+0.4); at (1.9,0+0.21) EQU; at (1.9,0-0.15) STATE=HOLD; (1.9-1.23,0) – (1.9-1.05,0); (1.9+1.05,0) – (1.9+1.23,0);

(3.13,0) – (10.67,0); (11.9-1.05,0-0.62) rectangle (11.9+1.05,0+0.62); at (11.9,0+0.4) TON_1; at (11.9-0.82,0+0.16) IN; at (11.9+0.84,0+0.16) Q; at (11.9,0-0.36) PT: T#10s; (11.9-1.23,0) – (11.9-1.05,0); (11.9+1.05,0) – (11.9+1.23,0);

(13.13,0) – (13.6,0); (0.45,0) – (0.45,-1.1); (0.45,-1.1) – (0.67,-1.1); (1.9-1.05,-1.1-0.4) rectangle (1.9+1.05,-1.1+0.4); at (1.9,-1.1+0.21) EQU; at (1.9,-1.1-0.15) STATE=REV_HOLD; (1.9-1.23,-1.1) – (1.9-1.05,-1.1); (1.9+1.05,-1.1) – (1.9+1.23,-1.1);

(3.13,-1.1) – (3.35,-1.1); (3.35,-1.1) – (3.35,0);

 修正  REV_HOLD 計時到 \(\to\) IDLE(狀態限定,見問題 4)

(0,0.85) – (0,-0.55); (13.6,0.85) – (13.6,-0.55); (0,0) – (0.27,0); (1.5-1.05,0-0.4) rectangle (1.5+1.05,0+0.4); at (1.5,0+0.21) EQU; at (1.5,0-0.15) STATE=REV_HOLD; (1.5-1.23,0) – (1.5-1.05,0); (1.5+1.05,0) – (1.5+1.23,0);

(2.73,0) – (3.32,0); at (3.7,0) cno=TON_1.Q; (4.08,0) – (10.77,0); (12.1-1.15,0-0.45) rectangle (12.1+1.15,0+0.45); at (12.1,0+0.24) MOV; at (12.1,0-0.15) IDLE \(\to\) STATE; (12.1-1.33,0) – (12.1-1.15,0); (12.1+1.15,0) – (12.1+1.33,0);

(13.43,0) – (13.6,0);

問題 4:計時器 Done 位元未限定狀態

 現況  原 Rung 12/14:TON.Q 一成立就無條件寫 IDLE,可能覆寫 FAULT 等狀態

(0,0.85) – (0,-0.55); (13.6,0.85) – (13.6,-0.55); (0,0) – (0.92,0); at (1.3,0) cno=TON_1.Q; (1.68,0) – (10.77,0); (12.1-1.15,0-0.45) rectangle (12.1+1.15,0+0.45); at (12.1,0+0.24) MOV; at (12.1,0-0.15) IDLE \(\to\) STATE; (12.1-1.33,0) – (12.1-1.15,0); (12.1+1.15,0) – (12.1+1.33,0);

(13.43,0) – (13.6,0);

 修正  每一條寫入 STATE 的 rung,第一個條件一律是「目前狀態」

(0,0.85) – (0,-0.55); (13.6,0.85) – (13.6,-0.55); (0,0) – (0.27,0); (1.5-1.05,0-0.4) rectangle (1.5+1.05,0+0.4); at (1.5,0+0.21) EQU; at (1.5,0-0.15) STATE=HOLD; (1.5-1.23,0) – (1.5-1.05,0); (1.5+1.05,0) – (1.5+1.23,0);

(2.73,0) – (3.32,0); at (3.7,0) cno=TON_1.Q; (4.08,0) – (10.77,0); (12.1-1.15,0-0.45) rectangle (12.1+1.15,0+0.45); at (12.1,0+0.24) MOV; at (12.1,0-0.15) IDLE \(\to\) STATE; (12.1-1.33,0) – (12.1-1.15,0); (12.1+1.15,0) – (12.1+1.33,0);

(13.43,0) – (13.6,0);

原 Rung 12(TON_3.Q 逾時)除了加狀態限定外,目的地也應由 IDLE 改為 FAULT,見問題 6 的階梯圖。

問題 5:邊緣偵測標籤不一致

 現況  原 Rung 1:接點讀 INPUT1_Last,但 Rung 3 線圈寫的是 M_INPUT1_Last —— 若為兩個變數,邊緣偵測全失效

(0,0.85) – (0,-0.55); (13.6,0.85) – (13.6,-0.55); (0,0) – (0.92,0); at (1.3,0) cno=INPUT1; (1.68,0) – (2.92,0); at (3.3,0) cnc=; at (3.3,0.24) INPUT1_Last; (3.68,0) – (12.52,0); at (12.9,0) coil=M_INPUT1_Rise; (13.28,0) – (13.6,0);

修正後三條 rung 全部使用同一個變數 M_INPUT1_Last, 且 _Last 的更新 rung 必須排在最後(INPUT2 比照辦理):

 修正  上升緣:本週期為 1、上週期為 0

(0,0.85) – (0,-0.55); (13.6,0.85) – (13.6,-0.55); (0,0) – (0.92,0); at (1.3,0) cno=INPUT1; (1.68,0) – (2.92,0); at (3.3,0) cnc=M_INPUT1_Last; (3.68,0) – (12.52,0); at (12.9,0) coil=M_INPUT1_Rise; (13.28,0) – (13.6,0);

 修正  下降緣:本週期為 0、上週期為 1

(0,0.85) – (0,-0.55); (13.6,0.85) – (13.6,-0.55); (0,0) – (0.92,0); at (1.3,0) cnc=INPUT1; (1.68,0) – (2.92,0); at (3.3,0) cno=M_INPUT1_Last; (3.68,0) – (12.52,0); at (12.9,0) coil=M_INPUT1_Fall; (13.28,0) – (13.6,0);

 修正  上週期值更新 —— 必須放在所有使用 _Last 的 rung 之後

(0,0.85) – (0,-0.55); (13.6,0.85) – (13.6,-0.55); (0,0) – (0.92,0); at (1.3,0) cno=INPUT1; (1.68,0) – (12.52,0); at (12.9,0) coil=M_INPUT1_Last; (13.28,0) – (13.6,0);

更好的做法是直接改用平台內建的上升緣接點(見建議 12 與第 5 節 R1、R2), 六條 rung 縮為兩條,並徹底消除此類命名錯誤。

重要問題修正階梯圖(問題 6–11)

問題 6:60 秒逾時應轉入 FAULT,而非回 IDLE

車輛拋錨卡在車道內超過 60 秒屬於異常;回 IDLE 會放行對向車輛。 修正:FWD 與 REV 共用通行逾時計時器,逾時即閂鎖故障並轉入 FAULT (占用燈由輸出 rung 在 FAULT 狀態下保持點亮,見問題 7)。

 修正  通行逾時計時:FWD 或 REV 期間累計 60 秒

(0,0.85) – (0,-1.7); (13.6,0.85) – (13.6,-1.7); (0,0) – (0.67,0); (1.9-1.05,0-0.4) rectangle (1.9+1.05,0+0.4); at (1.9,0+0.21) EQU; at (1.9,0-0.15) STATE=FWD; (1.9-1.23,0) – (1.9-1.05,0); (1.9+1.05,0) – (1.9+1.23,0);

(3.13,0) – (10.67,0); (11.9-1.05,0-0.62) rectangle (11.9+1.05,0+0.62); at (11.9,0+0.4) TON_3; at (11.9-0.82,0+0.16) IN; at (11.9+0.84,0+0.16) Q; at (11.9,0-0.36) PT: T#60s; (11.9-1.23,0) – (11.9-1.05,0); (11.9+1.05,0) – (11.9+1.23,0);

(13.13,0) – (13.6,0); (0.45,0) – (0.45,-1.1); (0.45,-1.1) – (0.67,-1.1); (1.9-1.05,-1.1-0.4) rectangle (1.9+1.05,-1.1+0.4); at (1.9,-1.1+0.21) EQU; at (1.9,-1.1-0.15) STATE=REV; (1.9-1.23,-1.1) – (1.9-1.05,-1.1); (1.9+1.05,-1.1) – (1.9+1.23,-1.1);

(3.13,-1.1) – (3.35,-1.1); (3.35,-1.1) – (3.35,0);

 修正  逾時 \(\to\) 進入 FAULT 並閂鎖,需人員確認車道淨空後復歸

(0,0.85) – (0,-1.7); (13.6,0.85) – (13.6,-1.7); (0,0) – (0.92,0); at (1.3,0) cno=TON_3.Q; (1.68,0) – (10.77,0); (12.1-1.15,0-0.45) rectangle (12.1+1.15,0+0.45); at (12.1,0+0.24) MOV; at (12.1,0-0.15) FAULT \(\to\) STATE; (12.1-1.33,0) – (12.1-1.15,0); (12.1+1.15,0) – (12.1+1.33,0);

(13.43,0) – (13.6,0); (10.5,0) – (10.5,-1.1); (10.5,-1.1) – (12.52,-1.1); at (12.9,-1.1) scoil=FaultLatch; (13.28,-1.1) – (13.6,-1.1);

問題 7:REV 狀態不驅動占用指示

原 Rung 17 只有 FWD/HOLD 點亮 OUTPUT_1。 修正:REV、REV_HOLD 也並聯進來;FAULT 期間同樣保持點亮 (車道狀況未知,必須封鎖)。

 修正  占用燈 = 狀態的純函數,五個狀態並聯

(0,0.85) – (0,-4.9); (13.6,0.85) – (13.6,-4.9); (0,0) – (0.67,0); (1.9-1.05,0-0.4) rectangle (1.9+1.05,0+0.4); at (1.9,0+0.21) EQU; at (1.9,0-0.15) STATE=FWD; (1.9-1.23,0) – (1.9-1.05,0); (1.9+1.05,0) – (1.9+1.23,0);

(3.13,0) – (12.52,0); at (12.9,0) coil=OUTPUT_1; (13.28,0) – (13.6,0); (0.45,0) – (0.45,-4.4); (0.45,-1.1) – (0.67,-1.1); (1.9-1.05,-1.1-0.4) rectangle (1.9+1.05,-1.1+0.4); at (1.9,-1.1+0.21) EQU; at (1.9,-1.1-0.15) STATE=HOLD; (1.9-1.23,-1.1) – (1.9-1.05,-1.1); (1.9+1.05,-1.1) – (1.9+1.23,-1.1);

(3.13,-1.1) – (3.35,-1.1); (0.45,-2.2) – (0.67,-2.2); (1.9-1.05,-2.2-0.4) rectangle (1.9+1.05,-2.2+0.4); at (1.9,-2.2+0.21) EQU; at (1.9,-2.2-0.15) STATE=REV; (1.9-1.23,-2.2) – (1.9-1.05,-2.2); (1.9+1.05,-2.2) – (1.9+1.23,-2.2);

(3.13,-2.2) – (3.35,-2.2); (0.45,-3.3) – (0.67,-3.3); (1.9-1.05,-3.3-0.4) rectangle (1.9+1.05,-3.3+0.4); at (1.9,-3.3+0.21) EQU; at (1.9,-3.3-0.15) STATE=REV_HOLD; (1.9-1.23,-3.3) – (1.9-1.05,-3.3); (1.9+1.05,-3.3) – (1.9+1.23,-3.3);

(3.13,-3.3) – (3.35,-3.3); (0.45,-4.4) – (0.67,-4.4); (1.9-1.05,-4.4-0.4) rectangle (1.9+1.05,-4.4+0.4); at (1.9,-4.4+0.21) EQU; at (1.9,-4.4-0.15) STATE=FAULT; (1.9-1.23,-4.4) – (1.9-1.05,-4.4); (1.9+1.05,-4.4) – (1.9+1.23,-4.4);

(3.13,-4.4) – (3.35,-4.4); (3.35,-4.4) – (3.35,0);

問題 8:兩端同時來車 \(\to\) 雙方永久等待

原程式以「上升緣 + 對側淨空」觸發,兩端幾乎同時遮斷時兩條 rung 都不成立, 且邊緣旗標一個週期後消失,永遠卡死。修正:進入條件改用電平 (車輛持續遮斷感測器即成立),並新增「兩側同時佔用」的固定優先權裁決 rung。

 修正  IDLE \(\to\) FWD:A 遮斷(電平)且 B 淨空

(0,0.85) – (0,-0.55); (13.6,0.85) – (13.6,-0.55); (0,0) – (0.27,0); (1.5-1.05,0-0.4) rectangle (1.5+1.05,0+0.4); at (1.5,0+0.21) EQU; at (1.5,0-0.15) STATE=IDLE; (1.5-1.23,0) – (1.5-1.05,0); (1.5+1.05,0) – (1.5+1.23,0);

(2.73,0) – (3.32,0); at (3.7,0) cno=INPUT1; (4.08,0) – (5.22,0); at (5.6,0) cnc=INPUT2; (5.98,0) – (10.77,0); (12.1-1.15,0-0.45) rectangle (12.1+1.15,0+0.45); at (12.1,0+0.24) MOV; at (12.1,0-0.15) FWD \(\to\) STATE; (12.1-1.33,0) – (12.1-1.15,0); (12.1+1.15,0) – (12.1+1.33,0);

(13.43,0) – (13.6,0);

 修正  IDLE \(\to\) REV:B 遮斷(電平)且 A 淨空

(0,0.85) – (0,-0.55); (13.6,0.85) – (13.6,-0.55); (0,0) – (0.27,0); (1.5-1.05,0-0.4) rectangle (1.5+1.05,0+0.4); at (1.5,0+0.21) EQU; at (1.5,0-0.15) STATE=IDLE; (1.5-1.23,0) – (1.5-1.05,0); (1.5+1.05,0) – (1.5+1.23,0);

(2.73,0) – (3.32,0); at (3.7,0) cno=INPUT2; (4.08,0) – (5.22,0); at (5.6,0) cnc=INPUT1; (5.98,0) – (10.77,0); (12.1-1.15,0-0.45) rectangle (12.1+1.15,0+0.45); at (12.1,0+0.24) MOV; at (12.1,0-0.15) REV \(\to\) STATE; (12.1-1.33,0) – (12.1-1.15,0); (12.1+1.15,0) – (12.1+1.33,0);

(13.43,0) – (13.6,0);

 修正  同時佔用的仲裁:固定 A 側優先(依現場規則亦可改為進入 FAULT 或輪流優先)

(0,0.85) – (0,-0.55); (13.6,0.85) – (13.6,-0.55); (0,0) – (0.27,0); (1.5-1.05,0-0.4) rectangle (1.5+1.05,0+0.4); at (1.5,0+0.21) EQU; at (1.5,0-0.15) STATE=IDLE; (1.5-1.23,0) – (1.5-1.05,0); (1.5+1.05,0) – (1.5+1.23,0);

(2.73,0) – (3.32,0); at (3.7,0) cno=INPUT1; (4.08,0) – (5.22,0); at (5.6,0) cno=INPUT2; (5.98,0) – (10.77,0); (12.1-1.15,0-0.45) rectangle (12.1+1.15,0+0.45); at (12.1,0+0.24) MOV; at (12.1,0-0.15) FWD \(\to\) STATE; (12.1-1.33,0) – (12.1-1.15,0); (12.1+1.15,0) – (12.1+1.33,0);

(13.43,0) – (13.6,0);

注意 rung 排列順序:兩條單側 rung 在前、仲裁 rung 在後;三條的條件互斥, 同一週期至多一條成立。

問題 9:兩支感測器共用一顆卡住偵測計時器

 現況  原 Rung 19:INPUT1 OR INPUT2 餵同一顆 TON,計時跨感測器連續累積而誤報

(0,0.85) – (0,-1.7); (13.6,0.85) – (13.6,-1.7); (0,0) – (0.92,0); at (1.3,0) cno=INPUT1; (1.68,0) – (10.67,0); (11.9-1.05,0-0.62) rectangle (11.9+1.05,0+0.62); at (11.9,0+0.4) TON_2; at (11.9-0.82,0+0.16) IN; at (11.9+0.84,0+0.16) Q; at (11.9,0-0.36) PT: T#5m; (11.9-1.23,0) – (11.9-1.05,0); (11.9+1.05,0) – (11.9+1.23,0);

(13.13,0) – (13.6,0); (0.45,0) – (0.45,-1.0); (0.45,-1.0) – (0.92,-1.0); at (1.3,-1.0) cno=INPUT2; (1.68,-1.0) – (2.15,-1.0); (2.15,-1.0) – (2.15,0);

修正:每支感測器各用一顆計時器,且僅在與狀態矛盾時計時 (IDLE 卻長時間遮斷才可疑;通行中的合法遮斷不計)。

 修正  A 端獨立卡住偵測

(0,0.85) – (0,-0.8); (13.6,0.85) – (13.6,-0.8); (0,0) – (0.27,0); (1.5-1.05,0-0.4) rectangle (1.5+1.05,0+0.4); at (1.5,0+0.21) EQU; at (1.5,0-0.15) STATE=IDLE; (1.5-1.23,0) – (1.5-1.05,0); (1.5+1.05,0) – (1.5+1.23,0);

(2.73,0) – (3.32,0); at (3.7,0) cno=INPUT1; (4.08,0) – (10.67,0); (11.9-1.05,0-0.62) rectangle (11.9+1.05,0+0.62); at (11.9,0+0.4) TON_2A; at (11.9-0.82,0+0.16) IN; at (11.9+0.84,0+0.16) Q; at (11.9,0-0.36) PT: T#5m; (11.9-1.23,0) – (11.9-1.05,0); (11.9+1.05,0) – (11.9+1.23,0);

(13.13,0) – (13.6,0);

 修正  B 端獨立卡住偵測

(0,0.85) – (0,-0.8); (13.6,0.85) – (13.6,-0.8); (0,0) – (0.27,0); (1.5-1.05,0-0.4) rectangle (1.5+1.05,0+0.4); at (1.5,0+0.21) EQU; at (1.5,0-0.15) STATE=IDLE; (1.5-1.23,0) – (1.5-1.05,0); (1.5+1.05,0) – (1.5+1.23,0);

(2.73,0) – (3.32,0); at (3.7,0) cno=INPUT2; (4.08,0) – (10.67,0); (11.9-1.05,0-0.62) rectangle (11.9+1.05,0+0.62); at (11.9,0+0.4) TON_2B; at (11.9-0.82,0+0.16) IN; at (11.9+0.84,0+0.16) Q; at (11.9,0-0.36) PT: T#5m; (11.9-1.23,0) – (11.9-1.05,0); (11.9+1.05,0) – (11.9+1.23,0);

(13.13,0) – (13.6,0);

 修正  任一計時到即判定感測器卡住

(0,0.85) – (0,-1.7); (13.6,0.85) – (13.6,-1.7); (0,0) – (0.92,0); at (1.3,0) cno=TON_2A.Q; (1.68,0) – (12.52,0); at (12.9,0) coil=SensorStuck; (13.28,0) – (13.6,0); (0.45,0) – (0.45,-1.0); (0.45,-1.0) – (0.92,-1.0); at (1.3,-1.0) cno=TON_2B.Q; (1.68,-1.0) – (2.15,-1.0); (2.15,-1.0) – (2.15,0);

問題 10:故障優先權與復歸順序耦合

修正有兩點:(1) 「FaultLatch \(\to\) FAULT」rung 移到狀態機之前, 故障成立的同一週期即接管狀態;(2) 解閂與回 IDLE 合併為單一 rung, 不再依賴三條 rung 的掃描順序。

 修正  故障接管 —— 置於所有狀態轉移 rung 之前

(0,0.85) – (0,-0.55); (13.6,0.85) – (13.6,-0.55); (0,0) – (0.92,0); at (1.3,0) cno=FaultLatch; (1.68,0) – (10.77,0); (12.1-1.15,0-0.45) rectangle (12.1+1.15,0+0.45); at (12.1,0+0.24) MOV; at (12.1,0-0.15) FAULT \(\to\) STATE; (12.1-1.33,0) – (12.1-1.15,0); (12.1+1.15,0) – (12.1+1.33,0);

(13.43,0) – (13.6,0);

 修正  復歸整合:解閂與回 IDLE 同一 rung 完成

(0,0.85) – (0,-1.7); (13.6,0.85) – (13.6,-1.7); (0,0) – (0.92,0); at (1.3,0) cpe=PB_RESET; (1.68,0) – (1.97,0); (3.2-1.05,0-0.4) rectangle (3.2+1.05,0+0.4); at (3.2,0+0.21) EQU; at (3.2,0-0.15) STATE=FAULT; (3.2-1.23,0) – (3.2-1.05,0); (3.2+1.05,0) – (3.2+1.23,0);

(4.43,0) – (5.02,0); at (5.4,0) cnc=SensorStuck; (5.78,0) – (12.52,0); at (12.9,0) ucoil=FaultLatch; (13.28,0) – (13.6,0); (10.5,0) – (10.5,-1.1); (10.5,-1.1) – (10.77,-1.1); (12.1-1.15,-1.1-0.45) rectangle (12.1+1.15,-1.1+0.45); at (12.1,-1.1+0.24) MOV; at (12.1,-1.1-0.15) IDLE \(\to\) STATE; (12.1-1.33,-1.1) – (12.1-1.15,-1.1); (12.1+1.15,-1.1) – (12.1+1.33,-1.1);

(13.43,-1.1) – (13.6,-1.1);

問題 11:多車跟進 —— 車輛計數(選配)

若場域允許多車同時在車道內,以「車道內車輛數」取代純計時判斷, 以下以 FWD 方向為例(REV 鏡像對稱):

 修正  A 端進入一台,計數 \(+1\)(邊緣觸發,避免每週期累加)

(0,0.85) – (0,-0.55); (13.6,0.85) – (13.6,-0.55); (0,0) – (0.27,0); (1.5-1.05,0-0.4) rectangle (1.5+1.05,0+0.4); at (1.5,0+0.21) EQU; at (1.5,0-0.15) STATE=FWD; (1.5-1.23,0) – (1.5-1.05,0); (1.5+1.05,0) – (1.5+1.23,0);

(2.73,0) – (3.32,0); at (3.7,0) cno=M_INPUT1_Rise; (4.08,0) – (10.77,0); (12.1-1.15,0-0.45) rectangle (12.1+1.15,0+0.45); at (12.1,0+0.24) ADD; at (12.1,0-0.15) VehCnt+1 \(\to\) VehCnt; (12.1-1.33,0) – (12.1-1.15,0); (12.1+1.15,0) – (12.1+1.33,0);

(13.43,0) – (13.6,0);

 修正  B 端離開一台,計數 \(-1\)

(0,0.85) – (0,-0.55); (13.6,0.85) – (13.6,-0.55); (0,0) – (0.27,0); (1.5-1.05,0-0.4) rectangle (1.5+1.05,0+0.4); at (1.5,0+0.21) EQU; at (1.5,0-0.15) STATE=FWD; (1.5-1.23,0) – (1.5-1.05,0); (1.5+1.05,0) – (1.5+1.23,0);

(2.73,0) – (3.32,0); at (3.7,0) cno=M_INPUT2_Rise; (4.08,0) – (10.77,0); (12.1-1.15,0-0.45) rectangle (12.1+1.15,0+0.45); at (12.1,0+0.24) SUB; at (12.1,0-0.15) VehCnt-1 \(\to\) VehCnt; (12.1-1.33,0) – (12.1-1.15,0); (12.1+1.15,0) – (12.1+1.33,0);

(13.43,0) – (13.6,0);

 修正  回 IDLE 的條件加上「車道內車輛數 = 0」

(0,0.85) – (0,-0.55); (13.6,0.85) – (13.6,-0.55); (0,0) – (0.27,0); (1.5-1.05,0-0.4) rectangle (1.5+1.05,0+0.4); at (1.5,0+0.21) EQU; at (1.5,0-0.15) STATE=HOLD; (1.5-1.23,0) – (1.5-1.05,0); (1.5+1.05,0) – (1.5+1.23,0);

(2.73,0) – (3.32,0); at (3.7,0) cno=TON_1.Q; (4.08,0) – (4.77,0); (6.0-1.05,0-0.4) rectangle (6.0+1.05,0+0.4); at (6.0,0+0.21) EQU; at (6.0,0-0.15) VehCnt=0; (6.0-1.23,0) – (6.0-1.05,0); (6.0+1.05,0) – (6.0+1.23,0);

(7.23,0) – (10.77,0); (12.1-1.15,0-0.45) rectangle (12.1+1.15,0+0.45); at (12.1,0+0.24) MOV; at (12.1,0-0.15) IDLE \(\to\) STATE; (12.1-1.33,0) – (12.1-1.15,0); (12.1+1.15,0) – (12.1+1.33,0);

(13.43,0) – (13.6,0);

車輛計數屬功能擴充,第 5 節的完整程式未納入;導入時另需處理 VehCnt 的下限保護與 FWD 期間後車跟進重啟逾時計時等細節。

可維護性建議階梯圖(建議 12–15)

建議 12:改用內建邊緣接點

手寫三段式邊緣偵測(6 條 rung、2 個中間變數)以內建上升緣接點(OSR/R_TRIG) 取代,每支感測器一條 rung 即可,並徹底避免問題 5 的命名斷裂:

 修正  一條 rung 取代原 Rung 1–3

(0,0.85) – (0,-0.55); (13.6,0.85) – (13.6,-0.55); (0,0) – (0.92,0); at (1.3,0) cpe=INPUT1; (1.68,0) – (12.52,0); at (12.9,0) coil=M_INPUT1_Rise; (13.28,0) – (13.6,0);

建議 13:狀態機集中化

梯形圖版本的落地原則(完整落實見第 5 節):

  • 每個 MOV \(\to\) STATE 一律先串 EQU(STATE, 現態);

  • 相同現態的多個轉移條件彼此互斥;

  • 故障接管 rung 放在所有轉移之前、輸出 rung 放在最後。

若平台支援,狀態轉移改用 ST 的 CASE 集中管理更佳(見審查報告第 3.2 節)。

建議 14:計時器與變數命名語義化

原名 建議名 原名 建議名
TON_1 tHoldDwell(10 s) OUTPUT_1 LaneOccupiedLamp
TON_2A/2B tStuckA/tStuckB(5 min) OUTPUT_2 FaultLamp
TON_3 tTransitTimeout(60 s) INPUT1/2 SensorA/SensorB

 修正  命名語義化後的同一條 rung,用途一目瞭然

(0,0.85) – (0,-0.8); (13.6,0.85) – (13.6,-0.8); (0,0) – (0.27,0); (1.5-1.05,0-0.4) rectangle (1.5+1.05,0+0.4); at (1.5,0+0.21) EQU; at (1.5,0-0.15) STATE=FWD; (1.5-1.23,0) – (1.5-1.05,0); (1.5+1.05,0) – (1.5+1.23,0);

(2.73,0) – (10.67,0); (11.9-1.05,0-0.62) rectangle (11.9+1.05,0+0.62); at (11.9,0+0.4) tTransitTimeout; at (11.9-0.82,0+0.16) IN; at (11.9+0.84,0+0.16) Q; at (11.9,0-0.36) PT: T#60s; (11.9-1.23,0) – (11.9-1.05,0); (11.9+1.05,0) – (11.9+1.23,0);

(13.13,0) – (13.6,0);

建議 15:手動按鈕一律取上升緣

已落實於問題 2/問題 10 的復歸 rung(PB_RESET 使用 P 接點): 按住不放只觸發一次,不會每個掃描週期重複執行 MOV。

修正後完整程式(Rung 1–23)

以下為整合所有修正後的完整梯形圖程式。結構依「輸入處理 \(\to\) 故障偵測 \(\to\) 狀態轉移 \(\to\) 計時 \(\to\) 復歸 \(\to\) 輸出」排列,STATE 的每個寫入點 都以現態為第一條件,輸出為狀態的純函數。

輸入處理與初始化(R1–R3)

 R1  INPUT1 上升緣(內建邊緣接點,取代原 Rung 1–3)

(0,0.85) – (0,-0.55); (13.6,0.85) – (13.6,-0.55); (0,0) – (0.92,0); at (1.3,0) cpe=INPUT1; (1.68,0) – (12.52,0); at (12.9,0) coil=M_INPUT1_Rise; (13.28,0) – (13.6,0);

 R2  INPUT2 上升緣(取代原 Rung 4–6)

(0,0.85) – (0,-0.55); (13.6,0.85) – (13.6,-0.55); (0,0) – (0.92,0); at (1.3,0) cpe=INPUT2; (1.68,0) – (12.52,0); at (12.9,0) coil=M_INPUT2_Rise; (13.28,0) – (13.6,0);

 R3  初始化:INIT 且車道淨空 \(\to\) IDLE(修正問題 1)

(0,0.85) – (0,-0.55); (13.6,0.85) – (13.6,-0.55); (0,0) – (0.27,0); (1.5-1.05,0-0.4) rectangle (1.5+1.05,0+0.4); at (1.5,0+0.21) EQU; at (1.5,0-0.15) STATE=INIT; (1.5-1.23,0) – (1.5-1.05,0); (1.5+1.05,0) – (1.5+1.23,0);

(2.73,0) – (3.32,0); at (3.7,0) cnc=INPUT1; (4.08,0) – (5.22,0); at (5.6,0) cnc=INPUT2; (5.98,0) – (10.77,0); (12.1-1.15,0-0.45) rectangle (12.1+1.15,0+0.45); at (12.1,0+0.24) MOV; at (12.1,0-0.15) IDLE \(\to\) STATE; (12.1-1.33,0) – (12.1-1.15,0); (12.1+1.15,0) – (12.1+1.33,0);

(13.43,0) – (13.6,0);

故障偵測與接管(R4–R8)

 R4  A 端卡住偵測:IDLE 卻持續遮斷 5 分鐘(修正問題 9)

(0,0.85) – (0,-0.8); (13.6,0.85) – (13.6,-0.8); (0,0) – (0.27,0); (1.5-1.05,0-0.4) rectangle (1.5+1.05,0+0.4); at (1.5,0+0.21) EQU; at (1.5,0-0.15) STATE=IDLE; (1.5-1.23,0) – (1.5-1.05,0); (1.5+1.05,0) – (1.5+1.23,0);

(2.73,0) – (3.32,0); at (3.7,0) cno=INPUT1; (4.08,0) – (10.67,0); (11.9-1.05,0-0.62) rectangle (11.9+1.05,0+0.62); at (11.9,0+0.4) TON_2A; at (11.9-0.82,0+0.16) IN; at (11.9+0.84,0+0.16) Q; at (11.9,0-0.36) PT: T#5m; (11.9-1.23,0) – (11.9-1.05,0); (11.9+1.05,0) – (11.9+1.23,0);

(13.13,0) – (13.6,0);

 R5  B 端卡住偵測

(0,0.85) – (0,-0.8); (13.6,0.85) – (13.6,-0.8); (0,0) – (0.27,0); (1.5-1.05,0-0.4) rectangle (1.5+1.05,0+0.4); at (1.5,0+0.21) EQU; at (1.5,0-0.15) STATE=IDLE; (1.5-1.23,0) – (1.5-1.05,0); (1.5+1.05,0) – (1.5+1.23,0);

(2.73,0) – (3.32,0); at (3.7,0) cno=INPUT2; (4.08,0) – (10.67,0); (11.9-1.05,0-0.62) rectangle (11.9+1.05,0+0.62); at (11.9,0+0.4) TON_2B; at (11.9-0.82,0+0.16) IN; at (11.9+0.84,0+0.16) Q; at (11.9,0-0.36) PT: T#5m; (11.9-1.23,0) – (11.9-1.05,0); (11.9+1.05,0) – (11.9+1.23,0);

(13.13,0) – (13.6,0);

 R6  任一計時到 \(\to\) SensorStuck

(0,0.85) – (0,-1.7); (13.6,0.85) – (13.6,-1.7); (0,0) – (0.92,0); at (1.3,0) cno=TON_2A.Q; (1.68,0) – (12.52,0); at (12.9,0) coil=SensorStuck; (13.28,0) – (13.6,0); (0.45,0) – (0.45,-1.0); (0.45,-1.0) – (0.92,-1.0); at (1.3,-1.0) cno=TON_2B.Q; (1.68,-1.0) – (2.15,-1.0); (2.15,-1.0) – (2.15,0);

 R7  卡住即閂鎖故障

(0,0.85) – (0,-0.55); (13.6,0.85) – (13.6,-0.55); (0,0) – (0.92,0); at (1.3,0) cno=SensorStuck; (1.68,0) – (12.52,0); at (12.9,0) scoil=FaultLatch; (13.28,0) – (13.6,0);

 R8  故障接管 —— 置於狀態機之前(修正問題 10)

(0,0.85) – (0,-0.55); (13.6,0.85) – (13.6,-0.55); (0,0) – (0.92,0); at (1.3,0) cno=FaultLatch; (1.68,0) – (10.77,0); (12.1-1.15,0-0.45) rectangle (12.1+1.15,0+0.45); at (12.1,0+0.24) MOV; at (12.1,0-0.15) FAULT \(\to\) STATE; (12.1-1.33,0) – (12.1-1.15,0); (12.1+1.15,0) – (12.1+1.33,0);

(13.43,0) – (13.6,0);

狀態轉移(R9–R13)

 R9  IDLE \(\to\) FWD:A 遮斷(電平)且 B 淨空(修正問題 8)

(0,0.85) – (0,-0.55); (13.6,0.85) – (13.6,-0.55); (0,0) – (0.27,0); (1.5-1.05,0-0.4) rectangle (1.5+1.05,0+0.4); at (1.5,0+0.21) EQU; at (1.5,0-0.15) STATE=IDLE; (1.5-1.23,0) – (1.5-1.05,0); (1.5+1.05,0) – (1.5+1.23,0);

(2.73,0) – (3.32,0); at (3.7,0) cno=INPUT1; (4.08,0) – (5.22,0); at (5.6,0) cnc=INPUT2; (5.98,0) – (10.77,0); (12.1-1.15,0-0.45) rectangle (12.1+1.15,0+0.45); at (12.1,0+0.24) MOV; at (12.1,0-0.15) FWD \(\to\) STATE; (12.1-1.33,0) – (12.1-1.15,0); (12.1+1.15,0) – (12.1+1.33,0);

(13.43,0) – (13.6,0);

 R10  IDLE \(\to\) REV:B 遮斷(電平)且 A 淨空

(0,0.85) – (0,-0.55); (13.6,0.85) – (13.6,-0.55); (0,0) – (0.27,0); (1.5-1.05,0-0.4) rectangle (1.5+1.05,0+0.4); at (1.5,0+0.21) EQU; at (1.5,0-0.15) STATE=IDLE; (1.5-1.23,0) – (1.5-1.05,0); (1.5+1.05,0) – (1.5+1.23,0);

(2.73,0) – (3.32,0); at (3.7,0) cno=INPUT2; (4.08,0) – (5.22,0); at (5.6,0) cnc=INPUT1; (5.98,0) – (10.77,0); (12.1-1.15,0-0.45) rectangle (12.1+1.15,0+0.45); at (12.1,0+0.24) MOV; at (12.1,0-0.15) REV \(\to\) STATE; (12.1-1.33,0) – (12.1-1.15,0); (12.1+1.15,0) – (12.1+1.33,0);

(13.43,0) – (13.6,0);

 R11  同時佔用仲裁:A 側優先(修正問題 8)

(0,0.85) – (0,-0.55); (13.6,0.85) – (13.6,-0.55); (0,0) – (0.27,0); (1.5-1.05,0-0.4) rectangle (1.5+1.05,0+0.4); at (1.5,0+0.21) EQU; at (1.5,0-0.15) STATE=IDLE; (1.5-1.23,0) – (1.5-1.05,0); (1.5+1.05,0) – (1.5+1.23,0);

(2.73,0) – (3.32,0); at (3.7,0) cno=INPUT1; (4.08,0) – (5.22,0); at (5.6,0) cno=INPUT2; (5.98,0) – (10.77,0); (12.1-1.15,0-0.45) rectangle (12.1+1.15,0+0.45); at (12.1,0+0.24) MOV; at (12.1,0-0.15) FWD \(\to\) STATE; (12.1-1.33,0) – (12.1-1.15,0); (12.1+1.15,0) – (12.1+1.33,0);

(13.43,0) – (13.6,0);

 R12  FWD \(\to\) HOLD:車輛通過 B

(0,0.85) – (0,-0.55); (13.6,0.85) – (13.6,-0.55); (0,0) – (0.27,0); (1.5-1.05,0-0.4) rectangle (1.5+1.05,0+0.4); at (1.5,0+0.21) EQU; at (1.5,0-0.15) STATE=FWD; (1.5-1.23,0) – (1.5-1.05,0); (1.5+1.05,0) – (1.5+1.23,0);

(2.73,0) – (3.32,0); at (3.7,0) cno=M_INPUT2_Rise; (4.08,0) – (10.77,0); (12.1-1.15,0-0.45) rectangle (12.1+1.15,0+0.45); at (12.1,0+0.24) MOV; at (12.1,0-0.15) HOLD \(\to\) STATE; (12.1-1.33,0) – (12.1-1.15,0); (12.1+1.15,0) – (12.1+1.33,0);

(13.43,0) – (13.6,0);

 R13  REV \(\to\) REV_HOLD:車輛抵達 A(修正問題 3)

(0,0.85) – (0,-0.55); (13.6,0.85) – (13.6,-0.55); (0,0) – (0.27,0); (1.5-1.05,0-0.4) rectangle (1.5+1.05,0+0.4); at (1.5,0+0.21) EQU; at (1.5,0-0.15) STATE=REV; (1.5-1.23,0) – (1.5-1.05,0); (1.5+1.05,0) – (1.5+1.23,0);

(2.73,0) – (3.32,0); at (3.7,0) cno=M_INPUT1_Rise; (4.08,0) – (10.77,0); (12.1-1.15,0-0.45) rectangle (12.1+1.15,0+0.45); at (12.1,0+0.24) MOV; at (12.1,0-0.15) REV_HOLD \(\to\) STATE; (12.1-1.33,0) – (12.1-1.15,0); (12.1+1.15,0) – (12.1+1.33,0);

(13.43,0) – (13.6,0);

計時與逾時(R14–R20)

 R14  通行逾時計時:FWD 或 REV 共用 60 秒(修正問題 6、7 之計時部分)

(0,0.85) – (0,-1.7); (13.6,0.85) – (13.6,-1.7); (0,0) – (0.67,0); (1.9-1.05,0-0.4) rectangle (1.9+1.05,0+0.4); at (1.9,0+0.21) EQU; at (1.9,0-0.15) STATE=FWD; (1.9-1.23,0) – (1.9-1.05,0); (1.9+1.05,0) – (1.9+1.23,0);

(3.13,0) – (10.67,0); (11.9-1.05,0-0.62) rectangle (11.9+1.05,0+0.62); at (11.9,0+0.4) TON_3; at (11.9-0.82,0+0.16) IN; at (11.9+0.84,0+0.16) Q; at (11.9,0-0.36) PT: T#60s; (11.9-1.23,0) – (11.9-1.05,0); (11.9+1.05,0) – (11.9+1.23,0);

(13.13,0) – (13.6,0); (0.45,0) – (0.45,-1.1); (0.45,-1.1) – (0.67,-1.1); (1.9-1.05,-1.1-0.4) rectangle (1.9+1.05,-1.1+0.4); at (1.9,-1.1+0.21) EQU; at (1.9,-1.1-0.15) STATE=REV; (1.9-1.23,-1.1) – (1.9-1.05,-1.1); (1.9+1.05,-1.1) – (1.9+1.23,-1.1);

(3.13,-1.1) – (3.35,-1.1); (3.35,-1.1) – (3.35,0);

 R15  逾時 \(\to\) FAULT 並閂鎖(修正問題 4、6)

(0,0.85) – (0,-1.7); (13.6,0.85) – (13.6,-1.7); (0,0) – (0.92,0); at (1.3,0) cno=TON_3.Q; (1.68,0) – (10.77,0); (12.1-1.15,0-0.45) rectangle (12.1+1.15,0+0.45); at (12.1,0+0.24) MOV; at (12.1,0-0.15) FAULT \(\to\) STATE; (12.1-1.33,0) – (12.1-1.15,0); (12.1+1.15,0) – (12.1+1.33,0);

(13.43,0) – (13.6,0); (10.5,0) – (10.5,-1.1); (10.5,-1.1) – (12.52,-1.1); at (12.9,-1.1) scoil=FaultLatch; (13.28,-1.1) – (13.6,-1.1);

 R16  駐留計時:HOLD 或 REV_HOLD 共用 10 秒

(0,0.85) – (0,-1.7); (13.6,0.85) – (13.6,-1.7); (0,0) – (0.67,0); (1.9-1.05,0-0.4) rectangle (1.9+1.05,0+0.4); at (1.9,0+0.21) EQU; at (1.9,0-0.15) STATE=HOLD; (1.9-1.23,0) – (1.9-1.05,0); (1.9+1.05,0) – (1.9+1.23,0);

(3.13,0) – (10.67,0); (11.9-1.05,0-0.62) rectangle (11.9+1.05,0+0.62); at (11.9,0+0.4) TON_1; at (11.9-0.82,0+0.16) IN; at (11.9+0.84,0+0.16) Q; at (11.9,0-0.36) PT: T#10s; (11.9-1.23,0) – (11.9-1.05,0); (11.9+1.05,0) – (11.9+1.23,0);

(13.13,0) – (13.6,0); (0.45,0) – (0.45,-1.1); (0.45,-1.1) – (0.67,-1.1); (1.9-1.05,-1.1-0.4) rectangle (1.9+1.05,-1.1+0.4); at (1.9,-1.1+0.21) EQU; at (1.9,-1.1-0.15) STATE=REV_HOLD; (1.9-1.23,-1.1) – (1.9-1.05,-1.1); (1.9+1.05,-1.1) – (1.9+1.23,-1.1);

(3.13,-1.1) – (3.35,-1.1); (3.35,-1.1) – (3.35,0);

 R17  HOLD 駐留期滿 \(\to\) IDLE(狀態限定,修正問題 4)

(0,0.85) – (0,-0.55); (13.6,0.85) – (13.6,-0.55); (0,0) – (0.27,0); (1.5-1.05,0-0.4) rectangle (1.5+1.05,0+0.4); at (1.5,0+0.21) EQU; at (1.5,0-0.15) STATE=HOLD; (1.5-1.23,0) – (1.5-1.05,0); (1.5+1.05,0) – (1.5+1.23,0);

(2.73,0) – (3.32,0); at (3.7,0) cno=TON_1.Q; (4.08,0) – (10.77,0); (12.1-1.15,0-0.45) rectangle (12.1+1.15,0+0.45); at (12.1,0+0.24) MOV; at (12.1,0-0.15) IDLE \(\to\) STATE; (12.1-1.33,0) – (12.1-1.15,0); (12.1+1.15,0) – (12.1+1.33,0);

(13.43,0) – (13.6,0);

 R18  REV_HOLD 駐留期滿 \(\to\) IDLE

(0,0.85) – (0,-0.55); (13.6,0.85) – (13.6,-0.55); (0,0) – (0.27,0); (1.5-1.05,0-0.4) rectangle (1.5+1.05,0+0.4); at (1.5,0+0.21) EQU; at (1.5,0-0.15) STATE=REV_HOLD; (1.5-1.23,0) – (1.5-1.05,0); (1.5+1.05,0) – (1.5+1.23,0);

(2.73,0) – (3.32,0); at (3.7,0) cno=TON_1.Q; (4.08,0) – (10.77,0); (12.1-1.15,0-0.45) rectangle (12.1+1.15,0+0.45); at (12.1,0+0.24) MOV; at (12.1,0-0.15) IDLE \(\to\) STATE; (12.1-1.33,0) – (12.1-1.15,0); (12.1+1.15,0) – (12.1+1.33,0);

(13.43,0) – (13.6,0);

 R19  HOLD 期間後車自 A 跟進 \(\to\) 回 FWD

(0,0.85) – (0,-0.55); (13.6,0.85) – (13.6,-0.55); (0,0) – (0.27,0); (1.5-1.05,0-0.4) rectangle (1.5+1.05,0+0.4); at (1.5,0+0.21) EQU; at (1.5,0-0.15) STATE=HOLD; (1.5-1.23,0) – (1.5-1.05,0); (1.5+1.05,0) – (1.5+1.23,0);

(2.73,0) – (3.32,0); at (3.7,0) cno=M_INPUT1_Rise; (4.08,0) – (10.77,0); (12.1-1.15,0-0.45) rectangle (12.1+1.15,0+0.45); at (12.1,0+0.24) MOV; at (12.1,0-0.15) FWD \(\to\) STATE; (12.1-1.33,0) – (12.1-1.15,0); (12.1+1.15,0) – (12.1+1.33,0);

(13.43,0) – (13.6,0);

 R20  REV_HOLD 期間後車自 B 跟進 \(\to\) 回 REV

(0,0.85) – (0,-0.55); (13.6,0.85) – (13.6,-0.55); (0,0) – (0.27,0); (1.5-1.05,0-0.4) rectangle (1.5+1.05,0+0.4); at (1.5,0+0.21) EQU; at (1.5,0-0.15) STATE=REV_HOLD; (1.5-1.23,0) – (1.5-1.05,0); (1.5+1.05,0) – (1.5+1.23,0);

(2.73,0) – (3.32,0); at (3.7,0) cno=M_INPUT2_Rise; (4.08,0) – (10.77,0); (12.1-1.15,0-0.45) rectangle (12.1+1.15,0+0.45); at (12.1,0+0.24) MOV; at (12.1,0-0.15) REV \(\to\) STATE; (12.1-1.33,0) – (12.1-1.15,0); (12.1+1.15,0) – (12.1+1.33,0);

(13.43,0) – (13.6,0);

故障復歸與輸出(R21–R23)

 R21  復歸:按鈕上升緣、限 FAULT 狀態、故障已排除;解閂與回 IDLE 一次完成(修正問題 2、10、建議 15)

(0,0.85) – (0,-1.7); (13.6,0.85) – (13.6,-1.7); (0,0) – (0.92,0); at (1.3,0) cpe=PB_RESET; (1.68,0) – (1.97,0); (3.2-1.05,0-0.4) rectangle (3.2+1.05,0+0.4); at (3.2,0+0.21) EQU; at (3.2,0-0.15) STATE=FAULT; (3.2-1.23,0) – (3.2-1.05,0); (3.2+1.05,0) – (3.2+1.23,0);

(4.43,0) – (5.02,0); at (5.4,0) cnc=SensorStuck; (5.78,0) – (12.52,0); at (12.9,0) ucoil=FaultLatch; (13.28,0) – (13.6,0); (10.5,0) – (10.5,-1.1); (10.5,-1.1) – (10.77,-1.1); (12.1-1.15,-1.1-0.45) rectangle (12.1+1.15,-1.1+0.45); at (12.1,-1.1+0.24) MOV; at (12.1,-1.1-0.15) IDLE \(\to\) STATE; (12.1-1.33,-1.1) – (12.1-1.15,-1.1); (12.1+1.15,-1.1) – (12.1+1.33,-1.1);

(13.43,-1.1) – (13.6,-1.1);

 R22  占用燈:通行、駐留與故障期間皆點亮(修正問題 7)

(0,0.85) – (0,-4.9); (13.6,0.85) – (13.6,-4.9); (0,0) – (0.67,0); (1.9-1.05,0-0.4) rectangle (1.9+1.05,0+0.4); at (1.9,0+0.21) EQU; at (1.9,0-0.15) STATE=FWD; (1.9-1.23,0) – (1.9-1.05,0); (1.9+1.05,0) – (1.9+1.23,0);

(3.13,0) – (12.52,0); at (12.9,0) coil=OUTPUT_1; (13.28,0) – (13.6,0); (0.45,0) – (0.45,-4.4); (0.45,-1.1) – (0.67,-1.1); (1.9-1.05,-1.1-0.4) rectangle (1.9+1.05,-1.1+0.4); at (1.9,-1.1+0.21) EQU; at (1.9,-1.1-0.15) STATE=HOLD; (1.9-1.23,-1.1) – (1.9-1.05,-1.1); (1.9+1.05,-1.1) – (1.9+1.23,-1.1);

(3.13,-1.1) – (3.35,-1.1); (0.45,-2.2) – (0.67,-2.2); (1.9-1.05,-2.2-0.4) rectangle (1.9+1.05,-2.2+0.4); at (1.9,-2.2+0.21) EQU; at (1.9,-2.2-0.15) STATE=REV; (1.9-1.23,-2.2) – (1.9-1.05,-2.2); (1.9+1.05,-2.2) – (1.9+1.23,-2.2);

(3.13,-2.2) – (3.35,-2.2); (0.45,-3.3) – (0.67,-3.3); (1.9-1.05,-3.3-0.4) rectangle (1.9+1.05,-3.3+0.4); at (1.9,-3.3+0.21) EQU; at (1.9,-3.3-0.15) STATE=REV_HOLD; (1.9-1.23,-3.3) – (1.9-1.05,-3.3); (1.9+1.05,-3.3) – (1.9+1.23,-3.3);

(3.13,-3.3) – (3.35,-3.3); (0.45,-4.4) – (0.67,-4.4); (1.9-1.05,-4.4-0.4) rectangle (1.9+1.05,-4.4+0.4); at (1.9,-4.4+0.21) EQU; at (1.9,-4.4-0.15) STATE=FAULT; (1.9-1.23,-4.4) – (1.9-1.05,-4.4); (1.9+1.05,-4.4) – (1.9+1.23,-4.4);

(3.13,-4.4) – (3.35,-4.4); (3.35,-4.4) – (3.35,0);

 R23  故障燈

(0,0.85) – (0,-0.55); (13.6,0.85) – (13.6,-0.55); (0,0) – (0.92,0); at (1.3,0) cno=FaultLatch; (1.68,0) – (12.52,0); at (12.9,0) coil=OUTPUT_2; (13.28,0) – (13.6,0);

設計要點備忘

  • 寫入點限定:STATE 的寫入 rung(R3、R8–R13、R15、R17–R21) 除故障接管(R8)與逾時(R15,由狀態驅動的計時器保證)外, 全部以 EQU(STATE, 現態) 為第一條件,同一現態的轉移條件互斥。

  • 掃描順序:邊緣旗標(R1–R2)最先產生;故障接管(R8)在所有轉移之前; 輸出(R22–R23)在最後,為狀態的純函數。

  • 計時器:全部使用 TON(非保持型),IN 由狀態驅動,離開狀態即自動復歸; R15、R17、R18 使用 TON.Q 時皆有狀態限定,即使日後搬動 rung 也不會誤寫。

  • 逾時即故障:60 秒逾時不再放行對向車輛,一律閂鎖 FAULT, 由人員確認車道淨空後以 R21 復歸。

  • 選配:多車場域請加入第 3.6 節的車輛計數, 以「車數 = 0」取代純計時作為回 IDLE 的條件。