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
相关产品推荐
相关产品推荐

