← 所有文章

Ladder 與 ST 寫同一組布林條件 用真值表對照邏輯

· 站長

用三個布林輸入的八列真值表,對照 Ladder 與 ST 的同一組教學邏輯並排查時序差異。

先定義條件再選語言

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;若實際設備不允許旁路,需求就必須改寫。

  1. 把三個輸入初始化為 0,確認 Y 為 0。

  2. 依真值表逐列建立000到111的完整快照,每列等待一次完整評估;逐欄寫入時不採用尚未寫完的中間組合。

  3. 記錄 Ladder 版本與 ST 版本的 Y,不把畫面顏色當唯一證據。

  4. 若結果不同,先比較括號、接點常閉語意與變數型別。

  5. 測試完成後清除強制值,確認 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 和監看更容易。教學程式只表示布林計算,不包含實體輸出、模式管理或錯誤復歸。

  1. 宣告 A、B、C、Permit 與 Y 為明確的布林型別。

  2. 先計算 Permit,再由單一敘述計算 Y。

  3. 對照真值表逐列執行,保存編譯器診斷與結果。

  4. 把括號與 NOT 的範圍保留在原始碼,不依賴編輯器格式。

  5. 將 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 接到實體設備,還需要另做輸出互鎖、模式、故障與安全需求;本文案例不提供那些完整控制程式,也不應被直接複製到機台。

  1. 核對需求公式與真值表版本。

  2. 用固定順序輸入八組組合,記錄 Ladder、ST、Permit 與 Y。

  3. 查交叉參照,確認沒有其他 POU 或 HMI 寫入 Y。

  4. 清除強制值並重新啟動測試,排除保持狀態造成的假通過。

  5. 把平台、編譯器、任務與未測項目寫入驗收紀錄。

問:Ladder 和 ST 結果一定一樣嗎?在相同輸入快照、同一邏輯與單一輸出寫入下應一致,但任務時序或重複寫入會讓結果不同。問:常閉接點就是安全功能嗎?不是,安全功能要用適用的安全架構與驗證。問:可以省略括號嗎?即使語言目前能正確解析,也建議保留以表達意圖。問:一個測試點通過就夠嗎?不夠,三個布林輸入有八種組合。

適用型號與限制:本文以 IEC 風格 Ladder 與 ST 的布林教學邏輯說明真值表;沒有提供 GX Works 畫面或特定 Q 系列指令。實際語言優先級、常閉圖形、任務順序、變數保持與 I/O 更新必須依目標工程軟體及 CPU 文件確認。

參考:CODESYS 語言與任務文件

參考:CODESYS 語言與任務文件

延伸閱讀


使用 PLC 工具箱 →