← 所有文章

HEX 十進位與二補數判讀

· 站長

從 HEX、十進位與 16 位元二補數理解有號無號、資料寬度、符號延伸與溢位,附完整算例。

先分清楚寫法與解讀方式

FFFFH 先描述 16 個位元全部為 1。把它當成 16 位元無號整數時是 65535,當成 16 位元有號二補數時是 −1。改變監看格式並沒有改變 PLC 裡的位元,改變的是你如何解讀它。

項目 它決定什麼 範例
進位 數字怎麼寫 十進位 255=十六進位 FF
資料寬度 總共有幾個 bits 8、16、32 bits
有號或無號 最高位元如何參與數值解讀 16 位元 FFFF:−1 或 65535
資料型態 整組位元代表什麼 整數、Float32、狀態旗標

先把每一位 HEX 看成四個 bits

十六進位使用 0–9、A–F;A=10,F=15。一位 HEX 對應 4 bits,兩位是 1 byte,四位是 16 bits。本篇用 H 或 0x 標示十六進位,兩種寫法都要先確認工具是否接受。

00FDH=15 × 16+13=253
1234H=1 × 4096+2 × 256+3 × 16+4=4660

進位轉換工具若要求純 HEX,就輸入 00FD;若要求 0x 前綴,就輸入 0x00FD。不要把十進位字串 253 輸入 HEX 欄後,還期待得到十進位 253。

親手算一次 16 位元二補數

16 位元有號二補數的範圍是 −32768 至 32767。先把位元當作無號整數 U;若 U 小於 32768,有號值就是 U;若 U 大於或等於 32768,就減掉 65536。

U < 32768 時,S=U
U ≥ 32768 時,S=U − 65536
16 位元 HEX 無號 U 有號 S
0000 0 0
00FF 255 255
7FFF 32767 32767
8000 32768 −32768
FFF6 65526 −10
FFFF 65535 −1

由負十算回位元樣式

先寫出正十 000AH,反相得到 FFF5H,再加一得到 FFF6H。也可以計算 65536−10=65526,再轉 HEX,得到同一結果。運算必須限制在 16 bits 的寬度內。

不要把所有最高位為一的值都當成負數

FFFFH 若是狀態字,可能表示 16 個旗標皆為 1;若是 UInt16 計數器,就是 65535;若手冊保留它當錯誤碼,就要依錯誤碼處理。二補數只有在資料型態明確為有號整數時才套用。

資料寬度與轉型常見陷阱

位元樣式與寬度 無號解讀 有號解讀
FF,8 bits 255 −1
00FF,16 bits 255 255
FFFF,16 bits 65535 −1
0000FFFF,32 bits 65535 65535
FFFFFFFF,32 bits 4294967295 −1

把 16 位元有號的 −1 擴成 32 位元有號,需要符號延伸,結果是 FFFFFFFFH。若只是把 FFFFH 放到較低 16 bits、較高 16 bits 填 0,結果是 0000FFFFH,也就是 65535。請分清楚「保留數值的型態轉換」與「複製位元」。

溢位不能靠切換監看格式修好

16 位元有號最大值 32767 再加 1,已超出型態可表示範圍。若某個運算採低 16 bits 回繞,位元會變成 8000H,監看就可能看到 −32768;實際 PLC 指令的溢位旗標與處理方式必須查該指令規格。

兩個暫存器還要核對 word 順序

假設手冊定義高 word 在前,收到 1234H、5678H,組成 12345678H。若定義低 word 在前,同樣兩個 words 則要組成 56781234H。每個暫存器內的 byte 順序與跨暫存器的 word 順序是兩件事。

Float32 的 41C80000H 表示 25.0。把這串 HEX 轉成十進位整數 1103626240,只完成整數進位轉換,還沒有做浮點解碼。

照這個順序使用轉換工具

  1. 先從手冊取得型態與寬度,例如 Int16、UInt16 或 Float32。

  2. 原始值以 HEX 保存,補足應有位數;16 bits 用四位,32 bits 用八位。

  3. 輸入正確進位並指定寬度,分別觀察有號與無號結果。

  4. 確認工具的轉換種類:進位轉換、數值轉型、位元重新解讀,三者不要混用。

  5. 最後才套用倍率、單位及顯示小數位。

練習題 答案
FF9CH,以 Int16 解讀 65436−65536=−100
FF9CH,以 UInt16 解讀 65436
00FFH,以 Int16 解讀 255
FFFFFFFFH,以 Int32 解讀 −1
FFF6H,以 Int16 且單位 0.1 °C −1.0 °C

驗收時留下這四項

原始 HEX、資料寬度、解讀型態、換算後數值。若兩套軟體顯示不同,先比較這四項是否一致,再查是不是資料真的改變。

參考資料與下一步

參考:Microsoft C# 整數型態 有號與無號範圍

參考:Modbus 官方規格 4.2 資料編碼

型態名稱用於說明數值表示,不代表任何特定 PLC 指令語法。需要處理 253 轉 25.3 °C 或 Float32 的差別時,接著閱讀設備倍率與 Float32 判讀

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

完成後應看到什麼結果

同一組 16 位元 FFFFH,在 UInt16 監看應為 65535,在 Int16 監看應為 −1;切換顯示格式後,原始 HEX 應維持 FFFF。FFF6H 以 Int16 解讀應為 −10,FF9CH 應為 −100。

將 16 位元的 −1 保留數值轉成 32 位元有號整數後,應得到 FFFFFFFFH;若高 16 bits 填零,0000FFFFH 的 32 位元整數值則為 65535。你應能說明兩者做的是哪一種轉換。

失敗時先查哪裡

  1. 先看工具輸入欄是 HEX 還是十進位,再確認是否需要 0x 前綴。

  2. 再看寬度與型態:FF、00FF、FFFF 在不同寬度下不能只靠外觀判斷正負。

  3. 位元一致但顯示不同:查有號/無號與浮點解碼方式;位元已改變:查資料來源、轉型與運算溢位。

適用型號與限制

適用於以二補數表示的 8、16、32 位元整數,以及 PLC、HMI 或通訊工具中的 HEX 判讀。Q06UDVCPU 專案監看可使用這些數值觀念,但實際指令支援型態、雙字儲存方式與溢位處理仍依三菱指令手冊。

本篇不是通用 PLC 指令語法表。BCD、ASCII、狀態旗標、Float32 與廠商保留碼不能一律套用有號整數公式。QJ71C24N 收到的資料也要依從站資料定義解讀,通訊完成不會替你決定資料意義。

搭配使用的工具

系列延伸閱讀


使用 PLC 工具箱 →