What They Are
Holding registers are 16-bit read/write Modbus values. They are the most common register family in real integrations because they carry setpoints, configuration values, writable analog points, and many general-purpose device values.
They also create many of the mistakes people casually call “Modbus issues.” In practice, the trouble is often not the protocol itself. It is confusion about whether the point is really a holding register, which address convention the manual uses, and how a multi-register value should be interpreted.
Addressing And Numbering Reality
Holding registers are frequently documented with 4xxxx style reference numbers, but many tools and gateways expect zero-based offsets instead. That is why an apparently correct register can still read the wrong value or fail a write. The device map and the client tool must agree about whether the documented address is a reference number or a protocol offset.
| Documentation Style | What It Usually Means | Common Risk |
|---|---|---|
4xxxx reference notation | Human-facing holding-register convention | Tool may expect an offset instead of the printed number |
| Zero-based offset | Protocol-oriented register location | User may add a leading 4 and shift the point incorrectly |
Multi-Register Values
Larger values such as 32-bit integers or floats span multiple consecutive holding registers, which means word order and data-type interpretation matter as much as address accuracy.
| Data Type | Register Count | Typical Use |
|---|---|---|
| 16-bit integer | 1 | Simple setpoints, status values |
| 32-bit integer | 2 | Counters and totalizers |
| 32-bit float | 2 | Temperatures, power, flow, pressure |
Multi-register values are one reason holding registers deserve their own topic page. A device may expose a perfectly healthy float, but the project still reads nonsense if the byte order, word order, or signedness assumptions are wrong.
Common Function Codes
| Function Code | Operation |
|---|---|
03 | Read holding registers |
06 | Write single register |
16 | Write multiple registers |
23 | Read and write multiple registers |
Common Failure Modes
| Failure Pattern | What Usually Happened | Practical Result |
|---|---|---|
| Reference number versus offset mismatch | The client and manual use different numbering styles | The wrong register is read or written |
| Writable assumption was too broad | The point exists in the map but is protected or context-dependent | Writes fail even though reads succeed |
| Multi-register data was interpreted incorrectly | Word order or data type was guessed | Values are obviously wrong despite healthy communications |
| Register family was copied loosely | The point was really an input register or vendor-specific path | The engineering model drifts from the actual device |