使用Python打开/关闭ModBus线圈 - Beckhoff BK9000

时间:2016-11-21 18:54:48

标签: python modbus industrial

警告 - 一般初学者使用Modbus和工业控制......对于任何不正确的术语/等抱歉。提前!

我有一个使用Beckhoff BK9000 / BK9100以太网耦合器的项目,我需要检查多达六个数字输出(KL2602模块)的状态,并根据某些逻辑打开/关闭相同的六个输出。 / p>

我知道该装置工作并处于IP指定状态,因为我能够在TwinCat3中看到它并手动操作输出。

我一直在尝试使用以下代码:

from pyModbusTCP.client import ModbusClient

SERVER_HOST = "172.16.17.32"
SERVER_PORT = 502

# TCP auto connect on modbus request, close after it
c = ModbusClient(host=SERVER_HOST, port=SERVER_PORT, auto_open=True, auto_close=True)

for i in range(4):
    print(str(i) + str(c.read_coils(i,16)))

status = c.write_single_coil(0, False)
print(status)

for i in range(4):
    print(str(i) + str(c.read_coils(i,16)))

当我这样做时,我可以看到线圈'0'的真/假对应于我使用TwinCat3手动设置的各种输出状态。有六个输出手动设置为高,这里可见:

0[True, True, True, True, True, True, True, True, False, False, False, False, False, False, False, False]
1[True, True, True, True, True, True, True, False, False, False, False, False, False, False, False, False]
2[True, True, True, True, True, True, False, False, False, False, False, False, False, False, False, False]
3[True, True, True, True, True, False, False, False, False, False, False, False, False, False, False, False]

看来当我增加'线圈'时,它只是向流中读取一点,因为“线圈”1,2和3向左旋转。

但是,我似乎仍然无法改变这些值。当线圈'0'设置为False(但没有点击true)时,我确实听到一个神秘的继电器点击,并且线圈读数的状态不会改变。 TwinCat也没有变化。我从写入中得到一个“无”,这表明它根据模块的文档失败了。

0[True, True, True, True, True, True, True, True, False, False, False, False, False, False, False, False]
1[True, True, True, True, True, True, True, False, False, False, False, False, False, False, False, False]
2[True, True, True, True, True, True, False, False, False, False, False, False, False, False, False, False]
3[True, True, True, True, True, False, False, False, False, False, False, False, False, False, False, False]
None
0[True, True, True, True, True, True, True, True, False, False, False, False, False, False, False, False]
1[True, True, True, True, True, True, True, False, False, False, False, False, False, False, False, False]
2[True, True, True, True, True, True, False, False, False, False, False, False, False, False, False, False]
3[True, True, True, True, True, False, False, False, False, False, False, False, False, False, False, False]

我确信这对于按位操作或类似于我忽略的操作来说是简单的。关于我做错了导致写入失败的任何想法?

1 个答案:

答案 0 :(得分:2)

我是Beckhoff PLC的初学者;), 但我很确定位地址是错误的。 bit_addr与模块的输出编号不同。 你应该可以从某个地方获得它,例如来自模块发现和配置实用程序。

来自pyModbusTCP.client文档:

write_single_coil(bit_addr, bit_value)

Parameters:   
bit_addr (int) – bit address (0 to 65535)
bit_value (bool) – bit value to write
Returns:  
True if write ok or None if fail

您获得状态None,即fail。 你听到继电器点击是因为发生了错误(plc已重置?)

顺便说一句。你应该在循环中将线圈地址增加16,就像thephez写的那样。例如:

var output0addr = 0x12346789
for i in range(4):
    print(str(i) + str(c.read_coils(output0addr + (i * 16), 16)))