先把三種 看起來不對 分開
數值欄位顯示異常時,先保存原始值、工程單位、格式設定與畫面截圖,再判斷是版面裁切、數值溢位或精度損失。三者的修法不同;若一開始就把字串縮短,後續無法證明設備到底送了多少。本文以一般HMI顯示層為例,不假定特定廠牌的標籤、診斷位或API。 驗收時把來源值和畫面字串並排並保存時間戳,才能區分資料流與排版。
版面裁切是容器寬度、字體或單位欄不足,數值本身仍可表示。例如欄位寬度只能放四位,9999尚能看見,10000卻被裁成1000或只剩省略號;這不是把10000寫回PLC的理由。應改用自適應寬度、縮小字體、換行單位或另開詳細值,並讓截斷狀態可見。 若詳細視圖也只有1000,才查解析與型別;若是10000,主欄才是呈現問題。
數值溢位發生在解析、暫存或轉型的可表示範圍之外。以有號INT16為例,合法範圍是−32768至32767;32768不是可接受的原始值。若某層先回捲成−32768,顯示層不得把回捲結果當成真值,必須保留原始輸入並標示OVR或RangeError。 狀態名稱要讓維修人員看懂並附原始原因。
精度損失則是值仍在範圍內,但格式化、縮放或捨入丟掉資訊。12.30°C與12.3°C數值相等,卻可能代表不同的顯示契約;若欄位要求兩位小數,就固定顯示12.30並另存未格式化值。驗收表要同時記錄原值、轉換後值、顯示字串與狀態。 離線資料不能推論廠牌內建警報名稱。
| 現象 | 先查什麼 | 可接受結果 |
|---|---|---|
| 只少最右字元 | 容器寬度與字體 | 完整值或明確省略,不改原值 |
| 變成負數/最大值 | 目標型別與範圍 | OVR/RangeError,不使用回捲值 |
| 小數位變少 | 格式與捨入規則 | 原始值保留,顯示精度有契約 |
以邊界輸入建立可重現測試
先建立測試資料表,不要只拿正常值拍照。對十進位輸入9999,若顯示欄位和儲存型別都能容納,下一筆10000必須仍顯示10000;若欄位只能四位,本例把OVR保留給數值超界,版面不足則顯示完整值的替代視圖或明確的LayoutOverflow,不能混用。 把邊界值分別放在來源字串、工程值及顯示值三欄,測試人員便能定位是哪一次轉換改變結果。
對有號INT16測試32767、32768、−1000與−32768。32767應正常;32768在轉成INT16前就拒絕,不能先截低16位;−1000與−32768應正常,並保留負號。若輸入框先收字串,先做語法與範圍驗證,再轉型;不要讓溢位的暫存整數參與畫面或控制計算。 負號是資料的一部分,寬度計算必須把負號與小數點納入,不能只按數字位數估算。
若工程值來自raw乘倍率,測試原始值與工程值分開。例如raw=10000、倍率0.1可得到1000.0,但顯示欄位若只允許三位整數,應標示版面不足或使用完整且明確的科學記號,不得把1000.0截成000。倍率、單位、上下限與小數位要以同一版本設定送入驗收紀錄。 32768的拒絕要在任何回捲、縮放與回寫之前發生,否則後續紀錄已失去證據。
每個案例要記錄輸入時間、來源、解析結果、狀態及畫面。測試人員可用模擬資料或離線回放,不必在運轉設備上故意寫入32768。驗收通過的條件是:合法值保持數值與符號,非法值沒有進入運算,且操作員能從OVR、LayoutOverflow或PrecisionReduced辨識處理層。 驗收表也應記錄測試資料是否來自模擬器,避免把離線注入誤報成現場故障。
| 輸入 | 型別判定 | 畫面與狀態 |
|---|---|---|
| 9999 | 合法 | 顯示9999;寬度不足另示LayoutOverflow |
| 10000 | 合法但需五位 | 完整顯示或明確版面錯誤,不顯示1000冒充 |
| 32767 | INT16上界合法 | 正常顯示 |
| 32768 | 超出INT16 | 拒絕並顯示OVR/RangeError |
| −1000 | 合法負值 | 保留負號與單位 |
版面 格式與診斷要各自驗收
版面測試要改變容器寬度、字體大小與單位長度,觀察同一原始值是否仍可從詳細檢視取得。9999→10000是最小邊界;再用−1000確認負號不被裁去。若主畫面只能放短字串,短字串必須是刻意的摘要,旁邊要有可查原值的入口,不能靜默移除最後一位。 字體替換可能改變每個字元寬度,因此同一欄在不同終端都要測9999與10000,不能只用設計工具預覽。
格式化測試要明訂小數位與捨入。精確十進位12.345若規格是兩位小數,可按半值遠離零得到12.35;若底層使用二進位浮點,先核對實際值與格式化規則,不能假定它剛好落在半值;若是截斷,則為12.34。兩者都不能叫作原始值。對溫度或壓力顯示,單位符號必須與數字同時變更;25.3°C不得在切換後只留下25.3而讓人誤認為°F。 版面狀態與數值狀態分離後,操作員可以先處理畫面配置,再追查真正的資料超界。
診斷資料至少要有raw_text或raw_value、parsed_value、display_text、status、reason與timestamp。發生32768時,parsed_value可以是空值,status=OVR,reason=INT16_RANGE;不能把−32768寫入parsed_value再宣稱處理成功。若只是欄位太窄,status應是版面狀態,不能冒充設備溢位。 小數捨入應在最後一個顯示邊界做一次,重複縮放和捨入會造成累積偏差。
把三種故障分別注入後再清除:先送10000確認完整值,縮窄欄位只改版面;再送32768確認值被拒絕,恢復32767後狀態清除;最後把12.345套用兩位格式確認顯示12.35而原始仍是12.345。每次都核對事件紀錄,避免畫面恢復正常卻留下無法解釋的舊警報。 若規格沒有定義捨入方向,驗收前先把它列為未決,不可自行選一種再宣稱一致。
| 驗收步驟 | 預期證據 |
|---|---|
| 縮欄後顯示10000 | 詳細視圖仍有10000,標記版面不足 |
| 送32768 | 無控制計算,OVR/RangeError含時間 |
| 送12.345 | 依規則顯示,raw仍可追溯 |
| 恢復32767 | 正常狀態與值同時恢復 |
避免把顯示補丁變成假值
常見錯誤是用字串切片把10000取前四字、用整數轉換的回捲結果繼續控制,或用固定「9999+」掩蓋超界。這些做法讓操作員看到一個看似合法的數字,卻失去原始值與原因。顯示層可以提供摘要,但摘要必須帶狀態並能回到完整資料。 看到OVR應能追到輸入值、型別、上下限與時間,否則只是提示。
若資料流經多層,逐層寫出契約:來源數值的型別與範圍、縮放公式、允許的小數位、顯示寬度、失敗狀態。每層都不得把Unknown當零。對−1000這種合法負值,範圍檢查通過後才格式化;對32768,應在目標型別轉換前結束流程。 改成空白或零會讓趨勢圖產生假資料。
效能與可讀性可用兩個欄位解決:主欄顯示工程值,診斷欄顯示原值與狀態;大數則採明確的千分位或科學記號。格式化規則要固定文化設定,避免1,000在不同locale被當成小數或語法錯誤。這屬顯示契約,不代表底層PLC一定採同一格式。 回放應涵蓋恢復前後兩筆,確認清除不抹掉舊稽核紀錄。
最後做回放驗收,依9999、10000、−1000、32767、32768及小數邊界逐筆比較紀錄。通過的證據不是「畫面看起來正常」,而是合法值可回讀、非法值被拒、狀態可區分、版面改變不會改寫來源。沒有實機或特定HMI文件時,只能宣稱此通用流程已檢查,不能宣稱某型號支援。 告警應讀狀態欄,不要比對顯示字串。
| 不要做 | 改用 |
|---|---|
| 截斷10000為1000 | 完整值/版面狀態/詳細視圖 |
| INT16回捲後繼續運算 | 轉型前拒絕並保留原始輸入 |
| 把空值或OVR顯示0 | 顯示Unknown或OVR並記原因 |
FAQ與來源
FAQ1:欄位顯示1000,但來源可能是10000,算溢位嗎?答:先查來源、解析與儲存型別;若型別能存10000而只有畫面少一位,是版面裁切。只有在數值層無法表示並被拒絕時才用OVR,不能用截短字串推論。 回答問題時要指出是哪一層處理,避免把版面建議誤當成型別修正。
FAQ2:32768轉成INT16得到−32768,可以照常顯示嗎?答:不可以。那是回捲或轉型副作用,不是合法輸入;應在轉型前判斷32768超出−32768至32767,保留原始資料並回報RangeError。 FAQ中的數字沿用前文測試契約,若產品另有範圍必須重新查證。
FAQ3:12.345顯示12.35是否代表資料被改成12.35?答:不一定。若只是兩位小數格式化,原始值仍應保存12.345並記錄捨入規則;若回寫也改成12.35,則必須另有明確的資料變更紀錄。 來源只支援通用版面與數字格式概念,不能替特定PLC宣稱支援某資料型別。
FAQ4:要不要固定顯示9999+來節省寬度?答:只有規格明確把它定義成摘要,且能查看完整值與狀態才可;它不能取代原始值,也不能掩蓋10000與32768的不同原因。 交付前再次核對原始值、狀態與顯示字串三者沒有互相矛盾。
參考:W3C CSS Overflow Module Level 3:用於理解容器溢出、裁切與可見內容的版面概念,不是PLC或HMI API。
參考:Unicode TR35 Numbers:說明數字格式、locale與小數顯示契約;實際HMI格式仍須查目標產品文件。