Найти - Пользователи
Полная версия: TypeError: 'ExceptionResponse' object is not subscriptable
Начало » Python для новичков » TypeError: 'ExceptionResponse' object is not subscriptable
1
staxbel
Помогите разобраться, почему выскакивает ошибка:
 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
FishHook
staxbel
1) в коде, который вы показываете 23 строки, а ошибка возникает в двадцатьвосьмой
2)
 print("Values:", values)
что пишут?
3) что это вообще за код то? Что за клиент, откуда? Как это воспроизвести по-вашему?
staxbel
Прошу прощения, не все успел описать, пришлось уехать. Хочу получить данные по 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
FishHook
staxbel
вам надо:
1. Выяснить, что именно находится в переменной values - какого типа эта переменная и какое именно значение в ней содержится. Подозреваю что там значение типа ReadHoldingRegistersResponse
2. Зная тип переменной найти документацию к этому типу, она наверняка есть на сайте этой библиотеки, так же будет полезно посмотреть в код, если это написано на питоне.
3. Выяснить, правомочно ли применять квадратные скобки к переменной. Подозреваю, что у этого типа нет __getitem__() и так делать нельзя.
4. Если же операция values позволена (а скорее всего нет), то дальше мы должны понять, какое значение нам возвращается, какого типа и можем ли мы сравнивать его с числом
staxbel
Я пробую сейчас только записать в регистр, но и это не получается. Ошибок нет, но и запись не происходит. Можете что-то подсказать?
 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]
Хотя 2020 должно было замениться на 2002
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB