[CSharpTips]C# 获取OPCUA服务器节点

发布时间 2024-01-05 16:13:31作者: xiaoshuye

C#  获取OPCUA服务器节点

1.创建OPCUA服务器 可以参考 KepServerv设置为OPCUA通讯说明_kepserver opcua-CSDN博客

2.创建控制台工程,Nuget安装OpcUaHelper 

3.Demo如下 参考了OpcUaHelper源码 https://github.com/dathlin/OpcUaHelper

using Opc.Ua;
using OpcUaHelper;
using System;
using System.Threading.Tasks;

namespace OpcUaHelperGetNoteIdTest
{
    internal class Program
    {
        static OpcUaClient opcUaClient;

        static void Main(string[] args)
        {
            opcUaClient = new OpcUaClient();
            opcUaClient.UserIdentity = new UserIdentity(new AnonymousIdentityToken());
            opcUaClient.ConnectServer(@"opc.tcp://127.0.0.1:49320");

            if (opcUaClient.Connected)

            {
                //打印Objects节点下所有NodeId
                Recursive(ObjectIds.ObjectsFolder);
                Console.WriteLine("=======================================================================================================================");
                //打印指定节点下所有NodeId
                Recursive("ns=2;s=通道 1.设备 1");

                //浏览一个节点的引用 OpcUaHelper内置方法
                Console.WriteLine("=======================================================================================================================");
                ReferenceDescription[] references = opcUaClient.BrowseNodeReference("ns=2;s=通道 1.设备 1");
                foreach (var item in references)
                {
                    Console.Write(string.Format("{0,-30}", item.NodeClass));
                    Console.Write(string.Format("{0,-30}", item.BrowseName));
                    Console.Write(string.Format("{0,-20}", item.DisplayName));
                    Console.WriteLine(string.Format("{0,-20}", item.NodeId.ToString()));
                }
                //浏览一个节点的所有属性 OpcUaHelper内置方法
                Console.WriteLine("=======================================================================================================================");
                OpcNodeAttribute[] dataValue = opcUaClient.ReadNoteAttributes("ns=2;s=通道 1.设备 1.FloatTest");
                foreach (var item in dataValue)
                {
                    Console.Write(string.Format("{0,-30}", item.Name));
                    Console.Write(string.Format("{0,-20}", item.Type));
                    Console.Write(string.Format("{0,-20}", item.StatusCode));
                    Console.WriteLine(string.Format("{0,20}", item.Value));
                }
            }
            Console.ReadLine();
        }
        /// <summary>
        /// 通过递归打印指定节点下所有NodeId
        /// </summary>
        /// <param name="nodeID"></param>
        public static void Recursive(NodeId nodeID)
        {
            ReferenceDescriptionCollection references = GetReferenceDescriptionCollection(nodeID);
            foreach (var reference in references)
            {
                Console.WriteLine(reference.NodeId);
                Recursive((NodeId)reference.NodeId);
            }
        }

        /// <summary>
        /// 获取NodeId下所有节点
        /// </summary>
        /// <param name="sourceId"></param>
        /// <returns></returns>
        static ReferenceDescriptionCollection GetReferenceDescriptionCollection(NodeId sourceId)
        {
            TaskCompletionSource<ReferenceDescriptionCollection> task = new TaskCompletionSource<ReferenceDescriptionCollection>();

            // find all of the components of the node.
            BrowseDescription nodeToBrowse1 = new BrowseDescription();

            nodeToBrowse1.NodeId = sourceId;
            nodeToBrowse1.BrowseDirection = BrowseDirection.Forward;
            nodeToBrowse1.ReferenceTypeId = ReferenceTypeIds.Aggregates;
            nodeToBrowse1.IncludeSubtypes = true;
            nodeToBrowse1.NodeClassMask = (uint)(NodeClass.Object | NodeClass.Variable | NodeClass.Method | NodeClass.ReferenceType | NodeClass.ObjectType | NodeClass.View | NodeClass.VariableType | NodeClass.DataType);
            nodeToBrowse1.ResultMask = (uint)BrowseResultMask.All;

            // find all nodes organized by the node.
            BrowseDescription nodeToBrowse2 = new BrowseDescription();

            nodeToBrowse2.NodeId = sourceId;
            nodeToBrowse2.BrowseDirection = BrowseDirection.Forward;
            nodeToBrowse2.ReferenceTypeId = ReferenceTypeIds.Organizes;
            nodeToBrowse2.IncludeSubtypes = true;
            nodeToBrowse2.NodeClassMask = (uint)(NodeClass.Object | NodeClass.Variable | NodeClass.Method | NodeClass.View | NodeClass.ReferenceType | NodeClass.ObjectType | NodeClass.VariableType | NodeClass.DataType);
            nodeToBrowse2.ResultMask = (uint)BrowseResultMask.All;

            BrowseDescriptionCollection nodesToBrowse = new BrowseDescriptionCollection();
            nodesToBrowse.Add(nodeToBrowse1);
            nodesToBrowse.Add(nodeToBrowse2);

            // fetch references from the server.
            ReferenceDescriptionCollection references = FormUtils.Browse(opcUaClient.Session, nodesToBrowse, false);
            return references;
        }
    }
}