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

时间:2017-07-26 12:17:22

标签: python opc

我正在使用python中的OPCUA。我正在使用freeopc。我用过他们的server_minimal& client_minimal示例,它运行正常。我在理解代码时遇到了一些问题。据我所知OPCUA堆栈,它有地址空间,就像所有节点的集合。然后,这些节点还包含对象,这些对象具有我们可以读取写入数据的变量。如果我错了,请纠正我。

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

所以在服务器端我想知道什么是命名空间

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

用于的命名空间是什么?什么放在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()的含义。是否就像我们连接到定义了所有节点的服务器的地址空间一样。?

    # 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

任何人都可以解释这些。我试着阅读他们的文档,但那里没有提到。

感谢。

2 个答案:

答案 0 :(得分:2)

我也在使用freeopcua,在一些问题上,我认为我有一个答案

root = client.get_root_node()

将为您提供服务器根目录的节点,以便在图表中基本上为“地址空间”。

root.get_children()

将返回所有节点的列表,这些节点是根的直接子节点,因此在树的示例中。 [node1,node2]。但是添加根节点,这是0:对象,0:类型,0:视图

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

执行此操作启动服务器,然后启动终端类型;

 $ opcua-client

(在Linux上时)

您可以添加限制以获取孩子,例如:

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

这只会返回其他对象,而不是节点的方法或属性。

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

Node.getChild(NodeId)

将返回一个节点对象,如果您确定添加了一个值,则可以通过在返回时调用.get_value()来获取它。 NodeId是您想要的孩子的规范。所以说你想要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()

重要的是,为了得到一个孩子,你需要知道你在哪里(你可以从任何Node对象中获取孩子而不仅仅是root),然后使用“idx:Name”的组合向下,这是你在您首先将值添加到服务器。

希望这有点帮助(没有测试代码所以可能需要对实际运行进行一些调整)

答案 1 :(得分:0)

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