Соединение pymodbus иногда не отвечает?

Я использую библиотеку "pymodbus" для подключения устройств ПЛК. В устройстве используется Modbus RTU через TCP, что позволяет устройствам возвращать температуру и влажность окружающей среды.

список адресов карты

  • 0001: температура
  • 0002: влажность

Я выполнил один раз, чтобы получить значение, и это может быть успешным. Но я использую цикл while, иногда получаю ошибку. Я не знаю почему.

код:

from time import sleep
from pymodbus.client.sync import ModbusTcpClient
from pymodbus.framer.rtu_framer import ModbusRtuFramer

from pymodbus.register_read_message import ReadHoldingRegistersResponse

client = ModbusTcpClient(host='192.168.1.1', port=5000, framer=ModbusRtuFramer)    
client.connect()
while True:
    rr = client.read_holding_registers(0, 2, unit=1)

    if isinstance(rr, ReadHoldingRegistersResponse):
        temp = rr.registers
        print(temp)
    else:
        print('error')
    sleep(1)
client.close()

выход:

> ...
> [189, 444]
> [189, 443]
> [189]
> error
> error
> ...

Мы видим, что иногда результат получается нормально, иногда результат неполный, а иногда результат недоступен.

Что мне делать, чтобы решить эту проблему, я хочу следить за этим устройством. Спасибо.


person frank    schedule 28.03.2019    source источник
comment
Я никогда этого не видел. Единственная реальная разница, которую я имею, заключается в том, что я не использую framer=ModbusRtuFramer, поэтому, возможно, ответ заключается в том, что он делает. Конечно, для меня это либо полный список, либо его отсутствие (с выброшенным исключением), но не частичное чтение.   -  person roganjosh    schedule 28.03.2019
comment
Привет спасибо. Если я не использую framer = ModbusRtuFramer, я получу ошибку.   -  person frank    schedule 28.03.2019
comment
Сообщение об ошибке: AttributeError: 'ModbusIOException' object has no attribute 'registers'   -  person frank    schedule 29.03.2019
comment
Иногда ведомое устройство не могло обрабатывать запросы (из-за ограничений буферов чтения/записи) при очень быстром чтении (например, в этом случае каждую 1 секунду), что могло привести к ModbusIOException. Включите журналы отладки и посмотрите, что именно происходит через сокет. В любом случае я бы использовал более высокий интервал между опросами.   -  person Sanju    schedule 29.03.2019


Ответы (2)


Да, я все время вижу это в своем коде pymodbus. Я подозреваю, что что-то не так с реализацией при последовательном чтении. Что я делаю, так это просто повторяю неудачное чтение после небольшой задержки. И это обычно заставляет его работать снова. В качестве альтернативы попробуйте закрыть и повторно подключить клиент и повторить попытку чтения. Также попробуйте увеличить время сна. Дайте мне знать, как это происходит!

person Sergio Flores    schedule 28.03.2019
comment
Привет спасибо. Я добавляю client.close() client.connect() в случае else. Та же проблема все еще возникает. - person frank; 29.03.2019
comment
Ммм, да, я вижу это все время, но в моем приложении это не имеет значения, так как мне нужно читать каждые 5 минут, и для этого я перезапускаю скрипт Python. Я видел isuse, но исчезает при следующем запуске. Итак, как насчет того, чтобы вместо запуска в цикле поместить его в cron с задержкой x секунд, подключить-читать-сохранить-отключить - person Sergio Flores; 29.03.2019

Вы можете попробовать напечатать то, что у вас есть в вашей временной переменной, если это не экземпляр ReadHoldingRegisterResponse - это может помочь.

Иногда я использую, когда устройство еще не отправило ответ:

Modbus Error: [Input/Output] No Response received from the remote unit
person Diana    schedule 01.04.2019