曲線不是直線 就在相鄰點之間算
感測器原始值每增加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,整段結果就停在左端。可用已核對的浮點型別計算,或設計足夠寬的固定小數中間式;不論哪一種,都要記錄工程單位與輸出解析度。
計算前先拒絕不合法曲線
確認至少有兩個完整點,X與Y點數一致,沒有空值或無效數。
從第一點向後檢查每個Xi+1都大於Xi;相等或倒序都拒絕啟用。
核對輸入單位、Y單位、倍率與表版本,避免把不同量程的點混在一起。
取得輸入後先檢查品質與X範圍;本例超出0~400時回報OUT_OF_RANGE,不外插。
找到區間後計算,輸出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 Numeric constants 防止整數除法遺失餘數