了解 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.
我正在 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.