Ответ об исключении (131, 3, IllegalAddress) - PullRequest
0 голосов
/ 22 мая 2019

Я знаю, что это может выглядеть как дубликат вопроса , но предоставленные ответы не решили проблему, с которой я столкнулся. Я пишу программу для чтения в аналоговых каналах с ADAM 6017 с использованием pymodbus . Для начала я просто запрашиваю первый регистр хранения 40000 или, поскольку у меня есть регистр 0, я могу получить чтение с помощью Simply Modbus, но когда я запускаю свой код в Python, все, что я получаю, - это Exception Response (131, 3, IllegalAddress)

from pymodbus.client.sync import ModbusTcpClient as ModbusClient

client = ModbusClient("192.168.1.201", port=502, auto_open=True)

rr = client.read_holding_registers(0, 1, unit=0x00)
raw_value = client.read_holding_registers(0, 1, unit=0x00)
rr_response = client.execute(rr)
raw_value_response = client.execute(raw_value)
print(raw_value_response)
print (rr_response)

1 Ответ

2 голосов
/ 22 мая 2019

Вот что я получаю, когда запускаю ваш код на моем фиктивном сервере Modbus:

DEBUG:pymodbus.server.sync:Client Disconnected [127.0.0.1:33075]
DEBUG:pymodbus.server.sync:Started thread to serve client at ('127.0.0.1', 49439)
DEBUG:pymodbus.server.sync:Client Connected [127.0.0.1:49439]
DEBUG:pymodbus.server.sync:Handling data: 0x0 0x4 0x0 0x0 0x0 0x5 0x0 0x3 0x2 0x0 0xff
DEBUG:pymodbus.framer.socket_framer:Processing: 0x0 0x4 0x0 0x0 0x0 0x5 0x0 0x3 0x2 0x0 0xff
DEBUG:pymodbus.factory:Factory Request[ReadHoldingRegistersRequest: 3]
ERROR:pymodbus.server.sync:Socket exception occurred Traceback (most recent call /register_read_message.py", line 40, in decode
    self.address, self.count = struct.unpack('>HH', data)
error: unpack requires a string argument of length 4

DEBUG:pymodbus.server.sync:Client Disconnected [127.0.0.1:49439]

Итак, у вас есть проблема. Чтобы он работал, я просто изменил его на:

from pymodbus.client.sync import ModbusTcpClient as ModbusClient

client = ModbusClient("192.168.1.201", port=502, auto_open=True)
client.connect()
rr = client.read_holding_registers(0, 1, unit=0x00)

print (rr.registers)

И я получил список из 1 элемента с правильным значением регистра на моем сервере.

Вы можете взглянуть на пример клиента синхронизации для pymodbus для более подробной информации: https://pymodbus.readthedocs.io/en/v1.3.2/examples/synchronous-client.html

...