0

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

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

我知道该单元可以工作并且处于指定的 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]

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

4

1 回答 1

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)))
于 2017-02-02T15:55:43.130 回答