How to import NodeSet.xml into .net opc ua server

98 views Asked by At

I am currently working on a personal project where I want to use an external Nodeset into my Opc Ua Server build within .NET 8

I am currently stuck to resolve a problem with the Import of the Xml containing the Nodeset information about DI specification OPC 10000-100: Devices

As described from spec. the node DeviceSet should be visible (automatically) from any Opc Ua Viewer under the Objects folder...but it's not happening.

Here below my custom node manager with the import method

MainNodeManager.cs

using Microsoft.Extensions.Configuration;
using Opc.Ua;
using Opc.Ua.Export;
using Opc.Ua.Server;
using System.Reflection;
using OpcUaServerSample.Host.OPCUA;

namespace OpcUaServerSample.Host.NodeManagers
{
    public class MainNodeManager : CustomNodeManager2
    {
        private IDictionary<NodeId, IList<IReference>> m_externalReferences;
        private ILogger _logger;
        private OpcUaServerConfiguration m_configuration;
        private static readonly string[] ModelNamespaceUris = new string[]
        {
            OPCUA.Namespaces.OpcUaServer
        };

        public MainNodeManager(ILogger logger, IServerInternal server, ApplicationConfiguration configuration)
            : base(server, ModelNamespaceUris)
        {
            _logger = logger;

            SystemContext.NodeIdFactory = this;

            // get the configuration for the node manager.
            m_configuration = configuration.ParseExtension<OpcUaServerConfiguration>() ?? new();
        }

        public override void CreateAddressSpace(IDictionary<NodeId, IList<IReference>> externalReferences)
        {
            lock (Lock)
            {
                m_externalReferences = externalReferences;

                IList<IReference> references = null;

                if (!externalReferences.TryGetValue(ObjectIds.ObjectsFolder, out references))
                {
                    externalReferences[ObjectIds.ObjectsFolder] = references = new List<IReference>();
                }

                try
                {
                    ImportXml(externalReferences, "NodeSets\\Opc.Ua.Di.NodeSet2.xml");
                }
                catch (Exception ex)
                {
                    _logger.LogError("Something went wrong on import NodeSets", ex);
                }

                NodeState deviceSetNode = PredefinedNodes.Values.First(x => x.BrowseName.Name == "DeviceSet");

                base.CreateAddressSpace(externalReferences);
            }
        }

        private void ImportXml(IDictionary<NodeId, IList<IReference>> externalReferences, string resourcepath)
        {
            try
            {
                
                NodeStateCollection predefinedNodes = new NodeStateCollection();

                Stream stream = new FileStream(resourcepath, FileMode.Open);
                UANodeSet nodeSet = UANodeSet.Read(stream);

                foreach (string namespaceUri in nodeSet.NamespaceUris)
                {
                    SystemContext.NamespaceUris.GetIndexOrAppend(namespaceUri);
                }
                nodeSet.Import(SystemContext, predefinedNodes);

                for (int ii = 0; ii < predefinedNodes.Count; ii++)
                {
                    AddPredefinedNode(SystemContext, predefinedNodes[ii]);
                }
                // ensure the reverse refernces exist.
                AddReverseReferences(externalReferences);

                _logger.LogInformation($"NodeSet {nodeSet.NamespaceUris[0]} imported");
            }
            catch (Exception ex)
            {
                _logger.LogError("NodeSetImportNodeManager.Import: Error loading node set", ex);
                throw;
            }
        }
    }
}

Opc Ua view

enter image description here

What I tried

  • Search for any information about import
  • Search for sample

What I Expected

  • See DeviceSet node under Objects folder
0

There are 0 answers