1

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

如您所见,我为读取输入寄存器设置了超时。但是我怎样才能在这几秒钟内“监听”输入变化,而不必按住按钮直到读取输入寄存器功能执行?

提前致谢

4

1 回答 1

1

您忘记了一些参数(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
于 2018-11-05T12:21:16.500 回答