首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用BK9000打开/关闭ModBus线圈

用BK9000打开/关闭ModBus线圈
EN

Stack Overflow用户
提问于 2016-11-21 18:54:47
回答 1查看 1.2K关注 0票数 0

警告-完全初学者与Modbus和工业控制在一般.抱歉,任何不正确的术语/等提前!

我有一个使用贝克霍夫on 9000/on 9100以太网耦合器的项目,我需要检查多达6个数字输出(KL2602模块)的状态,并根据某些逻辑将这些相同的6个输出打开/关闭。

我知道这个单元是在指定的IP上工作的,因为我能够在TwinCat3中看到它并手动操作输出。

我一直试图使用以下代码:

代码语言:javascript
复制
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手动设置的各种输出状态。这里有六个手动设置为高的输出,可见:

代码语言:javascript
复制
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也没有任何变化。我从写作中得到了一个“无”,这表明根据模块的文档它是失败的。

代码语言:javascript
复制
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]

我肯定这是一些简单的操作或类似的东西,我忽略了。对于我做错了什么会导致写作失败有什么想法吗?

EN

回答 1

Stack Overflow用户

发布于 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,就像特菲兹写的那样。例:

代码语言:javascript
复制
var output0addr = 0x12346789
for i in range(4):
    print(str(i) + str(c.read_coils(output0addr + (i * 16), 16)))
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40727389

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档