Search code examples
c#.netopcopc-uakepserverex

Using OPC UA .NET read "Channel1.Device1.Tag1" value from Kepserver


enter image description hereenter image description hereI am using NetCoreConsoleClient sample from here: https://github.com/OPCFoundation/UA-.NETStandardLibrary

I customized the code and able to browse through entire server and fetch values like timestamp, description, datatype etc., for every node on the server.

For the node "Channel1.Device1.Tag1" I am able to fetch all properties/vlaues(like DataType, Address, Description) but I am not getting the the property which hold actual value of the "Tag1"

On the Kepserver, I noticed that for "Channel1.Device.Tag1" there is no any property named as "Value" which holds actual tag value.

"Tag1" value appears when I use "Quick Client" provided by KepServer.

I need to fetch out the "tag" value somehow using my own client.

Modified piece of code :

`Console.WriteLine("4 - Browse the OPC UA server namespace.");
        ReferenceDescriptionCollection references;
        Byte[] continuationPoint;

        references = session.FetchReferences(ObjectIds.ObjectsFolder);

        session.Browse(
            null,
            null,
           ObjectIds.ObjectsFolder,
            //ObjectIds.RootFolder,
            0u,
            BrowseDirection.Forward,
            ReferenceTypeIds.HierarchicalReferences,
            true,
            (uint)NodeClass.Variable | (uint)NodeClass.Object | (uint)NodeClass.Method,
            out continuationPoint,
            out references);

        Console.WriteLine(" DisplayName, BrowseName, NodeClass");
        foreach (var rd in references)
        {
            Console.WriteLine(" {0}, {1}, {2}", rd.DisplayName, rd.BrowseName, rd.NodeClass);
            ReferenceDescriptionCollection nextRefs;
            byte[] nextCp;
            session.Browse(
                null,
                null,
                ExpandedNodeId.ToNodeId(rd.NodeId, session.NamespaceUris),
                0u,
                BrowseDirection.Forward,
                ReferenceTypeIds.HierarchicalReferences,
                true,
                (uint)NodeClass.Variable | (uint)NodeClass.Object | (uint)NodeClass.Method,
                out nextCp,
                out nextRefs);
            foreach (var nextRd in nextRefs)
            {
                Console.WriteLine("   + {0}, {1}, {2}", nextRd.DisplayName, nextRd.BrowseName, nextRd.NodeClass);
                ReferenceDescriptionCollection nextRefs1;
                byte[] nextCp1;
                session.Browse(
                   null,
                   null,
                   ExpandedNodeId.ToNodeId(nextRd.NodeId, session.NamespaceUris),
                   0u,
                   BrowseDirection.Forward,
                   ReferenceTypeIds.HierarchicalReferences,
                   true,
                   (uint)NodeClass.Variable | (uint)NodeClass.Object | (uint)NodeClass.Method,
                   out nextCp1,
                   out nextRefs1);
                foreach (var nextRd1 in nextRefs1)
                {
                    Console.WriteLine("   + {0}, {1}, {2}", nextRd1.DisplayName, nextRd1.BrowseName, nextRd1.NodeClass);
                    ReferenceDescriptionCollection nextRefs2;
                    byte[] nextCp2;
                   var res =  session.Browse(
                        null, null,
                        ExpandedNodeId.ToNodeId(nextRd1.NodeId, session.NamespaceUris), 0u, BrowseDirection.Forward,
                        ReferenceTypeIds.HierarchicalReferences, true,
                        (uint)NodeClass.Variable | (uint)NodeClass.Object | (uint)NodeClass.Method, out nextCp2, out nextRefs2);
                    double maxAge = 0; //Pick 0 millisecond old value directly from device not from the cache.
                    DataValueCollection results;
                    DiagnosticInfoCollection diagInfos;
                    ReadValueIdCollection readValueIds;
                    foreach (var nextRd2 in nextRefs2)
                    {
                        try
                        {
                            if (!nextRd2.NodeId.IsNull)
                            {
                                var node = ExpandedNodeId.ToNodeId(nextRd2.NodeId, session.NamespaceUris);
                                if (node != null)
                                {
                                    DataValue dv = session.ReadValue(node);
                                    ReferenceDescriptionCollection nextRefs3;
                                    byte[] nextCp3;
                                    var res1 = session.Browse(null, null,
                                           ExpandedNodeId.ToNodeId(nextRd2.NodeId, session.NamespaceUris), 0u, BrowseDirection.Forward,
                                           ReferenceTypeIds.HierarchicalReferences, true,
                                           (uint)NodeClass.Variable | (uint)NodeClass.Object | (uint)NodeClass.Method, out nextCp3, out nextRefs3);
                                    foreach (var nextRd3 in nextRefs3)
                                    {
                                        if (!nextRd3.NodeId.IsNull)
                                        {
                                            var node1 = ExpandedNodeId.ToNodeId(nextRd3.NodeId, session.NamespaceUris);
                                            if (node1 != null)
                                            {
                                                DataValue dv2 = session.ReadValue(node1);
                                            }
                                        }
                                    }
                                }
                            }
                        }
                        catch (ServiceResultException srex)
                        {
                            //eat exception yum yum yum!
                        }
                        catch (Exception ex)
                        {

                            //eat exception yum yum yum!
                        }`

Solution

  • By hit and trial on the sample code, I found the answer.

    The magical statement which gives the values is :

    DataValue dv1 = session.ReadValue("ns=2;s=Channel1.Device1.Tag1");

                    foreach (var nextRd1 in nextRefs1)
                    {
                        Console.WriteLine("   + {0}, {1}, {2}", nextRd1.DisplayName, nextRd1.BrowseName, nextRd1.NodeClass);
                        try
                        {
                            var _node = ExpandedNodeId.ToNodeId(nextRd1.NodeId, session.NamespaceUris);
                            DataValue dv2 = session.ReadValue(_node);
                        }