← 所有文章

PLC 浮點數的容差比較

· 站長

分開數值表示誤差與製程公差,使用絕對及相對容差驗收浮點比較,處理近零及無效數值。

先定義多接近才算達到條件

監看畫面兩個值都顯示2.2,程式卻判斷不相等,常見原因是畫面只顯示有限小數,而記憶體中的浮點結果存在細微差異。你不能靠多看一次畫面決定誰正確,也不應把所有等號一律改成任意誤差。本篇教你把數值表示誤差、計算誤差與製程允許偏差分開,寫出有單位、有邊界且可驗收的比較規則。

浮點數不是所有十進位小數都能精確表示。兩條數學上等價的計算路徑,也可能因中間運算與捨入得到不同結果。CODESYS官方靜態分析說明以實數相等比較提醒這個問題。這不代表等號永遠沒有用途:同一個有限值直接複製後的比較,和不同感測資料各自經過運算後的比較,是不同情境。

誤差來源 你要確認的事 不可採用的捷徑
數值表示 使用REAL或LREAL及有效精度 以畫面小數位認定內部完全相同
計算過程 運算順序與中間型別 只因公式代數等價就假定位元相同
實際量測 解析度 不確定度與製程容許範圍 直接用電腦精度代替製程公差

以下案例只使用虛構溫度資料與離線比較結果,不連接加熱器。先寫下需求:目標25攝氏度,允許偏差0.05攝氏度,邊界包含在允許範圍內。這個容差是本文教學條件,不代表任何溫控設備都應採用相同設定。實際應由製程需求、量測能力及風險共同決定。

絕對容差適合有固定單位的允許範圍

先算差值的絕對值,再與絕對容差比較。本文規則為絕對值A減B小於或等於AbsTol時判定接近。A與B必須使用相同單位,AbsTol也使用相同單位;攝氏度不能直接與百分比相比。容差必須是有限且非負的數值,輸入與相減結果也需符合平台可表示範圍。

目標B 輸入A 數學上的差值絕對值 按0.05容差判定
25 25.049 0.049 接近
25 25.051 0.051 不接近
25 24.951 0.049 接近
25 24.949 0.051 不接近
25 25 0 接近

本表刻意在界線兩側留0.001的間距,方便初學者先檢查方向與單位。若測試正好25.05,十進位數學的差是0.05,但二進位浮點的實際表示可能使運算結果略在界線另一側。驗收時應同時記錄原始型別與較高精度值,並明確決定邊界的表示與捨入策略,不能只看兩位小數。

若資料本來就定義為千分之一度整數,目標25000、容差50,使用足夠範圍的整數做比較能直接描述這個離散格點的界線。這不是把任意量測值乘1000就一定完全準確;你仍須定義轉換時如何捨入與溢位。重點是選擇符合資料契約的表示法,而不是把容差當成補救所有錯誤的開關。

相對容差要注意近零與大量值

相對容差通常用於量級差異很大的數值。本文選擇以A與B絕對值的較大者作比例基準,門檻為RelTol乘這個基準,再取它與AbsTol的較大值。這只是其中一種清楚定義的對稱比較規則;若你以目標值B作分母,規則就不同,文件和測試表必須跟著修改。

A 與 B 絕對容差 相對門檻 本篇合併門檻與結果
0.001 與 0 0.01 0.0000001 0.01 接近
10000.5 與 10000 0.01 1.00005 1.00005 接近
10002 與 10000 0.01 1.0002 1.0002 不接近

本表RelTol為0.0001,也就是百分之0.01。接近零時,相對門檻會很小,因此使用絕對容差保留合理下限。量值變大時,相對門檻變大,但這未必符合製程需求。例如製程明定只能差0.05單位,10000.5與10000差0.5就必須失敗,不能因通用相對比較接受它而放行。

選絕對或相對規則以前,先問這個比較在做什麼。驗證兩套數值算法的計算結果,可以考慮相對誤差;判定壓力是否位於工藝窗口,通常應使用明確的工程上下限。不要用同一個全域Epsilon套遍溫度、時間、金額與位置,因為這些量的單位、量級及容許誤差都不同。

無效數值與狀態切換必須另行處理

比較前先檢查資料品質、有限值及設定合法性。遇到NaN或無限大,回傳無效原因,不要因一般比較結果為假就直接當作超差,也不要把資料改為零而得到假合格。各PLC與編譯器的有限值檢查語法不同,應查目標平台文件;本文不提供未經核對的廠牌專用檢查指令。

容差比較本身也不會消除門檻附近的狀態抖動。若輸入在25.049與25.051間變化,0.05容差會讓判定交替成立與不成立,這是規則的正常結果。需要穩定的到位狀態時,可另設進入與離開門檻或持續時間,但要把新的狀態規則寫清楚,不能把容差和遲滯混成同一個數字。

例如在虛擬示範中,偏差不大於0.04才進入接近狀態,大於0.06才離開,兩者之間維持既有狀態。初始狀態要明定為未接近;無效資料發生時要清除或標示狀態無效。這是一種額外的狀態設計,不等同前面單次0.05比較,驗收表必須分開,才能知道差異是預期還是錯誤。

測試還要包含非常大的有限輸入。即使A與B各自有限,相減仍可能超出所用型別範圍。工程量先依合法範圍驗證,可避免在不合理數字上繼續做運算。改用較寬型別可以擴大可表示範圍,但不能取代品質檢查,也不保證所有演算法自動變得穩定。

操作後的驗收與排查

建立只操作虛擬變數的測試頁,列出A、B、AbsTol、RelTol、採用門檻、差值、Valid及Close。先跑絕對容差表,再另跑相對容差表。每列都先重置為已知狀態,對比手算結果;若加入遲滯測試,則改用連續輸入序列,明確保留前一狀態,不能混用兩種測試方式。

完成後應看到什麼結果

第一張數值表的0.049應接近、0.051應不接近;正負偏差應得到相同結果。合併容差案例中,10000.5與10000會被接受,但固定0.05製程公差應拒絕它。無效輸入與負容差應得到無效狀態。你應能說明每個結果來自哪個規則,而不是只記住一段公式。

失敗時先查哪裡

先看單位及倍率是否相同,再看實際型別與轉型位置。若只有邊界不一致,檢查小於或小於等於、十進位捨入與畫面格式。若大數值容易誤判,查相對門檻是否過大與中間值範圍。若狀態反覆切換,記錄連續偏差,確認是否需要額外遲滯,不能擅自放寬產品公差。

常見問題與適用型號

一、浮點數完全不能用等號嗎?不是,是否適合取決於資料如何產生及需求。二、容差越大越可靠嗎?不會,可能放行不合格資料。三、顯示都是25.00為何結果不同?顯示格式可能隱藏內部差異。四、改成LREAL就不用容差嗎?仍需按問題定義比較規則。本篇適用數值比較設計;CODESYS官方來源只支援對浮點比較風險的說明,移植至三菱Q系列或其他平台仍需核對實際型別與函式。

參考:CODESYS 浮點相等比較檢查

延伸閱讀


使用 PLC 工具箱 →