Modbus Register Types — Coils, Discrete Inputs, Input Registers, and Holding Registers
Key Takeaway
The four Modbus register types: coils (1-bit R/W), discrete inputs (1-bit RO), input registers (16-bit RO), and holding registers (16-bit R/W) with address ranges and function codes.
Quick Answer
Modbus organizes data into four separate address spaces: coils (1-bit read/write), discrete inputs (1-bit read-only), input registers (16-bit read-only), and holding registers (16-bit read/write). Each has its own address range and function codes.
Register Type Reference
| Table | Address Range | Width | Access | Read FC | Write FC |
|---|---|---|---|---|---|
| Coils | 00001-09999 | 1 bit | R/W | FC01 | FC05, FC15 |
| Discrete Inputs | 10001-19999 | 1 bit | RO | FC02 | — |
| Input Registers | 30001-39999 | 16-bit | RO | FC04 | — |
| Holding Registers | 40001-49999 | 16-bit | R/W | FC03 | FC06, FC16 |
Address Confusion: 0-Based vs 1-Based
The Modbus protocol uses 0-based addressing in the data frame — register 0 in the request corresponds to address 40001 in documentation. Device manuals use 1-based addressing. SCADA tools let you configure which convention they use. Always verify which convention a register map uses.
Why Many Devices Use Only Holding Registers
For simplicity, many manufacturers map all data (including read-only sensor values) into the holding register space, using FC03 for all reads. This eliminates the need for separate FC04 access but deviates from the original Modbus data model.
Frequently Asked Questions
Input registers (3xxxx, FC04) are read-only for sensor readings. Holding registers (4xxxx, FC03/06/16) are read/write for configuration and setpoints.
The protocol uses 0-based addressing in frames. Documentation uses 1-based (40001). Most tools let you configure which convention to use.