了解 python 中的免费 OPC/UA 代码

Understanding free OPC/UA code in python

我正在 python 中处理 OPCUA。我正在使用 freeopc。我使用了他们的 server_minimal & client_minimal 示例,运行 很好。我在理解代码时遇到了一些问题。据我所知 OPCUA 堆栈,它的地址 space 就像所有节点的集合。这些节点然后进一步包含对象,这些对象具有我们可以从中读取写入数据的变量。如有不妥请指正

---------------------------------
         Address space
---------------------------------
   |                    |
   |                    |
   V                    V
  Node1               Node2
   |
   Object1
    |
    Var1, Var2

所以在服务器端我想知道名称是什么space

# setup our own namespace, not really necessary but should as spec
uri = "http://examples.freeopcua.github.io"
idx = server.register_namespace(uri)

这个名字space是做什么用的? uri里面放什么?

在客户端,我想知道:

连接到服务器后,我们正在做:

    # Client has a few methods to get proxy to UA nodes that should always be in address space such as Root or Objects
    root = client.get_root_node()
    print("Objects node is: ", root)

get_root_node()是什么意思。就像我们连接到定义了所有节点的服务器地址 space 一样吗?

    # Node objects have methods to read and write node attributes as well as browse or populate address space
    print("Children of root are: ", root.get_children())

root.get_children()-- 意思是获取节点的对象吗?

    # Now getting a variable node using its browse path
    myvar = root.get_child(["0:Objects", "2:MyObject", "2:MyVariable"])
    obj = root.get_child(["0:Objects", "2:MyObject"])

root.get_child什么意思。?

客户端输出:

 ('Objects node is: ', Node(TwoByteNodeId(i=84)))
 ('Children of root are: ', [Node(NumericNodeId(i=85)), Node(NumericNodeId(i=86)), Node(NumericNodeId(i=87))])

以上代码摘自server_minimal.py client_minimal.py

谁能解释一下这些。我试着阅读他们的文档,但那里没有提到。

谢谢。

我也在和 freeopcua 合作,有些问题我想我有答案

root = client.get_root_node()

将为您提供服务器的根节点,因此基本上 'adress space' 在您的图表中。

root.get_children()

将 return 是根的直接 children 的所有节点的列表,因此在您的树示例中。 [节点 1,节点 2]。但是添加根节点这是 0:Objects, 0:Types, 0:Views

要查看服务器树,您最好使用 opcua-client 这是一个可以让您查看树的 GUI。

为此启动您的服务器,然后在您的终端输入;

 $ opcua-client

(开启 linux 时)

您可以添加限制以获得 children 例如:

        objects = root.get_children(refs=ua.ObjectIds.HasChild, nodeclassmask=ua.NodeClass.Object)

这只会 return 其他 object 不是您节点的方法或属性。

你得到的输出是因为 Node 没有真正的 'ToString()' i 是节点的 ID(也可以通过 GUI 客户端看到)。

Node.getChild(NodeId)

将 return 一个节点 object 如果你确定你添加了一个值,你可以通过调用 [=55= 上的 .get_value() 来获取它的值] 这个的。 NodeId 是您想要的 child 的规范。所以说你想要 var1 这将是

# First the code needed to add the node
node1 = root.add_object(2, "Node1") # root is the root node which can be obtained by either client.get_root_node or server.get_root_node
object1 = node1.add_object(3, "Object1")
object1.add_variable(4, "Var1", 42)
object1.add_variable(4, "Var2", 13)
# Now the code to ask the server for the node
var1_node = root.getChild(["2:Node1", "3:Object1", "4:Var1"])

# And to get its value
var1_node.get_value()

这里重要的是,要获得 child 你需要知道你在哪里(你可以从任何节点 object 获得 children,不仅是 root)然后向下与 "idx:Name" 的组合,这是您首先将值添加到服务器时添加的内容。

希望这能有所帮助(没有测试代码,因此可能需要一些调整才能真正实现 运行)

为了更好地理解这一点,您可以使用 Unified Automation UA Expert 作为客户端。 https://www.unified-automation.com/downloads/opc-ua-clients.html 启动 server_minimal.py,使用 'Custom Discovery' 和“opc.tcp://localhost:4840/freeopcua/server/”打开 UA Expert 添加服务器。您可以轻松查看整个地址 space.