REGISTER SPACES

FC03 vs FC04: holding registers and input registers are not the same table

FC03 reads holding registers. FC04 reads input registers. Both return 16-bit words and use the same zero-based address field, but they address separate logical spaces. A valid value from the wrong function is still the wrong value.

Comparison of FC03 holding registers and FC04 input registers
Holding and input registers are separate address spaces even when a vendor prints similar-looking register numbers.
01

Treat the function code as part of the address

The pair ‘FC03, PDU 0’ identifies a different location from ‘FC04, PDU 0’. Do not copy a printed register number into a client and change function codes until one responds. Start with the table heading and function stated by the manufacturer.

02

Use the data model, not read-only folklore

Input registers are read with FC04. Holding registers are read with FC03 and may be writable through FC06 or FC16, but readability does not prove writability. Many devices expose measurements in holding registers and many expose configuration values alongside status words; the manual remains authoritative.

03

Verify the complete request

Record the Unit ID, function, PDU start address, quantity, response byte count, and raw words. If the device returns Exception 01, the function is unsupported. Exception 02 normally means the function exists but the requested address or range does not.

04

Read the table heading before the register number

A vendor table may label a column simply Register while the surrounding section identifies it as input or holding data. Capture that heading with the row. The number alone is incomplete because FC03 and FC04 can carry the same two-byte start offset while selecting different logical tables inside the server.

If the manual uses 3xxxx and 4xxxx notation, the leading digit is documentation shorthand and is not transmitted. If it uses raw offsets, the function may appear in a separate column or chapter. Avoid converting the number until you know which notation the document uses.

05

Do not infer write safety from the table name

Holding registers are the target of standard register-write functions, but that does not make every FC03-readable location writable. Devices routinely expose measurements, status, counters, and reserved values in the holding-register space. The access column and operation notes decide whether FC06 or FC16 is permitted.

Likewise, an input register may reflect a value configured elsewhere. If a measurement must be changed for a simulator or test fixture, locate the documented configuration object rather than attempting to write the FC04 address.

  • FC03 selects holding registers
  • FC04 selects input registers
  • FC06 writes one holding register
  • FC16 writes a holding-register block
  • The vendor map determines access for each location
06

Use exceptions to narrow the diagnosis

Exception 01 suggests that the server does not implement or permit the selected function. Exception 02 suggests that the function exists but the requested start, quantity, or complete range is invalid. A timeout does not establish either conclusion because the request may not have reached the intended server at all.

Once one function and address are proven, preserve the raw frame as a reference. Create separate sources for FC03 and FC04 even when their offsets overlap. That keeps later traffic inspection unambiguous and prevents a UI label from concealing which data model produced the value.

QUESTIONS

Before you connect.

Can FC03 and FC04 return the same value?+

A server may mirror data between spaces, but the protocol does not require it. Treat them as distinct unless the vendor documents the mapping.

Can FC04 registers be written?+

Not through the standard input-register model. A vendor may expose a related writable value in another holding register.

Why do some devices put live measurements in holding registers?+

The Modbus data model defines address spaces, not a universal semantic rule for every vendor. Manufacturers decide what their server exposes in each space.

KEEP THE EVIDENCE

Use the reference beside the live protocol.

Browse documentation→