SMC LEC 6 的python minimummodbus 协议实现:写入多个线圈

问题描述

minimalmodbus 不提供一次设置多个线圈的方法。我找不到解决方法

目标:

SMC LEC 6 控制器数据表中的 modbus 协议说明,请参阅 here。 我尝试按照从第 7 页开始的示例中的说明,使用 pyton 库 minimalmodbus 发送列出的 modbus 命令。

我想发送命令 01 0F 00 10 00 08 01 02 BE 97,但没有找到使用 minimalmodbus 执行此操作的方法。没有函数代码 15 (OF) 的实现。

我尝试做的:

我的推理如下:

  • 我想设置多个线圈:0F
  • 从位置开始:00 10
  • 我想设置8个线圈:00 08,或者一个字节01
  • 我想要做的是将此字节设置为值 2 (02),或二进制 00000010

我认为这可以通过单独设置这些位置来实现:

logging.debug('write step')
step_address = int('0010',16)

bin_2 = [0] * 8
bin_2[6] = 1

for pos,val in zip(list(range(8)),bin_2):
    contr.write_bit(step_address + pos,val)
time.sleep(WAIT_TIME)
contr.write_bit(flags['DRIVE'],1); time.sleep(WAIT_TIME * 5)

执行器没有移动...

谢谢, 扬

解决方法

通过深入了解最小 modbus 类并将原始负载发送到设备,我能够发送有问题的命令:

00 10 00 08 01 02

contr._performCommand(15,'\x00\x10\x00\x08\01\02')
contr.write_bit(flags['DRIVE'],1)
time.sleep(WAIT_TIME * 3)
contr.write_bit(flags['DRIVE'],0)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...