Сервер PyModbus возвращает неправильные значения регистровPython

Программы на Python
Ответить
Anonymous
 Сервер PyModbus возвращает неправильные значения регистров

Сообщение Anonymous »

Я изучаю 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]

Однако вместо этого я получаю следующее:
[39322, 0]


Подробнее здесь: https://stackoverflow.com/questions/798 ... ter-values
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»