Python Pymodbus–;侦听PLC设备上的输入更改

Python Pymodbus–;侦听PLC设备上的输入更改,python,raspberry-pi,iot,modbus,pymodbus,Python,Raspberry Pi,Iot,Modbus,Pymodbus,我正在编程一个PLC设备(Moxa ioLogik E1214),并将DI端口连接到按钮,线圈连接到LED灯。这个想法是当你按下一个按钮时,LED应该亮起 我已经让程序工作,如果你按住按钮,直到读输入功能执行。问题是,我想设置一个时间范围(X秒),如果在这个时间范围内按下按钮(而不是按下),灯应该切换 代码如下: import time import logging logging.basicConfig() log = logging.getLogger() log.setLevel(logg

我正在编程一个PLC设备(Moxa ioLogik E1214),并将DI端口连接到按钮,线圈连接到LED灯。这个想法是当你按下一个按钮时,LED应该亮起

我已经让程序工作,如果你按住按钮,直到读输入功能执行。问题是,我想设置一个时间范围(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)
如您所见,我已经为输入寄存器的读取设置了超时。但是,我如何才能在这几秒钟内“监听”输入更改,而不必按住按钮直到执行读取输入寄存器功能

提前感谢

您忘记了一些参数(
单元
连接
iError()


我改进了您的代码片段:

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秒后按下按钮
  • pymodbus 1.4.0及以上版本中定义的isError()
  • 您应该指定
    单位
    ,在许多情况下
    单位
    等于
    1

非常感谢您的改进,非常感谢。但是,有没有可能不使用time.sleep()来添加某种javascript的eventListener来监听按钮的按下,然后返回输入寄存器?@user2868900我不知道如何使用js,但是你可以使用
while
来代替
time.sleep()
我做了,谢谢你的帮助。我将发布一个带有解决方案的回复