How to Fix a Modbus Scaling Mismatch
The register decodes to a clean, stable integer, but the engineering value is wrong: a pressure reads 3450 when it should be 34.5, or a temperature comes out in the hundreds when the process is near room temperature. The bytes are fine and the data type is right - what is wrong is the arithmetic that turns the device's raw number into a real-world unit. This guide separates a scaling mismatch from a decode fault, shows how to recover the device's intended scale factor from its register map, and walks the fix in the order that isolates the problem fastest.
Fix Modbus scaling mismatch in one line: A Modbus scaling mismatch is when the register decodes correctly but the engineering value is off by a factor or in the wrong units because the raw-to-EU conversion does not match how the device scaled the value. Fix it by confirming the raw integer is correct first, reading the device's documented scale factor or implied decimal places from the register map, applying that multiplier or divisor in your tag, and verifying against a known reading. A factor of ten or a hundred almost always means an implied-decimal mismatch.
Rule Out a Decode Fault Before Scaling
Scaling and decoding are different problems, and fixing scale on a value that is actually decoded wrong just hides the real fault. So confirm the raw number first. If the register holds a single sixteen-bit integer, read it as an unsigned or signed integer and check that the raw value is stable and plausible - a pressure sensor near ambient should give a raw count somewhere in a sensible fraction of its range, not a wildly swinging or astronomically large number. If the raw value itself looks like garbage, you have a byte or word order problem, addressed under fixing Modbus float byte and word order, not a scaling problem.
The tell for a genuine scaling mismatch is a raw value that is clean and steady but the engineering value that is off by a tidy factor - ten, a hundred, a thousand - or in an obviously wrong unit such as kPa where you expected psi. Clean bits, wrong magnitude, is the scaling signature. This differs from the wider family of decode faults; the full menu of what can corrupt a value is in the guide to fixing a Modbus wrong register value, but here we assume the bits are good and only the conversion is off.
Recover the Device's Intended Scale Factor
Devices rarely send engineering units directly over Modbus; they send integers, and the register map documents how to convert. Look in the map for a scale, multiplier, resolution, or units column against your register. A device might state that a temperature register carries the value times ten, meaning a raw 345 is 34.5 degrees, or that a pressure register is in tenths of a psi. This implied decimal is the single most common scaling convention, and it produces exactly the factor-of-ten and factor-of-hundred errors people see. Reading these columns correctly is the heart of working a register map, covered under a Modbus register map address table.
The underlying math is a linear conversion: engineering value equals raw value times a gain plus an offset, the same two constants explained under a scaling factor and offset in SCADA. For a simple implied-decimal register the gain is a tenth or a hundredth and the offset is zero. For a device that maps a full raw range onto a full engineering range - a raw zero to 32767 mapped onto zero to 1500 psi - you compute the gain and offset from the two endpoints, the technique described under raw count to engineering unit conversion. Recover which case you are in from the register map before you type any numbers.
Apply the Conversion in the Right Layer
Set the scale factor and offset on the tag, and be certain you are not scaling something that is already scaled. This is the double-scaling trap: the device already converted to engineering units, or an intermediate gateway applied a scale, and your SCADA applies another one on top, so the value is off by the product of two factors. Check whether the raw register is truly raw counts or already an engineering value before adding a multiplier, because scaling an already-scaled number is a common way to turn a factor-of-ten fix into a factor-of-a-hundred error.
Apply the conversion in one clear place - typically the tag's scaling settings - rather than scattering pieces of it across the driver, a calculated tag, and a display format. Keeping the whole raw-to-EU conversion in one layer means the next engineer can see exactly what was done and reverse it if needed. The general discipline of where engineering-unit scaling belongs in the chain is covered under engineering units scaling in SCADA, and following it prevents the mismatch from reappearing after the next configuration change.
Verify Against a Known Reading
Prove the conversion with a value you can independently trust. The device's own display is ideal: if the front panel shows 34.5 psi while your scaled tag now shows 34.5, the gain and offset are right. Failing that, use a calibrated reference or a physically obvious value - a totalizer you can zero, ambient temperature, atmospheric pressure on a gauge sensor. Match a single point to catch a gain error, then match a second, different point to catch an offset error, because a wrong offset can still pass at one value while failing everywhere else.
Watch the scaled tag through a real process change as the final check. A pressure that climbs from 30 to 35 psi in your SCADA while the field gauge does the same confirms both the gain and the direction. If the value moves the wrong way - falls when the process rises - the scale factor has the wrong sign, a reverse-scaling case that means swapping the endpoints of the raw-to-EU line. A tag that tracks reality in the right units and the right direction is a fixed scaling mismatch.
Frequently Asked Questions
Why is my Modbus value off by a factor of ten?
The device almost certainly sends the value with an implied decimal - a raw integer of 345 meaning 34.5 - and your tag is not dividing by ten. This is the most common scaling mismatch. Check the register map for a scale, resolution, or multiplier column, apply the documented divisor, and verify against the device's own display. Factor-of-ten and factor-of-hundred errors are almost always implied-decimal conventions.
How do I find the scale factor for a Modbus register?
Read it from the device's register map, which normally documents a scale, multiplier, resolution, or units column per register. Some devices state the value times ten or in tenths of a unit; others map a full raw range onto a full engineering range, which you convert with a two-point gain-and-offset calculation. If the map is silent, derive the factor by comparing a raw reading to a known engineering value and solving for the multiplier.
What is double scaling in Modbus, and how do I avoid it?
Double scaling is applying a raw-to-EU conversion to a value that has already been scaled, so the result is off by the product of two factors. It happens when the device or a gateway already delivers engineering units and the SCADA scales again on top. Avoid it by confirming whether the register is genuinely raw counts or already an engineering value before adding any multiplier, and keeping the conversion in a single configuration layer.
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.
- Modbus Application Protocol Specification - Modbus Organization
Merobix is not affiliated with, endorsed by, or sponsored by these organizations; their names are used only to identify the standards and products discussed.
Automation services
Need help turning this into a working system?
Merobix integrates SCADA, programs Allen-Bradley and Siemens PLCs, and designs and fabricates industrial control panels.
Meeting requests are reviewed before confirmation.