← 所有文章

PLC 查表與分段線性插值

· 站長

從五點合成曲線尋找相鄰區間,完整算出中點,並拒絕重複X與超量程輸入。

曲線不是直線 就在相鄰點之間算

感測器原始值每增加100,工程值不一定增加相同幅度。只拿全量程兩端做一條直線,可能在中段產生明顯偏差。分段線性插值的做法是先找輸入落在哪兩個校正點之間,再只使用那一段的斜率。這篇用五個合成點完整算一次,並處理表格不合法與超量程情況。

以下X是虛構原始計數,Y是虛構工程單位EU;它們不是任何感測器實測校正值。表的X必須嚴格遞增,每一列都必須同時有X與Y。本例Y也遞增,但那是案例特性,並非所有插值表必須如此。真實資料應由設備文件或可追溯量測取得。

索引 X 原始計數 Y 工程單位EU
0 0 0
1 100 8
2 200 20
3 300 35
4 400 55

先觀察每段增量:8、12、15、20,都不相同。若直接使用兩端公式Y=55×X÷400,X=200會得到27.5,已偏離表中的20。插值不是把原始點也改掉,而是保留每個已知點,對其間位置作局部估算。

先找區間 再代入公式

Y = Y[i] + (X − X[i]) × (Y[i+1] − Y[i]) ÷ (X[i+1] − X[i])

輸入X=150時,100≤150≤200,所以使用索引1與2。比例是(150−100)÷(200−100)=0.5,Y=8+0.5×(20−8)=14 EU。這個結果落在8與20中間,能用幾何位置檢查合理性;若算成負數或超過20,先查索引、符號與運算型別。

輸入X 選用區間 區間比例 Y結果
50 0~100 0.5 4
150 100~200 0.5 14
250 200~300 0.5 27.5
350 300~400 0.5 45
200 已知點 直接取表 20

實作時先處理剛好等於最末X=400,直接回傳55;否則搜尋i=0~3,使Xi≤X<Xi+1。用左含右不含區間可避免X=200同時落入兩段。最後一點另行處理,便不會為了找Xi+1而讀到索引5,超出五點表的界限。

比例計算不能先以整數做50÷100,否則得到0,整段結果就停在左端。可用已核對的浮點型別計算,或設計足夠寬的固定小數中間式;不論哪一種,都要記錄工程單位與輸出解析度。

計算前先拒絕不合法曲線

  1. 確認至少有兩個完整點,X與Y點數一致,沒有空值或無效數。

  2. 從第一點向後檢查每個Xi+1都大於Xi;相等或倒序都拒絕啟用。

  3. 核對輸入單位、Y單位、倍率與表版本,避免把不同量程的點混在一起。

  4. 取得輸入後先檢查品質與X範圍;本例超出0~400時回報OUT_OF_RANGE,不外插。

  5. 找到區間後計算,輸出Y、Valid、區間索引與表版本供監看。

錯誤表或輸入 本例策略 原因
兩點X都等於100 TABLE_ERROR 分母為0,不能除
X順序0 200 100 TABLE_ERROR 搜尋條件不再成立
只有一點 TABLE_ERROR 無法形成線段
X=−1或401 OUT_OF_RANGE 不擅自外推未知曲線
Y缺值或來源無效 INVALID 不能把缺點補零

不要只在除法當下檢查分母0,卻仍讓不合法表的一部分結果流進控制。表可以在載入或版本變更時完整驗證,通過後才提交為工作表;若HMI正在分批修改五個點,應先更新待確認區,整份驗證完成再切換,避免一次運算讀到新舊混合的曲線。

五點表的驗收要包含原點與中點

先測五個原始X,結果必須逐一回到0、8、20、35、55。再測四個區間中點,得到4、14、27.5、45。這兩組測試分別抓出表格讀錯和斜率計算錯;只測X=0,通常看不出整數除法或相鄰點索引的問題。

