Форум сайта python.su
Помогите разобраться, почему выскакивает ошибка:
client.connect() reply = client.write_register(40006, 2002, unit=0x05) if isinstance(reply, ModbusIOException): print(reply) while True: values = client.read_input_registers(address=40060, count=1, unit=0x05) # or client.read_holding_registers(...) if isinstance(values, ModbusIOException): print(values) else: # here if values is not an ModbusIOException print("Values:", values) if values [0] == 0xFFFF: print("Error detected") elif values [0] == 2002: print("Data ready") result = client.read_input_registers(address=40051, count=9, unit=0x05) if isinstance(result, ModbusIOException): print("Could not read result") print("Maybe client.read_holding_registers?") else: print("Got a result:", result)
Values: Exception Response(132, 4, IllegalFunction)
Traceback (most recent call last):
File "/home/pokip/winox1.py", line 28, in <module>
if values[0] == 0xFFFF:
TypeError: 'ExceptionResponse' object is not subscriptable
Отредактировано staxbel (Авг. 10, 2022 14:41:46)
Офлайн
staxbel
1) в коде, который вы показываете 23 строки, а ошибка возникает в двадцатьвосьмой
2)
print("Values:", values)
Офлайн
Прошу прощения, не все успел описать, пришлось уехать. Хочу получить данные по modbus. Уже немного переписал код, но ошибка осталась.
from pymodbus.client.sync import ModbusSerialClient from pymodbus.exceptions import ModbusIOException unit = 1 client = ModbusSerialClient(method='rtu', port='COM3', parity='N', baudrate=9600, bytesize=8, stopbits=1, timeout=1, strict=False) reply = client.write_register(5, 2002, unit=unit) if isinstance(reply, ModbusIOException): print(reply) while True: values = client.read_holding_registers(address=59, count=1, unit=unit) # or client.read_holding_registers(...) if isinstance(values, ModbusIOException): print(values) else: # here if values is not an ModbusIOException print("Values:", values) if values[0] == 0xFFFF: print("Error detected") elif values[0] == 2002: print("Data ready") result = client.read_holding_registers(address=50, count=9, unit=unit) if isinstance(result, ModbusIOException): print("Could not read result") print("Maybe client.read_holding_registers?") else: print("Got a result:", result)
Values: ReadHoldingRegistersResponse (1) Traceback (most recent call last): File "winox1.py", line 18, in <module> if values[0] == 0xFFFF: TypeError: 'ReadHoldingRegistersResponse' object is not subscriptable
Отредактировано staxbel (Авг. 12, 2022 13:13:12)
Офлайн
staxbel
вам надо:
1. Выяснить, что именно находится в переменной values - какого типа эта переменная и какое именно значение в ней содержится. Подозреваю что там значение типа ReadHoldingRegistersResponse
2. Зная тип переменной найти документацию к этому типу, она наверняка есть на сайте этой библиотеки, так же будет полезно посмотреть в код, если это написано на питоне.
3. Выяснить, правомочно ли применять квадратные скобки к переменной. Подозреваю, что у этого типа нет __getitem__() и так делать нельзя.
4. Если же операция values позволена (а скорее всего нет), то дальше мы должны понять, какое значение нам возвращается, какого типа и можем ли мы сравнивать его с числом
Офлайн
Я пробую сейчас только записать в регистр, но и это не получается. Ошибок нет, но и запись не происходит. Можете что-то подсказать?
from pymodbus.client.sync import ModbusSerialClient from pymodbus.exceptions import ModbusIOException unit = 1 client = ModbusSerialClient(method='rtu', port='COM3', parity='N', baudrate=9600, bytesize=8, stopbits=1, timeout=1, strict=False) client.connect() reply = client.write_register(5, 2002, unit=unit) print (reply) request = client.read_holding_registers(59, 1, unit=unit) result = request.registers print(result)
Exception Response(134, 6, IllegalFunction) [2020]
Офлайн