You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PyModbus服务器返回错误寄存器值问题排查求助

PyModbus客户端读取寄存器值错误问题

问题现象

  • 服务器在保持寄存器中存储值[16689, 39322]
  • 客户端读取到的却是[39322, 0]
  • 转换后的浮点数为无效值:-1.5923226791645783e-23

环境

  • Python 3.12.12
  • PyModbus 3.11.3

代码实现

import asyncio 
import json 
from pymodbus.server import StartAsyncTcpServer
from pymodbus.datastore import ModbusDeviceContext, ModbusServerContext, ModbusSequentialDataBlock
from pymodbus import ModbusDeviceIdentification, FramerType
from pymodbus.client.mixin import ModbusClientMixin
from pymodbus.client import ModbusTcpClient

with open('teplomonitor_data.json', 'r') as file:
    data = json.load(file)

temperature = float(data['parameters']['outdoor_temperature'])

registers = ModbusClientMixin.convert_to_registers(
    value=temperature,
    data_type=ModbusClientMixin.DATATYPE.FLOAT32, 
    word_order='big'
)

holding_registers = ModbusSequentialDataBlock(0, [0] * 100)

holding_registers.setValues(address=0, values=registers)
print(holding_registers.getValues(address=0, count=2))

device_context = ModbusDeviceContext(
    di=holding_registers, 
    co=holding_registers, 
    hr=holding_registers, 
    ir=holding_registers 
)

server_context = ModbusServerContext(
    devices=device_context, 
    single=True
    )

identity = ModbusDeviceIdentification()
identity.VendorName = 'PyModbus Server'
identity.ProductCode = 'PM'
identity.VendorUrl = 'http://github.com/pymodbus-dev/pymodbus/'
identity.ProductName = 'PyModbus TCP Server'
identity.ModelName = 'PyModbus'
identity.MajorMinorRevision = '2.0'

host = '127.0.0.1'
port = 5020

async def run_server():
    print(f"Start Modbus TCP server on {host}:{port}")
    print("Press Ctrl+C to stop")

    try:
        await StartAsyncTcpServer(
        context=server_context,  
        identity=identity,  
        address=(host, port),  
        framer=FramerType.SOCKET,  
    )

    except asyncio.CancelledError:
        print('Server is stopped')
    except Exception as e:
        print(f"Server error: {e}")

def test_client():
    print("Client testing")
    try:
        client = ModbusTcpClient(host='127.0.0.1', port=5020)
        client.connect()
        response = client.read_holding_registers(address=0, count=2)
        
        if not response.isError():
            print("Registers values:", response.registers)
            value = ModbusClientMixin.convert_from_registers(
                response.registers,
                data_type=ModbusClientMixin.DATATYPE.FLOAT32,
                word_order='big'
            )
            print(f"Temperature processed value: {value}")
        else:
            print("Registers reading error:", response)
            
        client.close()
    except Exception as e:
        print(f"Client error: {e}")

async def main():
    server_task = asyncio.create_task(run_server())

    await asyncio.sleep(2)

    test_client()
    try:
        await server_task
    except KeyboardInterrupt:
        print("\nServer stopped by user")

if __name__ == '__main__':
    asyncio.run(main())

输出结果

[16689, 39322]
Start Modbus TCP server on 127.0.0.1:5020
Press Ctrl+C to stop
Client testing
Registers values: [39322, 0]
Temperature processed value: -1.5923226791645783e-23

期望结果

客户端执行response = client.read_holding_registers(address=0, count=2)时,期望得到[16689, 39322]。


内容的提问来源于stack exchange,提问作者Inal Kochesokov

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 01:20:53