TECHNICAL GUIDE

Modbus register addressing without the 40001 guesswork

A label such as 40001 is documentation notation. The Modbus request contains an address space implied by the function code and a zero-based 16-bit offset. Mixing those two identities is the source of many perfectly valid responses containing the wrong value.

01

Separate the space from the number

Holding register 10 and input register 10 are different objects. FC03 selects holding registers; FC04 selects input registers. A client must know both the space and the PDU offset before it can form the request.

  • 00001 commonly means coil PDU 0
  • 10001 commonly means discrete input PDU 0
  • 30001 commonly means input register PDU 0
  • 40001 commonly means holding register PDU 0
02

Do not trust the prefix convention blindly

Some manuals number the first row 0, some 1, and some print a 3xxxx or 4xxxx label while still expecting the displayed number to be entered directly. Read the addressing note, inspect an example frame if supplied, or test a value with an unmistakable meaning.

03

Prove the address before decoding

Keep the first read as an unsigned 16-bit raw value. Once the raw word matches the manual or a known device state, add width, signedness, byte/word order, scale, and unit. Changing all of those at once makes an off-by-one error look like an endianness problem.

KEEP THE EVIDENCE

Use the manual beside the live protocol.

Browse documentation