- Сервер сохраняет значения [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]
Однако вместо этого я получаю следующее:
[39322, 0]
Подробнее здесь: https://stackoverflow.com/questions/798 ... ter-values
Мобильная версия