Modbus Register Address Converter

Convert between Modbus protocol addresses (0-based) and display addresses (1-based) for coils, discretes, inputs and holding registers.

Modbus register address holding register coil discrete input input register

Input values

⚙

Enter values and click Calculate to see results here.

Formula

Display address = Protocol address + 1 Protocol address = Display address - 1 Coils: FC 01/05/15, 1-bit, address 00001-09999 Discrete Inputs: FC 02, 1-bit, address 10001-19999 Input Registers: FC 04, 16-bit, address 30001-39999 Holding Registers: FC 03/06/16, 16-bit, address 40001-49999

Worked Example

Given: You need to read holding register 40001 from a Modbus device.

Step 1: Display address 40001 → Protocol address = 40001 - 40001 = 0

Step 2: Use Function Code 03 (Read Holding Registers), address 0x0000

Note: Some devices use 0-based display addresses. Always check the device manual for the addressing convention.

Engineering Notes

  • Protocol vs display: Protocol addresses are 0-based. Display addresses are 1-based with a type prefix (0/1/3/4). This is the most common source of Modbus communication errors.
  • Address ranges: Standard Modbus defines: 00001-09999 (coils), 10001-19999 (discretes), 30001-39999 (input regs), 40001-49999 (holding regs). Extended addressing goes beyond these ranges.
  • Function codes: FC01=read coils, FC02=read discretes, FC03=read holding, FC04=read inputs, FC05=write single coil, FC06=write single register, FC15=write multiple coils, FC16=write multiple registers.
  • Vendor variations: Some vendors (especially Siemens) use different addressing conventions. Always verify with the device documentation.

References

  • MODBUS Application Protocol Specification V1.1b3
  • MODBUS over Serial Line Specification V1.02