← 所有文章

設備倍率與 Float32 判讀

· 站長

分清整數倍率與 IEEE 754 Float32,正確解讀有號值、word 順序、小數與反向寫入,避免 PLC 與 HMI 重複縮放。

先看型態再決定要不要除以十

設備回傳 253,只有在手冊明確指定「每個計數代表 0.1 °C」時,才能換成 25.3 °C。先查資料型態、單位、倍率與偏移,再決定計算方式。看到小數需求,不代表資料一定使用 Float32。

手冊說明 原始資料例 處理方式
Int16,單位 0.1 °C 253 253 × 0.1=25.3 °C
UInt16,單位 1 rpm 253 253 rpm
Float32,單位 °C 位元樣式 41CA6666H 解碼後約 25.3 °C
計數值需依上下限縮放 253 counts 使用手冊原始值與工程上下限

先定義你口中的原始值

串列封包的 bytes、PLC 暫存器裡的 words,以及已解碼的整數都可能被叫成原始值。記錄時請明確寫「HEX 00FD」「Int16 253」或「工程值 25.3 °C」,避免不同處理階段拿來直接比較。

本篇將整數加固定倍率稱為整數定點表示。倍率可以是 0.1、0.01 或其他數值;也可能另有偏移。Float32 則有自己的浮點編碼,需要先解碼位元樣式。

一般換算式:工程值=解碼數值 × 倍率+偏移

整數倍率先解讀正負號再計算

假設手冊指定 Int16、每計數 0.1 °C、沒有額外偏移。先把 16 位元二補數解成有號整數,再乘 0.1。

16 位元 HEX Int16 數值 乘以 0.1 後
0000 0 0.0 °C
00FD 253 25.3 °C
FF83 −125 −12.5 °C
FFF6 −10 −1.0 °C

FF83H 的無號值為 65411,減 65536 得到 −125。若先把它當成無號再除以 10,就會錯成 6541.1。

避免整數除法先把小數丟掉

253÷10 若使用整數除法,可能得到 25。你可以在除法前轉為適合的浮點型態,或保留整數 253,再由顯示端依 0.1 的單位呈現。選定後要記錄資料單位,不要 PLC 已除以 10,HMI 又除一次。

寫入時用反向換算

寫入整數=(目標工程值 − 偏移) ÷ 倍率

同樣條件下,欲設定 30.5 °C,應編碼為 305。若目標是 30.55 °C,原始整數無法精確表示,必須依設備規則決定四捨五入、截斷或拒絕。先檢查寫入允許範圍、權限及特殊碼,再編碼並讀回確認。

允許的整數範圍不等於製程可允許的範圍。即使 Int16 放得下 305,也要確認 30.5 °C 是設備允許的設定值。

Float32 要還原完整的位元樣式

Float32 通常占用兩個 16 位元暫存器。這兩個 words 要依設備手冊排列,再把 32 bits 依 IEEE 754 解碼。不要把兩個 words 分別當成兩筆溫度。

已知工程值 Float32 HEX 假設高 word 在前
25.0 41C80000 41C8、0000
25.3 附近 41CA6666 41CA、6666
−12.5 C1480000 C148、0000

41CA6666H 解碼後約為 25.299999237,顯示到小數一位就是 25.3。這是有限位元的表示誤差,不代表量測本身精確到那麼多位。顯示小數位應配合感測精度與使用需求。

數值轉型與位元解碼不同

若把 41C80000H 當成無號整數,你得到 1103626240。再將這個整數轉成浮點數,得到的仍是十億多,不會成為 25.0。要取得 25.0,必須對同一組 32 bits 使用 Float32 解碼。

遇到非正常資料先查有效狀態

Float32 可能有 NaN 或無限大等特殊值,設備也可能另有品質旗標或保留碼。不要直接拿這些值做控制比較或顯示成零。依手冊判定有效後才更新工程值,並保留本次時間與品質狀態。

32 位元 word 順序依設備與通訊庫設定確認。即使一次讀兩個暫存器,也要確認設備對跨 word 資料的一致性規則。

建立一條不會重複換算的資料流程

  1. 保留接收 HEX 與原始暫存器值,方便查對。

  2. 依手冊完成 word 順序、有號/無號或 Float32 解碼。

  3. 先排除無效值與通訊失效,再套手冊指定的倍率與偏移。

  4. 把工程值、單位、更新時間與有效狀態交給 HMI。

  5. 用兩個以上已知測試點與設備面板核對,確認縮放只做一次。

工具用途 你應該填什麼
進位轉換 原始 HEX 與資料寬度
有號整數解讀 16 或 32 bits,以及正確型態
Float32 解碼 完整 8 位 HEX 及設備 word 順序
倍率換算 解碼數值、倍率、偏移與單位

練習與答案

練習一:UInt16=1234,單位 0.01 bar。答案 12.34 bar。練習二:Int16 位元 FF83H,單位 0.1 °C。答案 −12.5 °C。練習三:高 word 在前的 41C8H、0000H,Float32 且單位 °C。答案 25.0 °C,不再除以 10。

練習四:PLC 工程值已是 25.3,HMI 又設定倍率 0.1,畫面成為 2.53。修正重複縮放,並在資料欄位註明「已換算 °C」。

參考資料

參考:Microsoft 浮點型態 精度與表示限制

參考:Modbus 官方規格 4.2 編碼及暫存器資料

參考:Schneider Modbus Data Formats 32 位元與 word 排列

本篇是解碼與計算教學。具體暫存器位址、倍率、無效碼與寫入限制,以目標設備對應版本的通訊資料表為準。

操作完成後的確認與適用範圍

完成後應看到什麼結果

Int16 的 253、單位 0.1 °C,應顯示 25.3 °C;FF83H 先解為 −125,再換成 −12.5 °C。若資料是 Float32 高 word 在前,41C8H、0000H 應顯示 25.0 °C,不再套用整數範例的除以十。

從接收資料到 HMI,每個欄位都應標明它是原始值還是工程值。以 30.5 °C 的整數定點寫入例,編碼應為 305;設備允許寫入且接受後,讀回應依相同規則得到 30.5 °C。

失敗時先查哪裡

  1. 剛好差 10 倍或 100 倍:先查手冊倍率,以及 PLC、HMI 是否都做了一次縮放。

  2. 負值變成很大的正值:先查有號/無號;只有小數不見:查整數除法與顯示位數。

  3. 浮點值極大、極小或不合理:保留完整 HEX,查兩個 words 的順序、位元解碼方式與設備無效碼。

適用型號與限制

適用於手冊明確定義整數倍率或 IEEE 754 Float32 的設備資料。Q06UDVCPU、HMI 或電腦皆可作為換算端;QJ71C24N 只負責相關通訊功能,倍率與型態由從站資料表決定。

未指定從站型號,不能推定 253 一定是溫度或一定乘 0.1。Float64、BCD、ASCII、動態倍率與非線性量測需另訂解碼方式;兩個暫存器也可能是整數或兩筆獨立資料,不能只按數量猜成 Float32。

搭配使用的工具

系列延伸閱讀


使用 PLC 工具箱 →