一次调用访问多个opc-ua节点

问题描述 投票:0回答:1

目标

创建一个可以访问节点的 opc-ua 方法。我的主要目标是通过一次服务器调用返回节点列表(例如,一个文件夹或特定文件夹中的所有节点),而不是每个节点一个。

我尝试过的事情

我发现这个 opc-ua 方法的示例对我有用: https://github.com/ifak-prototypes/opcua_examples/tree/main/src/MethodsServerSimple

但是那个人不访问节点。

最小的非工作示例

我创建了一个最小的非工作服务器示例,它公开两个节点(Node1、Node2)和方法 sum()。

from opcua import ua, Server

def sum_method(parent):
    val1 = node1.get_value()
    val2 = node2.get_value()
    return [ua.Variant(val1 + val2, ua.VariantType.Double)]

if __name__ == "__main__":
    server = Server()
    server.set_endpoint("opc.tcp://0.0.0.0:4840/freeopcua/server/")
    uri = "http://example.opcua.server"
    idx = server.register_namespace(uri)

    objects = server.get_objects_node()
    
    # Add two nodes with initial values
    node1 = objects.add_variable(idx, "Node1", 5.5)
    node2 = objects.add_variable(idx, "Node2", 10.5)
    node1.set_writable()
    node2.set_writable()

    # Add a method to sum the two nodes
    objects.add_method(idx, "sum", sum_method, [], [ua.VariantType.Double])

    # Start the server
    server.start()
    try:
        input("Server is running. Press Enter to stop...")
    finally:
        server.stop()

以及调用该方法的客户端代码:

from opcua import Client

if __name__ == "__main__":
    client = Client("opc.tcp://localhost:4840/freeopcua/server/")

    try:
        # Connect to the server
        client.connect()
        print("Client connected")

        # Access the root node and browse to the Objects node
        objects_node = client.get_objects_node()

        # Find the method node by browsing or by known ID/path
        sum_method = objects_node.get_child(["0:MyObject", "0:sum"])

        # Call the method, no input arguments
        result = sum_method.call()
        print(f"The sum of the two node values is: {result}")

    finally:
        # Close the connection
        client.disconnect()
        print("Client disconnected")

和错误:

opcua.ua.uaerrors._auto.BadNoMatch: "The requested operation has no match to return."(BadNoMatch)

我的问题

  • 如何修复我的错误?或者...
  • 是否有更好的方法通过一次服务器调用(或更少)获取多个节点值?
  • 有这方面的示例(显示服务器和客户端代码)吗?
python server opc-ua opcua-client
1个回答
0
投票

不要使用自定义 OPC UA 方法来处理此类标准用例。 OPC UA 发现服务能够以您喜欢的任何方式找到所需的节点。

OPC UA 执行此操作的方法是调用浏览服务
使用所需文件夹的 NodeId,您将获得引用的 NodeId。
当您向前过滤“组织”引用和“变量”的 NodeClass 掩码时,您将获得文件夹中的所有变量。

之后您可以使用读取服务读取所有找到的节点。

浏览和读取(以及几乎所有其他服务)允许在一次服务调用中执行多个单一操作。
因此,您只需 2 次服务调用即可从 10 个不同文件夹下的 100 个变量中获取 100 个值。

© www.soinside.com 2019 - 2024. All rights reserved.