Both are tables of 16-bit registers. Both are read with an address and a quantity. The difference is intent and access.
| Holding register | Input register | |
|---|---|---|
| Read function code | FC03 | FC04 |
| Writable | Yes (FC06, FC16) | No |
| Reference style | 4xxxx | 3xxxx |
| Typical content | Setpoints, configuration, and often measurements too | Measurements and status |
Why the distinction is weaker than it looks
The standard describes input registers as read-only data from the process and holding registers as read/write. In practice many devices put everything in holding registers, because a single table is simpler to implement and clients only need one function code.
The result is that you cannot infer the table from the kind of value. A power meter may expose voltage at holding register 100 on one model and input register 100 on the next model from the same vendor.
Finding out which one a device uses
- Check the manual's reference numbers: 3xxxx means input register, 4xxxx means holding register.
- If the manual is ambiguous, read the same address with both function codes. One will answer and the other will usually return exception 02, illegal data address.
- If both answer with different data, the device implements both tables and you need the manual to say which is which.
- If both answer with identical data, the device maps one table onto the other — either is fine, but be consistent.
Does it matter for reading?
Only in that you must use the right function code. Once you are reading the correct table, decoding, scaling and byte order behave identically. The distinction matters most when writing, and when a device restricts configuration to holding registers.
Modbus Scanner
Connect to a device and understand its register map.