Ответ об исключении (131, 3, IllegalAddress)

Я знаю, что это может показаться повторяющимся вопросом, но предоставленные ответы не помогли решить проблему. проблема у меня возникла. Я пишу программу для чтения аналоговых каналов с 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)


person Michael H.    schedule 21.05.2019    source источник
comment
Вы уверены в своем адресе Unit_ID? обычно 0x0 зарезервировано. Попробуйте с 0x01, если не уверены в этом.   -  person Benyamin Jafari    schedule 22.05.2019
comment
Поскольку его TCP обычно не назначается, он просто использует номер устройства 0 или 0x00.   -  person Michael H.    schedule 22.05.2019


Ответы (1)


Вот что я получаю, когда запускаю ваш код на моем фиктивном сервере 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

person Marcos G.    schedule 22.05.2019
comment
Спасибо, я попробовал это с помощью строки client.connect(), когда только начинал, но заметил, что все больше и больше людей отказываются от нее, поэтому я отказался от нее. Теперь он работает с теми изменениями, которые вы предложили. - person Michael H.; 22.05.2019
comment
Большой! Вы правы по коннекту, это вроде как опционально, по крайней мере для TCP - person Marcos G.; 22.05.2019
comment
@Майкл Х. В библиотеке pymodbus нет аргумента auto_open=True в ModbusTcpClient, я думаю, вы перепутали его с pyModbusTcp. - person Benyamin Jafari; 26.05.2019