唯讀型記憶體-讀取指令(04)

大數字 讀寫不同格式(float32/ int64)會有1/10k 以下的差異。

一次最多40 個register 長度。超過該長度的指令會被忽略。

唯讀型記憶體-讀取指令(04)

用途: 此記憶體區域專門用於儲存設備的即時狀態、測量結果和流量狀態相關的記憶體。

特性: 數據具有唯讀特性,只能通過讀取指令獲取數值,無法通過寫入指令進行修改。

控制端發指令(04)格式

Modbus RTU 讀取唯讀型記憶體讀取指令 (04) 範例

以唯讀型記憶體讀取指令(04)為例,說明在累積流量為 20000.5 公升時,應如何發送指令並將回傳的資料解析為十進位數值。

主站發送讀取指令 (TX 訊框)

根據設備規格,累積流量採 Float32 格式,佔用 2 個暫存器 (4 Bytes) 。主站需發送 Modbus 功能碼 04(讀取輸入暫存器),以讀取從位址 0000 開始的 2 個暫存器數據。

TX 請求指令: 01 04 00 00 00 02 71 CB
  • Slave Address = 01

  • Function Code = 04

  • 起始暫存器位址 = 00 00

  • 讀取數量 = 00 02 (2 個暫存器)

  • CRC 校驗碼 = 71 CB

從站回覆數據 (RX 訊框)

從站收到讀取請求後,將內部儲存的 20000.5 升(Float32)數據,依 Big Endian 順序,封裝為 4 個位元組回傳。

  • Slave Address = 01

  • Function Code = 04

  • 回傳位元數 = 04 (4 Bytes)

  • 數據位元組 = 45 9C 40 00

  • CRC 校驗碼 = E2 56

數據解析與轉換 (轉回十進制)

步驟 A:排列數據

由於設定為 大端模式 (Big Endian),資料的最高位元組放在最前面,因此 4 個位元組的順序就是收到的順序:

459C4000 ₁₆

步驟 B:拆解 Float32 結構 (SEM: S-符號位, E-指數位, M-尾數位)

將 459C4000 ₁₆ 轉換為32位二進位制

部分

二進制數值

位元數

說明

S (符號位)

0

1 bit

0=正數

E (指數位)

10001011

8 bits

139₁₀。 實際指數:

139 - 127 (Float 32 偏移量) = 12

M (尾數位)

001110001...

23 bits

有效數字 1.M

步驟 C:計算數值

根據 IEEE 754 公式:

• 指數位:E = 10001011 轉換為10 進位制

在 IEEE 754 Float32 標準中,指數位採用偏移表示法表示正指數和負指數,標準規定的偏移量 (Bias) 是 127,因此實際指數是 139 - 127 = 12

• 尾數部分:M=0011100100000000000000

有效數字 1.M:1.001110001 (後面的零可以忽略)

• 得根據 IEEE754 浮點數數值表示為

(1)0×1.001110001×212(-1)⁰ × 1.001110001 × 2¹²

將小數點向右移動 12 位:

• 將這個二進制數轉換回十進制:

得請求累積流量,RX 回覆數據: 01 04 04 45 9C 40 00 E2 56 值為 20000.5 升

Last updated