先看型態再決定要不要除以十
設備回傳 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 資料的一致性規則。
建立一條不會重複換算的資料流程
保留接收 HEX 與原始暫存器值,方便查對。
依手冊完成 word 順序、有號/無號或 Float32 解碼。
先排除無效值與通訊失效,再套手冊指定的倍率與偏移。
把工程值、單位、更新時間與有效狀態交給 HMI。
用兩個以上已知測試點與設備面板核對,確認縮放只做一次。
| 工具用途 | 你應該填什麼 |
|---|---|
| 進位轉換 | 原始 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」。
參考資料
參考: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。
失敗時先查哪裡
剛好差 10 倍或 100 倍:先查手冊倍率,以及 PLC、HMI 是否都做了一次縮放。
負值變成很大的正值:先查有號/無號;只有小數不見:查整數除法與顯示位數。
浮點值極大、極小或不合理:保留完整 HEX,查兩個 words 的順序、位元解碼方式與設備無效碼。
適用型號與限制
適用於手冊明確定義整數倍率或 IEEE 754 Float32 的設備資料。Q06UDVCPU、HMI 或電腦皆可作為換算端;QJ71C24N 只負責相關通訊功能,倍率與型態由從站資料表決定。
未指定從站型號,不能推定 253 一定是溫度或一定乘 0.1。Float64、BCD、ASCII、動態倍率與非線性量測需另訂解碼方式;兩個暫存器也可能是整數或兩筆獨立資料,不能只按數量猜成 Float32。