【问题标题】:How to access all variables in all databases from PLC (without specifying the name of database or variable)?如何从 PLC 访问所有数据库中的所有变量(不指定数据库或变量的名称)?
【发布时间】:2019-02-08 13:10:12
【问题描述】:

在 plc 数据库中,我有一个名为“status”的数据库,其中有一个名为“Temperature”的变量。因为我知道名称,所以我可以像这样访问这个变量的值:

from opcua import Client
client = Client("url")
client.connect()
temperature = client.get_node("ns=3;s=\"status\".\"Temperature\"").get_value()

现在我如何在不知道数据库或变量名的情况下获取这些信息?我想要一个通用代码,它可以从给定的 PLC url 中获取所有内容。

【问题讨论】:

  • 这没有意义。是否要读取数据寄存器?
  • 在 plc 数据库中,我有一个名为“status”的数据库,其中有一个名为“Temperature”的变量。由于我知道名称,因此我可以像这样访问此变量的值: temperature= client.get_node("ns=3;s=\"Temperature\"").get_value() 现在我如何在不知道的情况下获取此信息数据库或变量名?
  • 我认为你最好用它作为编辑来更新你的原始问题。我只知道如何读取 PLC 的寄存器,而不是数据库。
  • 我刚才所做的编辑很可能是错误的。如果我标记错误,请恢复它,它在我的头上,而不是 OP 的

标签: python plc opc-ua


【解决方案1】:

您正在寻找Browse 服务。

查看您正在使用的任何工具包的文档或示例。

【讨论】:

  • 即使该方法要求参数:def browse(self, parameters): .....
  • 无法提供参数吗?
【解决方案2】:

找到答案:

from opcua import Client
client = Client("url")
client.connect()
node = client.get_objects_node()
def walk(node):
    a = node.get_children()
    for child in a:
        if child.get_children():
            walk(child)
        else:
            try:
                print(type(child.get_browse_name()), child.get_value())
            except:
                pass

【讨论】:

    猜你喜欢
    • 2020-12-12
    • 2020-01-17
    • 2019-03-09
    • 1970-01-01
    • 2017-11-10
    • 1970-01-01
    • 1970-01-01
    • 2018-07-17
    • 2017-04-13
    相关资源
    最近更新 更多