Modbus Values Off by 10x? Scale Factor & Offset

QModMaster shows 2355 but your inverter’s display says 235.5 V. Or a temperature reads 1025 when the room is clearly 25 °C. Before you blame the wiring, the address, or the byte order — check the two most boring explanations in Modbus: scale factors and offsets. They account for a huge share of “wrong value” reports, and they are verified with mental math in under a minute.

Scale factor: the register holds an integer, the value has decimals

Modbus registers are 16-bit integers — they cannot store a decimal point. So device makers store 235.5 V as the integer 2355 and document a scale factor of 0.1 (or “divide by 10”). Common variants:

  • ÷ 10 — voltages, currents with one decimal (2355 → 235.5 V).
  • ÷ 100 — two decimals (23550 → 235.50 V).
  • ÷ 1000 — power/energy with three decimals, or millivolt-native sensors.
  • × 10 / × 100 — the reverse: some devices store a multiplied value (rare, but documented in a few meter maps).

The scale factor is always in the device’s register map / protocol document — look for columns labeled “scale,” “factor,” “multiplier,” “gain,” or a unit like “0.1 V”. If your reading is off by exactly 10×, 100×, or 1000×, scaling is guilty until proven innocent.

Offset: the register value is shifted by a constant

Some devices add a fixed offset so that an unsigned register can represent a signed quantity. The documented real-world example is Deye inverters: certain temperature registers carry an offset of 1000, i.e.

actual temperature = raw register value − 1000

So a raw reading of 1025 means 25 °C, and a raw reading of 985 means −15 °C — the offset lets the unsigned register express temperatures below zero. If your temperature is off by a suspiciously round constant (not a round multiple), look for an “offset” column in the register map.

The 60-second verification in QModMaster

  • Step 1 — read raw. In QModMaster, read the register with a plain integer View format (no float interpretation yet). Write down the raw integer.
  • Step 2 — divide first. Divide the raw value by 10, 100, and 1000 in your head. Does one of the results exactly match the device’s own display? Then you have found the scale factor.
  • Step 3 — subtract second. If division does not fit but the value is off by a round constant, subtract candidate offsets (1000 is the classic for temperatures). A raw 1025 → 25 °C after −1000 confirms the offset.
  • Step 4 — confirm in the manual. Find the scale/offset columns in the official register map and note them next to the address in your own notes. Always let the device manual win over any rule of thumb on this page.

Telling scaling apart from byte-order problems

FAQ

Why does my Modbus reading show 2355 instead of 235.5?

Modbus registers hold integers only, so the device stores 235.5 V as 2355 with a documented scale factor of 0.1. Divide the raw value by 10. The scale factor is listed in the device’s register map.

What is the Deye temperature offset of 1000?

Certain Deye inverter temperature registers add an offset of 1000 so an unsigned register can represent negative temperatures: actual °C = raw value − 1000. A raw reading of 1025 means 25 °C.

How do I know whether it’s scale, offset, or byte order?

Divide the raw value by 10/100/1000 — an exact match means scaling. If it is off by a round constant, suspect an offset. If it is off by 65,536× or shows garbage floats, it is a word/byte-order problem instead.

Related Guides

Want the full encoding story? The Modbus protocol book covers scaling, offsets, and data representation in one place.

Similar Posts