警告 - 一般初学者使用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]
我确信这对于按位操作或类似于我忽略的操作来说是简单的。关于我做错了导致写入失败的任何想法?
答案 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)))