測試組 輸入 預期
全部原始點 0 100 200 300 400 0 8 20 35 55
全部中點 50 150 250 350 4 14 27.5 45
第一點左側 −1 拒絕並保留原因
最後點右側 401 拒絕並保留原因
重複X表 100與100相鄰 表驗證失敗 不執行

若輸出需要整數,要在插值後依明訂規則取整。X=250得到27.5,截斷可為27,最近且中點遠離零為28;不能讓顯示格式替你決定。記錄未取整值可幫助區分「插值錯」和「最後取整不同」。

完成後仍不能宣稱感測器已重新校正。插值只依給定點作估計,點本身的誤差、溫漂、回差與長期漂移不會被這個公式消除。若真實曲線有陡變,增加測點的位置應由量測需求決定,不是任意每100補一點就能提高可信度。

用非中點資料檢查區間選擇

四個中點算對之後,再加入不是中點的輸入。以一百二十五為例,它位於一百與二百之間,比例是四分之一;工程值從八增加十二的四分之一,結果為十一。輸入一百七十五時比例為四分之三,結果為十七。這兩筆能檢查程式是否真的計算比例,而不是固定取兩端平均。

接著測節點左右兩側。輸入一百九十九時,仍使用一百到二百這一段,結果是十九點八八;輸入二百零一時,改用二百到三百這一段,結果是二十點一五。兩段斜率不同,但在節點二百都應接回二十。如果在節點出現明顯跳躍,先查索引和表格配對,不要先加平滑濾波遮掩。

監看欄位最好包含輸入、左索引、右索引、左右端點、分母、比例與未取整結果。若結果停在左端,只看最終數字無法分辨輸入剛好等於左點,還是整數除法把比例變成零。這些中間欄位讓你能沿著公式找出第一個偏離預期的位置,縮短排查時間。

實際換表時,先建立完整候選表並檢查點數、排序及數值有效性。驗證通過才通知工作程式採用新版本。若更新跨越多個掃描或多次通訊傳送,不能假設每一個點會同時抵達;應依平台支援方式做整組提交,並讓一次計算使用一致的表版本。本文沒有指定跨任務原子操作的語法。

表格的量測單位也要納入版本資訊。原始計數表不能直接換成毫安表,工程值原本是壓力也不能只改標題就當液位。即使數字範圍剛好相同,公式的物理意義已經改變。先確認兩軸的定義、倍率與量程,再決定是否允許使用這份表。

把驗收紀錄交給下一位使用者時,註明這些數據是合成教學資料,並附上每個算例使用的左右點。需要現場校正時,另收集可追溯的實測點及量測條件。查表程式正確,只表示它忠實執行給定資料的插值,不能證明感測器、標準器或實際製程的量測已經正確。

失敗排查 常見問題與適用範圍

現象 先查哪裡
一整段只等於左點 比例是否先做了整數除法
在節點突然跳值 相鄰點索引、端點包含規則與表更新一致性
最後一點程式報錯 是否讀到索引5;最末點應單獨處理
某段出現極大值 X間距、資料品質、位寬與除數
換表後偶發錯誤 是否一次運算讀到新舊不同版本

問:超出表範圍能延長最後一段嗎?那是外插,必須另有合理的設備依據;本例選擇拒絕。問:Y一定要遞增嗎?不一定,一般函數可下降,但同一X不能有兩個不同Y,且X排序必須正確。問:點越多越準嗎?只有點的品質與位置合理才有幫助,雜訊點過多也可能讓曲線不穩。

適用型號與限制:搜尋與插值為通用設計,具體陣列例參照CODESYS ARRAY OF文件。Q系列的陣列宣告、索引檢查、REAL運算與表更新方式要依工程軟體及CPU確認;本文未指定可直接編譯的查表函式。

參考:CODESYS ARRAY OF 陣列上下界與存取

參考:CODESYS Numeric constants 防止整數除法遺失餘數

延伸閱讀


使用 PLC 工具箱 →