Modbus 功能碼與暫存器記憶體映射完全指南:FC01~FC16 讀寫與 0X/1X/3X/4X 定址解析

一、Modbus 四大記憶體區塊分區模型
Modbus 協定將設備內部的數據結構抽象化為四大獨立的記憶體區域(Memory Mapping)。理解這四大分區是編寫 PLC 通訊程式與設備對接的基礎。
- 0X 線圈 (Coils):可讀、可寫的 1-Bit 開關量。傳統 PLC 位址
00001~09999,常用於控制繼電器、馬達啟停或警報燈號。 - 1X 離散輸入 (Discrete Inputs):只讀的 1-Bit 開關量。傳統 PLC 位址
10001~19999,用於讀取極限開關、光電感測器狀態。 - 3X 輸入暫存器 (Input Registers):只讀的 16-Bit 字元量。傳統 PLC 位址
30001~39999,用於讀取感測器即時數值(如即時溫度、壓力、電壓)。 - 4X 保持暫存器 (Holding Registers):可讀、可寫的 16-Bit 字元量。傳統 PLC 位址
40001~49999,用於設定 PID 參數、目標溫度與設備組態。
二、常用功能碼 (Function Codes, FC) 讀寫邏輯
功能碼(Function Code)在 Modbus 封包中佔用 1 個 Byte,告知從站欲發起的運作指令:
FC 01 (0x01) : 讀取線圈 (Read Coils)FC 02 (0x02) : 讀取離散輸入 (Read Discrete Inputs)FC 03 (0x03) : 讀取保持暫存器 (Read Holding Registers) - 最常用!FC 04 (0x04) : 讀取輸入暫存器 (Read Input Registers)FC 05 (0x05) : 寫入單一線圈 (Write Single Coil)FC 06 (0x06) : 寫入單一暫存器 (Write Single Register)FC 15 (0x0F) : 寫入多個線圈 (Write Multiple Coils)FC 16 (0x10) : 寫入多個暫存器 (Write Multiple Registers)

三、Modbus 暫存器區塊與功能碼對照表
下表整理 Modbus 四大區域長度與功能碼對照:
| 記憶體區域 | 數據長度 | 存取權限 | PLC 傳統位址 | 讀取功能碼 | 寫入功能碼 |
|---|---|---|---|---|---|
| 0X 線圈 | 1-Bit | 可讀可寫 (R/W) | 00001 ~ 09999 | FC 01 (0x01) | FC 05 (0x05) / FC 15 (0x0F) |
| 1X 離散輸入 | 1-Bit | 只讀 (Read-Only) | 10001 ~ 19999 | FC 02 (0x02) | 無 (只讀) |
| 3X 輸入暫存器 | 16-Bit | 只讀 (Read-Only) | 30001 ~ 39999 | FC 04 (0x04) | 無 (只讀) |
| 4X 保持暫存器 | 16-Bit | 可讀可寫 (R/W) | 40001 ~ 49999 | FC 03 (0x03) | FC 06 (0x06) / FC 16 (0x10) |
四、異常碼回應機制 (Exception Codes 0x81~0x86)
當 Master 發送無效請求時,Slave 會回傳最高位置 1 的異常功能碼(原功能碼 + 0x80):
0x83異常回應:代表原功能碼0x03執行出錯。- 常見 Exception Code 代碼:
01 (ILLEGAL FUNCTION):從站韌體不支援該功能碼。02 (ILLEGAL DATA ADDRESS):請求的暫存器位址超出設備支援範圍。03 (ILLEGAL DATA VALUE):寫入數值超出範圍或長度錯誤。04 (SLAVE DEVICE FAILURE):從站內部硬體發生未預期故障。

五、32-Bit 浮點數 (Float) 與 Byte Swap 順序處理 SOP
Modbus 原生暫存器為 16-Bit (2 Bytes)。當需傳輸 32-Bit 浮點數(IEEE 754 Float)時,必須佔用 2 個連續暫存器。
不同廠商的 PLC 與儀表大端/小端(Big-Endian / Little-Endian)排列順序不同:
- AB CD:Big-Endian (高位在先)
- CD AB:Little-Endian Byte Swap (低 Word 在先)
- BA DC:Big-Endian Byte Swap
- DC BA:Little-Endian (低位在先)
對接 SOP:若讀取到的浮點數顯示為 NaN 或巨大異常數值,代表 Byte Swap 順序不匹配。請在軟體中切換 Word/Byte 顛倒選項即可恢復正常。