Pymodbus - прослушивает изменение входа на устройстве PLC - PullRequest
0 голосов
/ 05 ноября 2018

Я программирую устройство ПЛК (Moxa ioLogik E1214) и подключил порты DI к кнопкам, а катушки подключены к светодиодным индикаторам. Идея заключается в том, что при нажатии кнопки светодиод должен загореться.

Я заставил программу работать, если вы удерживаете кнопку, пока не будет выполнена функция чтения ввода. Проблема в том, что я хотел бы установить временной интервал (X секунд), и если кнопка нажата (и не удерживается) в течение этого периода, индикатор должен переключаться.

Код ниже:

import time
import logging
logging.basicConfig()
log = logging.getLogger()
log.setLevel(logging.DEBUG)

from pprint import pprint
from pymodbus.client.sync import ModbusTcpClient as ModbusClient

moxaA = ModbusClient('XX.XX.XX.XX', port=502)

print "Press a button now"

time.sleep(2)
result = moxaA.read_input_registers(0x30, 1)
if result:
    pressedBtn = result.registers[0]
    if pressedBtn == 1:
        moxaA.write_coil(0, 1)
    else: 
        moxaA.write_coil(0, 0)

Как видите, я установил таймаут для чтения входных регистров. Но как я могу «прослушать» изменение входа в течение этих секунд, и не нужно удерживать кнопку нажатой, пока не будет выполнена функция чтения входных регистров?

Заранее спасибо

1 Ответ

0 голосов
/ 05 ноября 2018

Вы забыли некоторые аргументы (unit, connect, isError()).


Я улучшил ваш код:

moxaA = ModbusClient('XX.XX.XX.XX', port=502)

if moxaA.connect()
    print "Press a button now"
    time.sleep(2)
    result = moxaA.read_input_registers(0x30, 1, unit=1)

    if not result.isError():
        pressedBtn = result.registers[0]

        if pressedBtn == 1:
            moxaA.write_coil(0, 1, unit=1)
        else: 
            moxaA.write_coil(0, 0, unit=1)

[ Примечание ]:

  • С вышеуказанным sleep(2) вы должны нажать кнопку 2 секунды или через 2 секунды.
  • isError() определено в pymodbus 1.4.0 и выше.
  • Вы должны указать unit, во многих случаях unit равно 1.
...