You've connected your Python script to a Schneider M221, requested a holding register pair where you know the temperature is 25.5°C , and you get back: 1.401298464324817e-45 Enter fullscreen mode Exit fullscreen mode Not 25.5. Not even close. Some weird denormal float so small it might as well be zero. Welcome to the Modbus float32 byte-swap trap . It's the single most common reason engineers think pymodbus is broken when it isn't. The fix is 5 lines of code once you know what's happening — and that's what this article is about. Why this happens The Modbus specification defines registers as 16-bit unsigned integers . Period. That's it. The spec was written in 1979 and at the time, that's all anyone needed. But modern PLCs need to send floats, 32-bit integers, doubles, strings. The "solution" the industry adopted was: just split the larger value across multiple 16-bit registers . The problem? The Modbus spec says nothing about the order .…