← 所有文章

比例換算的零點偏移如何避免反算誤差

· 站長

以 raw 4000..20000 對應 -1..9 bar 的可重現案例,教導零點偏移、正反算、夾限不可逆與最後一次捨入。

一 先固定量程與資料角色

比例換算最容易出錯的地方,不是乘除公式,而是把零點、量程、顯示值和原始碼混成同一個欄位。本篇設定一個可重現的離線案例:原始 raw 為整數 4000 到 20000,工程量 pressure 為 -1 到 9 bar。raw=4000 必須對應 -1 bar,raw=20000 必須對應 9 bar;這是規格邊界,不是看到某次讀值後才調整的校正常數。

先把輸入保存為 raw_raw,另外建立 pressure_calc、pressure_display、valid 與 range_state。raw_raw 保留感測器或通訊收到的原值,pressure_calc 才套用比例式,pressure_display 才做最後一次顯示捨入。若只保留 4.0 bar,日後無法判斷它是 raw=12000 的結果,還是先捨入後又被反算。這種分層也能讓排查知道問題出在輸入、公式、夾限還是顯示。

本案例的公式是 E=-1+(raw-4000)*10/16000。分母是原始量程寬度 20000-4000=16000,分子乘上的 10 是工程量寬度 9-(-1)。因此 raw=4000 時 E=-1,raw=20000 時 E=9。公式中的數字必須有名稱,例如 RawMin、RawMax、EngMin、EngMax,不能把 4000、16000、10 散落在不同網路或不同程式段。

執行前先確認 raw 的資料型別足以容納 20000,計算中把乘法提升到較寬型別,避免窄整數先相乘而溢位。若目標 PLC 的 REAL、LREAL 或整數轉換規則尚未由手冊確認,本文只提供數學流程,不宣稱某一廠牌指令名稱可直接貼上。

本題的輸入規則先定為:raw 在 4000..20000 內才是有效量程;低於 4000 或高於 20000 設為 OutOfRange,仍保留 raw_raw 與未夾限計算值供診斷。是否要把越界顯示成邊界值,必須另列 clamp_policy,不能悄悄把異常資料當正常滿量程。

量程常數應以工程單位明確記錄。RawSpan=16000 是碼值差,EngSpan=10 是 bar 差,兩者不能因畫面顯示一位小數就改成 100 或 1000。若壓力另有 kPa 顯示,應先由 bar 得到內部工程值,再用單一明確的 bar→kPa 轉換;不要重新拿 raw 套第二套零點公式。

配置量程時先檢查RawMax不等於RawMin;跨度為零時不能進行除法。若工程兩端相同,正算會成為常數,反算不再唯一。本篇要求原始與工程跨度都非零,反算才使用所列公式。

二 逐筆計算正常值與邊界值

把 本篇測試資料逐筆套入同一公式,先算差值,再算工程量,最後才決定狀態。raw=12000 時,raw-4000=8000,800010/16000=5,E=-1+5=4 bar。這個例子可用來核對零點偏移是否被正確保留;若有人錯寫成 raw10/16000,得到 7.5 bar,就代表把零點 4000 漏掉。

raw=4000 和 raw=20000 是兩個合法邊界,不應因等號判斷寫錯而變成無效。raw=3999 與 raw=20001 則進入越界分支。若規格採用 clamp,raw=3999 的顯示值可限制為 -1 bar,但狀態仍要是 ClampedLow;否則操作員會看到 -1 而誤以為感測器正好落在量程端點。

raw_raw 計算步驟 pressure_calc 狀態
4000 -1+(0×10/16000) -1 bar ValidLow
12000 -1+(8000×10/16000) 4 bar Valid
20000 -1+(16000×10/16000) 9 bar ValidHigh
0 -1+(-4000×10/16000) -3.5 bar OutOfRangeLow
22000 -1+(18000×10/16000) 10.25 bar OutOfRangeHigh

raw=0 的 -3.5 bar 是公式外推結果,不是量程內測量。若顯示政策是 clamp,輸出可成為 -1 bar,但必須同時保存 unclamped_value=-3.5 與 range_state=ClampedLow。驗收時要檢查兩個欄位,不能只看畫面上是否落在 -1 到 9。

對每筆資料保留 batch_id、sample_time、raw_raw、pressure_calc、pressure_display、range_state 和 formula_version。當結果不符時,先用 raw_raw 重算,再檢查版本和狀態;不要先修改公式常數再讓舊紀錄看起來合理。

驗收時可把公式拆成四個中間量:raw_delta、scaled_delta、eng_unclamped 和 display_value。例如 raw=12000 時依序是 8000、5、4 bar,再依顯示格式產生 4.0。把中間量寫入離線 CSV,能快速區分是輸入碼錯、跨度錯、負號錯,還是最後顯示格式錯。

三 反算與不可逆的夾限

反算公式由 E=-1+(raw-4000)*10/16000 移項得到 raw=4000+(E+1)*1600。E=4 bar 時,(E+1)*1600=8000,加上 4000 得 raw=12000。反算結果若要送回整數通道,先以較寬型別計算,再在最後一步依規格捨入或取整,並把原始工程值保留下來。

