It is important to note that different Modbus vendors use different notation for documenting Modbus registers. There are 3 common ways that vendors document registers:

**0-Based Register Address**- This is the "on-the-wire" address that's actually encoded into the packet
- If the register is documented in hexadecimal, it is almost always a 0-based register address
- If a register with address 0 exists in the device's documentation, then it uses 0-based register addressing
- Since this notation does not specify a specific register type, a type (or at the very least, a function code) must also be included in the documentation when registers are documented this way. Types and function codes include:
- Holding Registers
- Read function code =
*03 (0x03)* - Write function codes =
*06 (0x06), 16 (0x10)*

- Read function code =
- Input Registers
- Read function code =
*04 (0x04)*

- Read function code =
- Coils
- Read function code =
*01 (0x01)* - Write function codes =
*05 (0x05), 15 (0x0F)*

- Read function code =
- Discrete Inputs
- Read function code =
*02 (0x02)*

- Read function code =

- Holding Registers
- The expressible register address range is
*0 - 65535*

**1-Based Register Number**- This is the "human-readable" register number and is 1 more than the "on-the-wire" address used in 0-based addressing
- The register address actually encoded into the packet is 1 less than the register number
- If the first register in a device's documentation starts at 1 for all types, then it is likely that 1-based register number notation is used
- This notation also does not specify a specific type. Refer to the note above under 0-based register address notation
- The expressible register number range is
*1 - 65536*

**Register Reference Notation**- This notation consists of both a type and a register number
- Each type has its own reference number
*4X References*- Holding Registers*3X References*- Input Registers*0X References*- Coils*1X References*- Discrete Inputs

- The register references are written using one of two notations
*5-Digit Register Reference Notation*- The type is calculated by multiplying by the reference by
*10,000* - For example,
*40,123*in reference notation is*Holding Register 123*in 1-based notation - The expressible 5-digit register reference range is
*40,001 - 49,999*(*Holding Registers 1 - 9,999*in 1-based notation)*30,001 - 39,999*(*Input Registers 1 - 9,999*in 1-based notation)*1 - 9,999*(*Coils 1 - 9,999*in 1-based notation)*10,001 - 19,999*(*Discrete Inputs 1 - 9,999*in 1-based notation)

- The type is calculated by multiplying by the reference by
*6-Digit Register Reference Notation*- This is the reference multiplied by
*100,000* - This is used to address register numbers higher than
*9,999*(1-based), which cannot be done using 5-digit reference notation - Example:
*300,246*in reference notation is*Input Register 246*in 1-based notation - The expressible 6-digit register reference range is
*400,001 - 465,536*(*Holding Registers 1 - 65,536*in 1-based notation)*300,001 - 365,536*(*Input Registers 1 - 65,536*in 1-based notation)*1 - 65,536*(*Coils 1 - 65,536*in 1-based notation)*100,001 - 165,536*(*Discrete Inputs 1 - 65,536*in 1-based notation)

- This is the reference multiplied by

- The register address encoded into the packet can be calculated by subtracting the low range limit of the 5 or 6 digit reference notation.
- For example, register
*40,201*(5-digit reference notation) minus*40,001*(low range limit for Holding Registers in 5-digit reference notation) is*200*(0-based register address encoded into the packet).

- For example, register