先定義條件再選語言
Ladder 與 Structured Text 都能表達布林邏輯,但畫面排列、短路評估、重複寫入與掃描上下文可能讓看似相同的程式產生不同結果。本文只做教學邏輯,不假裝是任何 GX Works 截圖,也不指定廠牌特殊指令。先定義三個輸入 A、B、C,輸出 Y 的需求為:A 為真且 B 為假,或 C 為真時,Y 才為真。
這個需求可寫成 Y := (A AND NOT B) OR C。表達式很短,但驗收不能只看一行程式。要列出八種輸入組合,確認 A、B、C 的語意、NOT 的範圍、括號和輸出唯一寫入位置。若實際條件還包含模式、互鎖或故障,應先另行定義,不要把安全功能壓縮進這個教學例子。
| 符號 | 本例語意 | 測試來源 |
|---|---|---|
| A | 允許請求 | 合成開關 |
| B | 阻擋條件 | 合成開關 |
| C | 獨立替代條件 | 合成開關 |
| Y | 教學輸出 | 內部變數 |
使用互不相同的變數名稱,比把三個真實輸出直接接上更安全。每列先建立完整輸入快照,再評估兩份程式並保存結果;這能找到程式是否意外使用前一掃描的 Y 或在不同網路重複寫入。
八列真值表是共同規格
| A | B | C | A AND NOT B | Y 預期 |
|---|---|---|---|---|
| 0 | 0 | 0 | 0 | 0 |
| 0 | 0 | 1 | 0 | 1 |
| 0 | 1 | 0 | 0 | 0 |
| 0 | 1 | 1 | 0 | 1 |
| 1 | 0 | 0 | 1 | 1 |
| 1 | 0 | 1 | 1 | 1 |
| 1 | 1 | 0 | 0 | 0 |
| 1 | 1 | 1 | 0 | 1 |
真值表中的第四欄不是多餘的,它讓排查能先確認子條件,再確認 OR 合併。最容易漏掉的是 A=1、B=1、C=0:A 的請求雖然成立,但 B 阻擋,所以 Y 必須為 0。另一個邊界是 C=1 且 A、B 任意,依本例需求 Y 都為 1;若實際設備不允許旁路,需求就必須改寫。
把三個輸入初始化為 0,確認 Y 為 0。
依真值表逐列建立000到111的完整快照,每列等待一次完整評估;逐欄寫入時不採用尚未寫完的中間組合。
記錄 Ladder 版本與 ST 版本的 Y,不把畫面顏色當唯一證據。
若結果不同,先比較括號、接點常閉語意與變數型別。
測試完成後清除強制值,確認 Y 回到由程式計算的狀態。
若輸入來自實體 I/O,還要說明取樣和更新時間。本文真值表只定義同一個程式評估時刻的 0/1 關係,不保證不同任務或不同平台在同一掃描讀到完全相同的輸入。
Ladder 寫法的可讀性與陷阱
Ladder 可把 A 常開接點與 B 常閉接點串聯,形成 A AND NOT B;再把 C 常開支路並聯到輸出線圈 Y。這種圖形直接展示 AND 與 OR,但必須確認同一個 Y 只有一個決策網路。若把 C 另放在後面再寫一次 Y,某些平台可能依程式順序產生最後寫入優先,讀者容易誤以為是邏輯 OR。
常閉接點的圖形通常表示輸入為 FALSE 時導通,但它不是安全常閉回路的替代品。教學變數 B 為邏輯阻擋條件;實體急停、門鎖和安全控制必須依適用標準與安全控制器設計,不能把一個 Ladder 常閉接點當成完整安全功能。
| 檢查點 | 正確方向 | 常見錯誤 |
|---|---|---|
| B 接點 | B=0 才允許通過 | 把常閉誤當成 B=1 |
| C 支路 | 與主條件做 OR | 串聯成 AND |
| Y 寫入 | 單一決策點 | 多網路重複線圈 |
| 初始化 | 輸入與輸出可追蹤 | 強制值遺留 |
用八列真值表逐列點亮 Ladder 網路,比只看 000 和 111 更可靠。特別要檢查 100、110、001、011 四列,因為它們分別展示阻擋、旁路和兩條分支的差異。若平台在線監看顯示的是最佳化後的位元,仍要保存程式版本與測試紀錄。
ST 寫法與括號要明確
ST 的教學寫法可以是 Y := (A AND NOT B) OR C;。括號把 AND 子條件和 OR 分支分開,閱讀者不需要依語言優先級猜測。若把它寫成 Y := A AND NOT B OR C,也許在某些語言能得到相同結果,但移植到另一個編譯器或交給不熟悉優先級的人時,風險增加。本文不假定所有 IEC 方言的細節完全一致。
同一個輸出在 ST 中也不要在不同 IF 區塊重複賦值。若要顯示子條件,建立中間變數 Permit := A AND NOT B,再由 Y := Permit OR C 統一產生輸出;中間變數讓 Trace 和監看更容易。教學程式只表示布林計算,不包含實體輸出、模式管理或錯誤復歸。
宣告 A、B、C、Permit 與 Y 為明確的布林型別。
先計算 Permit,再由單一敘述計算 Y。
對照真值表逐列執行,保存編譯器診斷與結果。
把括號與 NOT 的範圍保留在原始碼,不依賴編輯器格式。
將 ST 結果與 Ladder 結果匯出成同一張比較表。
如果 ST 執行在週期任務而 Ladder POU 在另一任務,兩份程式可能讀到不同時間的 A、B、C。這不是語法差異,而是任務配置差異。要比較語言,先讓它們使用相同快照;若做不到,就在報告明確標示比較的是不同時序。
同一需求的差異排查
當 Ladder 與 ST 結果不一致時,先檢查三件事:輸入是否同一組快照、輸出是否被其他程式寫入、以及 B 的反相語意是否一致。接著才查語言優先級、型別轉換與編譯器警告。把問題拆成 Permit 與 C 兩路,可迅速知道差異在子條件還是合併。
| 現象 | 可能原因 | 驗證動作 |
|---|---|---|
| 只有 B=1 時不同 | 常閉/NOT 語意 | 獨立記錄 Permit |
| C=1 時不同 | 支路串並聯錯 | 只測 C 支路 |
| 結果延一掃描 | 任務或輸出覆寫 | 比較快照序號 |
| 偶爾不同 | 輸入更新不同步 | 固定輸入腳本 |
三布林條件很適合做最小回歸測試。每次改寫 Ladder 或 ST,都重跑八列,不要只測發生過問題的那一列。若程式增加模式條件,先把新條件列為第四個變數,真值表會變成十六列;也可以先分層驗證子條件,再驗證模式與輸出的整合。
測試記錄要寫清楚是離線模擬、軟體模擬器、控制器在線監看還是實機 I/O。不同層級能證明的事情不同。離線真值表能證明邏輯映射,不能證明輸入端子接線、任務更新或實體輸出反應。
驗收與安全邊界
驗收先確認兩種語言的八列結果完全一致,再確認只有一個位置負責寫入教學輸出。若把 Y 接到實體設備,還需要另做輸出互鎖、模式、故障與安全需求;本文案例不提供那些完整控制程式,也不應被直接複製到機台。
核對需求公式與真值表版本。
用固定順序輸入八組組合,記錄 Ladder、ST、Permit 與 Y。
查交叉參照,確認沒有其他 POU 或 HMI 寫入 Y。
清除強制值並重新啟動測試,排除保持狀態造成的假通過。
把平台、編譯器、任務與未測項目寫入驗收紀錄。
問:Ladder 和 ST 結果一定一樣嗎?在相同輸入快照、同一邏輯與單一輸出寫入下應一致,但任務時序或重複寫入會讓結果不同。問:常閉接點就是安全功能嗎?不是,安全功能要用適用的安全架構與驗證。問:可以省略括號嗎?即使語言目前能正確解析,也建議保留以表達意圖。問:一個測試點通過就夠嗎?不夠,三個布林輸入有八種組合。
適用型號與限制:本文以 IEC 風格 Ladder 與 ST 的布林教學邏輯說明真值表;沒有提供 GX Works 畫面或特定 Q 系列指令。實際語言優先級、常閉圖形、任務順序、變數保持與 I/O 更新必須依目標工程軟體及 CPU 文件確認。