反算也有邊界規則。E=-1 對應 4000,E=9 對應 20000;E=-2 會算出 2400,E=10 會算出 21600,兩者都不是本量程內的工程設定。若先把 E 夾到 -1..9 再反算,結果會落在 4000 或 20000,但這個轉換不可逆,因為原本超界的數值已被捨去。

工程輸入 E 反算式 raw_result 處理與診斷
-1 4000+0×1600 4000 ValidLow
4 4000+5×1600 12000 Valid
9 4000+10×1600 20000 ValidHigh
-2 4000+(-1)×1600 2400 Reject 或 ClampLow
10 4000+11×1600 21600 Reject 或 ClampHigh

反算流程必須先判斷政策,再寫入輸出:Reject 表示不送出並回報範圍錯誤;Clamp 表示送出邊界值但留下原始 E 與夾限狀態。不能用同一個 output 欄位同時代表未處理工程值和實際送出的 raw,否則回讀時會誤以為轉換完全可逆。

驗收可採回算誤差檢查:對 Valid raw 先正算 E,再反算 raw_back,要求 raw_back 與 raw_raw 的差符合最後一次取整規則。對 Clamped 資料則驗收不可逆性被明確標記,不可要求 raw_back 等於原始超界值。

若工程值要供另一個模組反算,資料契約應傳送 eng_unclamped、range_state 和 formula_version,而不是只傳送畫面字串。接收端若只收到 clamp 後的 -1 或 9,無法知道原本是合法端點還是超界資料。這個欄位設計比增加更多小數位更能避免維護誤判。

四 捨入 夾限與故障排查

捨入只能放在最後一次。假設顯示需要 0.1 bar,先得到 pressure_calc=4.04,再產生 pressure_display=4.0;下一輪仍從 raw_raw 重算,而不是拿 4.0 反算成 raw 再繼續運算。若拿顯示值回算,4.04 變成 4.0 時已遺失 0.04;再次用相同刻度處理可能保持 4.0,並非必然每輪繼續漂移,但加入其他運算後可能累積誤差。

偏移重複套用是另一個常見錯誤。正算時已含 EngMin=-1,反算時只可使用 raw=RawMin+(E-EngMin)*(RawSpan/EngSpan),不能再額外減 1 或加一次 offset。遇到 raw=12000 被算成 3 bar,先列出每個中間量,確認 EngMin 是否被套用兩次。

症狀 先看欄位 可能原因 修正方向
raw=4000 卻非 -1 RawMin、EngMin 零點漏減或等號錯誤 重建命名常數與邊界測試
raw=12000 不是 4 RawSpan、EngSpan 分母或工程跨度錯 逐步列出中間量
超界顯示正常 range_state、unclamped 夾限後遺失狀態 分離顯示值與診斷值
反算後逐輪偏移 raw_raw、display 用捨入值回算 每輪從原始 raw 重算

故障報告至少附上公式版本、輸入 raw、未夾限 E、顯示 E、上下限、狀態和時間。若通訊值突然變成 0,不能直接把它視為量程低端;要先分辨 0 是有效 raw、逾時替代值、初始化值或無效碼。這些狀態在資料契約中應有不同標記。

實作前仍需核對目標語言的整數除法、REAL 轉換、捨入方向、溢位和 NaN/無效值行為。

建議用固定測試順序:先測有效邊界,再測中點,接著測低高各一筆越界,最後測缺值或通訊逾時。每一筆都要核對狀態轉換,不能只把五個數字放進公式。逾時資料應沿用通訊規格的 invalid 標記,不可用 0 代替而誤觸量程判斷。

五 驗收表 FAQ與來源

驗收時先建立 本篇測試表,再逐筆比對 raw、公式中間量、工程值、狀態與顯示值。正常值要檢查 12000→4 bar;邊界要檢查 4000→-1 與 20000→9;無效值要檢查 raw=0 的外推值被標示越界。反算則檢查 E=4→12000,並確認 clamp 後不宣稱可逆。

交付紀錄應保留 raw_raw,並把任何 rounding、clamp、reject 與公式版本寫入資料。這樣日後更換量程時,可以用舊 raw 重跑新版本,也能指出舊顯示值只是當時的表示結果。

FAQ1:為什麼 raw=0 不能直接當成 -1 bar?答:因為 0 低於 RawMin=4000,公式外推是 -3.5 bar;若顯示夾限為 -1,仍須保留越界狀態。

FAQ2:E=4 反算為多少 raw?答:4000+(4+1)×1600=12000。反算只使用一次零點與跨度,不再額外加減 offset。

FAQ3:可以先把工程值四捨五入再反算嗎?答:不建議。內部計算保留未捨入值,最後一次才產生顯示或輸出整數,並保留 raw 以避免累積誤差。

FAQ4:夾限後是否仍能保證反算回原值?答:不能。超界值被映射到邊界後資訊已遺失,必須以狀態和 unclamped_value 表示不可逆。

參考:NumPy interp 官方文件:單調樣本點的一維分段線性插值與邊界參數說明(僅作數學參考,非 PLC API)。

參考:NIST Dataplot Linear Interpolation:線性插值計算概念(僅作數學參考)。

延伸閱讀


使用 PLC 工具箱 →