警告-完全初学者与Modbus和工业控制在一般.抱歉,任何不正确的术语/等提前!
我有一个使用贝克霍夫on 9000/on 9100以太网耦合器的项目,我需要检查多达6个数字输出(KL2602模块)的状态,并根据某些逻辑将这些相同的6个输出打开/关闭。
我知道这个单元是在指定的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‘设置为假(但没有点击真)和状态的线圈读不会改变。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]我肯定这是一些简单的操作或类似的东西,我忽略了。对于我做错了什么会导致写作失败有什么想法吗?
发布于 2017-02-02 15:55:43
我完全是贝克霍夫PLC的初学者,但我很确定位地址是错的。bit_addr 与模块的输出编号不相同。您应该能够从某个地方获得它,例如模块发现和配置实用程序。
来自pyModbusTCP.client文档:
write_single_coil( bit_addr,bit_value)参数:bit_addr (int)位地址(0至65535) bit_value (bool) -写入返回的位值:如果写确定为True,如果失败则为None
你得到了状态None,即fail。您听到中继单击是因为发生了什么错误(plc已经重置了吗?)
顺便说一下。在你的循环中,你应该把线圈地址增加16,就像特菲兹写的那样。例:
var output0addr = 0x12346789
for i in range(4):
print(str(i) + str(c.read_coils(output0addr + (i * 16), 16)))https://stackoverflow.com/questions/40727389
复制相似问题