我正在使用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
任何人都可以解释这些。我试着阅读他们的文档,但那里没有提到。
感谢。
答案 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 添加服务器。您可以轻松查看整个地址空间。