Я использую библиотеку "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
> ...
Мы видим, что иногда результат получается нормально, иногда результат неполный, а иногда результат недоступен.
Что мне делать, чтобы решить эту проблему, я хочу следить за этим устройством. Спасибо.
framer=ModbusRtuFramer
, поэтому, возможно, ответ заключается в том, что он делает. Конечно, для меня это либо полный список, либо его отсутствие (с выброшенным исключением), но не частичное чтение. - person roganjosh   schedule 28.03.2019framer = ModbusRtuFramer
, я получу ошибку. - person frank   schedule 28.03.2019AttributeError: 'ModbusIOException' object has no attribute 'registers'
- person frank   schedule 29.03.2019ModbusIOException
. Включите журналы отладки и посмотрите, что именно происходит через сокет. В любом случае я бы использовал более высокий интервал между опросами. - person Sanju   schedule 29.03.2019