輸出限制到100 仍要知道原來算出110
控制命令算出110%,設備介面只接受0~100%,可以把輸出裁到100%;但若你把原始110覆寫掉,維護時就看不到超界原因。這篇把Raw、Limited、RangeFlag分開,讓輸出符合範圍的同時,仍保留診斷需要的資料。
本例是虛擬百分比命令,Min=0、Max=100,沒有連接加熱器或馬達。採用規則是超出範圍即裁切並立起相應旗標,剛好等於邊界不算超界。CODESYS LIMIT的官方參數順序是Min、IN、Max;其他平台若有類似函式,仍須核對順序與型別,不能只照名稱套入。
| 變數 | X=110時 | 用途 |
|---|---|---|
| Raw | 110 | 保留原始計算要求 |
| Limited | 100 | 送給限制範圍內的後續介面 |
| AboveMax | TRUE | 表示原值高於上限 |
| BelowMin | FALSE | 表示原值不低於下限 |
| Valid | TRUE | 本次資料有效但已飽和 |
「資料有效」與「未超界」不是同一件事。110可以是有效運算結果,但超過設備可接受範圍;通訊失敗後留下的110則可能根本無效。要用獨立的來源品質判斷Valid,再做範圍比較,不要用一次LIMIT把所有異常洗成漂亮數字。
先固定邊界條件 再寫程式
Limited = MIN(MAX(Raw, Min), Max)
先確認Min≤Max,再判斷Raw是否低於或高於界線。等於0時Limited=0且旗標均為FALSE;等於100也相同。若需求是「碰到上限就告警」,另設AtMax,不能把AboveMax的定義悄悄改成大於等於。
| Raw | Limited | BelowMin | AboveMax | 說明 |
|---|---|---|---|---|
| −20 | 0 | 1 | 0 | 裁到下限 |
| 0 | 0 | 0 | 0 | 等於下限 |
| 50 | 50 | 0 | 0 | 區間內不變 |
| 100 | 100 | 0 | 0 | 等於上限 |
| 110 | 100 | 0 | 1 | 裁到上限 |
| 1000 | 100 | 0 | 1 | 大幅超界仍須保留原值 |
教學偽碼,非指定PLC可編譯語法:
若範圍或來源無效:Valid := FALSE;Error := 原因
否則:
BelowMin := Raw < Min
AboveMax := Raw > Max
Limited := MIN(MAX(Raw, Min), Max)
Valid := TRUE
下游只在Valid成立時採用Limited。
不要在別處再寫Raw:=Limited,否則下一掃描或記錄器可能只看到100,無法知道110曾發生。把原始計算、限制結果與原因放在同一筆診斷資料,還可比較超界幅度與持續時間。
無效範圍和無效量測要先分流
本例若Min=100、Max=0,屬於參數錯誤;若來源為NaN、無限大或品質無效,屬於來源錯誤。都不進正常裁切。輸出本身要保持、關閉或改替代值,必須由設備規格決定;本文只在虛擬資料介面將Valid設為0,不替真實設備決定故障動作。
| 輸入條件 | 結果狀態 | 不能做的事 |
|---|---|---|
| Min>Max | CONFIG_ERROR | 自動交換界線卻不通知 |
| 來源品質失效 | SOURCE_INVALID | 把上一筆值當本次有效命令 |
| NaN或無限大 | NUMERIC_INVALID | 假設MIN/MAX一定會正常處理 |
| Raw=110 有效 | Valid=1 AboveMax=1 | 把超界等同通訊錯誤 |
| Raw=100 有效 | Valid=1 AboveMax=0 | 擅自當成超界 |
先在HMI編輯區驗證上下限,再整組提交,避免更新時出現上下限互換。
PLC端再次核對範圍及來源有效性,不只信任畫面限制。
正常裁切時保留原值、限制值、界線版本與旗標。
無效時輸出明確Error,並讓下游按既定策略處理。
用範圍錯誤、來源失聯與正常超界三種測試確認警報不會混淆。
後續累加與反算要選對資料
假設原始命令連續三次都是110,Limited每次都是100。若你的統計是「要求命令總和」,三筆為330;若是「限制後命令總和」,則為300。兩者都只是命令的統計,不代表物理能量或產量。實際輸出回饋還要從設備讀取,不能把Limited直接當作實際動作。
| 資料用途 | 應考慮哪個值 | 原因 |
|---|---|---|
| 分析需求是否超負荷 | Raw與RangeFlag | 才能看到超界程度 |
| 送入限定範圍介面 | Limited且Valid | 符合接口範圍 |
| 實際產量或能量 | 實際回饋與時間資訊 | 命令不是量測 |
| 限制反算 | Raw−Limited與控制器狀態 | 需依演算法定義回授 |
若這個限制位於積分控制器後面,單獨裁切輸出不一定會阻止內部積分繼續增加。解除飽和後可能還要很久才恢復,這是積分飽和相關問題。需採控制器官方支援的抗飽和方法或經驗證的反算設計,不要把Raw改寫成Limited就宣稱解決。本文沒有提供PID抗飽和實作。
在紀錄畫面可並排顯示「要求110%、限制100%、超上限10%」。這樣操作員看到輸出停在100時,不會以為系統不接受設定,也能辨認是持續超需求還是偶發計算尖峰。若告警要求持續超界一段時間,再以獨立計時判斷,不改變瞬時RangeFlag的事實。
用連續紀錄區分瞬時旗標與告警
先建立六筆輸入序列:九十五、一百、一百零五、一百一十、一百、九十五。限制後序列應為九十五、一百、一百、一百、一百、九十五;只有第三與第四筆的超上限旗標成立。若第五筆仍成立,先查旗標是否每次重新計算,或者被誤寫成保持型警報。
瞬時旗標描述目前這筆資料,告警則可以另有延遲與保持規則。若需求是持續超界才通知操作員,應使用有效時間資料計算持續時間,不要把六筆樣本直接當六秒。取樣間隔改變、資料中斷或掃描延遲,都會使筆數與實際時間不同;兩種資訊應分開記錄。
若告警需要人工確認,確認只處理告警的已讀或保持狀態,不應改掉原始值與瞬時超界事實。當原始值仍高於上限,畫面仍須清楚顯示目前超界;否則操作員按一次確認後,可能以為限制原因已消失。這是診斷介面的設計,不代表本文已提供設備安全保護。
參數改變也會讓同一原始值產生不同結果。例如原始要求九十,原上限一百時不裁切;新上限八十生效後,限制值變八十並立起超上限旗標。驗收時要記錄參數版本及生效時刻,才能解釋輸出為何改變。上下限若分次寫入,應先在編輯區完成,再整組提交。
下游若只接受限制值而忽略有效性,就可能在來源失效時繼續使用舊命令。請追查真正採用命令的位置,確認它同時檢查本次有效旗標及必要的新鮮度資訊。故障時的動作由設備需求另外決定;本篇的資料介面只能揭露問題,不能替下游自動選擇安全結果。
最後用另一組上下限重跑相同邊界策略,例如負五十到五十,測低於下限、等於下限、區間內、等於上限及高於上限。若只改參數就讓正負範圍的結果失真,通常是型別、比較符號或硬寫常數的問題。保留原始值可以讓這些錯誤被看見,也是後續修改限制策略時的重要依據。
完成驗收與常見錯誤
完成後應得到六列測試表的限制值與旗標;切換Raw=110→100→50時,AboveMax應依序1→0→0。另測Min>Max和來源無效,確認Valid=0並顯示不同原因。最後搜尋Raw的全部寫入點,確保診斷資料沒有被限制值覆蓋。
| 現象 | 先查哪裡 |
|---|---|
| 超界卻沒有旗標 | 是否用Limited比較上下限 |
| 等於上限就告警 | 比較符號是否把 > 寫成 >= |
| 下限比上限大仍運作 | 參數驗證是否在LIMIT之前 |
| 無效資料變成正常100 | 來源品質與數值有限性檢查 |
| 解除限制後恢復很慢 | 是否有未處理的控制器積分累積 |
問:LIMIT會自己報超界嗎?不要假設,另由Raw計算診斷旗標。問:上限100是否代表Raw不能大於100?Raw可能超界,介面限制才輸出100,兩者要分開。問:限制後值可當實際輸出嗎?它是命令,仍要看硬體與設備回饋。
適用型號與限制:具體函式順序參照CODESYS Development System LIMIT文件;Q06UDVCPU與其他PLC應核對自身比較與限制指令。本文為百分比資料處理,不是安全限位或設備保護設計。
參考:CODESYS LIMIT 參數順序與MIN MAX等價式