Automation Glossary • Fix Modbus value off by ten

How to Fix a Modbus Value Off by a Factor of Ten

Merobix Engineering • • 6 min read

A temperature reads 345 where the process is clearly near 34.5, or a pressure shows 3.4 where the gauge says 340. When the SCADA number is a clean multiple of the real value - ten, a hundred, sometimes a thousand times too big or too small - you are not chasing a comms fault or a garbled decode. You are chasing a missing decimal point. This tightly scoped guide handles that one symptom: it names the three ways an implied decimal goes wrong and gives the fastest fix for each, in the order you should check them.

Back to Blog

Fix Modbus value off by ten in one line: A Modbus value off by a clean factor of ten, a hundred, or a thousand almost always means the device sends the reading with an implied decimal place your tag is not applying. The device transmits 345 to mean 34.5, and your SCADA shows 345 because no divide-by-ten is set. Fix it by reading the device's resolution or scale from its register map, applying the matching divisor as the tag's scale factor, and confirming against the device's own display.

Confirm the Error Is a Clean Power of Ten

First make sure the factor really is a tidy power of ten, because that is what points at an implied decimal rather than something messier. Compare your SCADA value to a trusted reference - the field gauge, the device display, a calibrated reading - and divide one by the other. If the ratio is almost exactly ten, a hundred, or a thousand, you have an implied-decimal problem. If the ratio is some odd number like 1.8 or 6.9, you are looking at a different scaling issue, likely a unit conversion or a wrong span, handled under fixing a Modbus scaling mismatch rather than here.

The reason a power of ten is diagnostic is that devices routinely avoid sending fractional values over Modbus, which carries only integers, by scaling the reading up by ten or a hundred so the fraction survives as whole counts. A device measuring 34.5 degrees sends 345 and expects the master to divide by ten. When that division is missing, the error is exactly the factor the device multiplied by, which is always a clean power of ten. Confirming the ratio is that clean rules out the harder faults and points straight at the decimal.

Read the Device's Implied Resolution

Find how many decimal places the device implies, which its register map states as a resolution, scale, or units-per-count figure. A map entry saying the value is in tenths of a degree, or that resolution is 0.1, means divide by ten. Tenths of a psi or a scale of 0.01 means divide by a hundred. Some maps show it as an explicit multiplier of ten or a hundred that you must invert. Locating and reading these columns is the register-map skill described under verifying a Modbus register map against device docs.

If the map is silent on resolution, recover the divisor empirically. Take the raw integer your tag reads and the true value from a reference, and divide the raw by the true value: a raw 345 against a true 34.5 gives ten, so divide by ten. This works precisely because implied decimals are always clean powers of ten, so the recovered divisor lands on 10, 100, or 1000 with no ambiguity. Note that figure as the device's resolution so it is documented for the next tag from the same device.

Apply the Divisor and Check for Double Division

Set the recovered divisor as the tag's scale factor - a gain of one tenth to divide by ten, one hundredth for a hundred. Before you accept it, make sure you are not now dividing twice. If a gateway or a calculated tag already applied part of the decimal correction, adding another divisor overshoots and the value swings to the opposite error - now a hundred times too small instead of ten times too big. Check the whole path from register to display for any existing multiplier before adding yours, the double-scaling caution that also applies under engineering units scaling in SCADA.

Keep the divisor in one place, the tag's scaling settings, rather than splitting it between the driver and a display format string. A display that shows one decimal place is only formatting the number, not scaling it, so formatting a 345 to show 345.0 does not fix anything - the underlying value is still ten times too big. The real fix is the arithmetic divisor on the value itself, applied once, in the scaling layer where the next engineer will look for it.

Verify With Two Points

Confirm the fix at more than one value, because a pure factor-of-ten error corrects with a gain alone and a single matching point can look right for the wrong reason. If the device display reads 34.5 and your tag now reads 34.5, check a second value - drive the process to a different point, or find another reading, and confirm it also matches after the divide. Two matching points across the range prove the divisor is right and that there is no residual offset masquerading as a scale error.

Then watch the tag live. A value that tracks the field reading up and down, staying a factor of one - not ten - away throughout, is a fixed decimal. If it drifts back to a factor at the extremes of the range, the problem was never a simple implied decimal but a full span mismatch, and you should return to the broader Modbus scaling mismatch procedure to reset the endpoints. A clean power-of-ten fix holds across the whole range or it was not the right diagnosis.

Frequently Asked Questions

Why is my Modbus reading exactly ten times too big?

The device sends the value with one implied decimal place - transmitting 345 to mean 34.5 - and your tag is not dividing by ten. Modbus carries only integers, so devices scale fractional readings up by ten or a hundred to preserve the fraction as whole counts. The fix is to set the tag's scale factor to divide by the same power of ten the device multiplied by, which the register map documents as a resolution or scale.

How do I know how many decimal places a Modbus device uses?

Read the resolution, scale, or units-per-count column in the device's register map, which states whether a register is in tenths, hundredths, or whole units. If the map is silent, divide a raw integer reading by the true value from a trusted reference: the result lands on a clean 10, 100, or 1000, telling you the divisor. Record that figure so all tags from the device use the same decimal convention.

My value is now a hundred times too small after I fixed it. What happened?

You divided twice. Something earlier in the chain - a gateway, a calculated tag, or the device itself - had already applied part of the decimal correction, and your added divisor overshot. Remove your divisor, trace the full path from register to display, find where the first division happens, and apply the correction in only one place. Formatting a value to show decimals is not division and never fixes an implied-decimal error.

Sources and verification

This page references the protocol specifications published by the organizations below. Editions, product capabilities, and documentation change over time - confirm current requirements and specifications directly with the source.

Merobix is not affiliated with, endorsed by, or sponsored by these organizations; their names are used only to identify the standards and products discussed.

More in Industrial Protocols
Modbus Illegal Data Value (Exception 03)  •  Fix a Modbus wrong register value  •  Modbus Illegal Function (Exception 01)  •  Fix a Modbus timeout error  •  Fix Modbus float endianness  •  All Industrial Protocols →
Free SCADA operator training
Merobix University - 70 video lessons & 261 quiz questions, from first login to compliance reporting. No demo call required.
Start free →