我正在对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)


如您所见,我已经设置了读取输入寄存器的超时时间。但是,如何在这几秒钟内“监听”输入更改,而不必在执行读取输入寄存器功能之前按住按钮呢?

提前致谢

最佳答案

您忘记了一些参数(unitconnectisError())。



我改进了您的代码段代码:

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()
您应指定unit,在许多情况下unit等于1

09-12 16:26