C# 使用OPC UA.NET读取;通道1.设备1.标记1“;来自Kepserver的值

C# 使用OPC UA.NET读取;通道1.设备1.标记1“;来自Kepserver的值,c#,.net,opc,opc-ua,kepserverex,C#,.net,Opc,Opc Ua,Kepserverex,我在这里使用NetCoreConsoleClient示例: 我定制了代码,能够浏览整个服务器,为服务器上的每个节点获取时间戳、描述、数据类型等值 对于节点“Channel1.Device1.Tag1”,我能够获取所有属性/vlue(如数据类型、地址、描述),但无法获取包含“Tag1”实际值的属性 在Kepserver上,我注意到对于“Channel1.Device.Tag1”,没有任何名为“Value”的属性保存实际的标记值 当我使用KepServer提供的“Quick Client”时,会出现

我在这里使用NetCoreConsoleClient示例:

我定制了代码,能够浏览整个服务器,为服务器上的每个节点获取时间戳、描述、数据类型等值

对于节点“Channel1.Device1.Tag1”,我能够获取所有属性/vlue(如数据类型、地址、描述),但无法获取包含“Tag1”实际值的属性

在Kepserver上,我注意到对于“Channel1.Device.Tag1”,没有任何名为“Value”的属性保存实际的标记值

当我使用KepServer提供的“Quick Client”时,会出现“Tag1”值

我需要使用自己的客户机以某种方式提取“标记”值

修改后的代码:

`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!
                        }`

通过对示例代码的点击和试用,我找到了答案

给出这些值的神奇语句是:

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

此示例使用:

您可能只需要找出需要检索的值的类型

public void ReadValueFromOPC(string host, string userName, string password)
    {
        var options = new UaClientOptions
        {
            UserIdentity = new Opc.Ua.UserIdentity(
                userName,
                password)
        };

        using (var client = new UaClient(new Uri("opc.tcp://" +
            host), options))
        {

            client.Connect();
            var node = client.FindNode("SomeTag.SomeChildTag");

            // Find out what the type is before you try to get the value
            Type type = client.GetDataType(node.Tag);
            // If you find out it's a UInt32 then you use it.
            var value = client.Read<UInt32>(node.Tag).Value;

        }
    }
public void ReadValueFromOPC(字符串主机、字符串用户名、字符串密码)
{
var选项=新的UaClientOptions
{
UserIdentity=新的Opc.Ua.UserIdentity(
用户名,
密码)
};
使用(var-client=new-UaClient(新Uri)(“opc.tcp://”)+
主机(可选)
{
client.Connect();
var node=client.FindNode(“SomeTag.sometchildtag”);
//在尝试获取值之前,请先了解类型
Type Type=client.GetDataType(node.Tag);
//如果你发现它是UInt32,那么你就使用它。
var value=client.Read(node.Tag).value;
}
}

请解释您的意思“我无法获取值…”。观察到的行为是什么?我能够获取服务器上所有节点的所有属性/值,并且对于节点“Channel1.Device1.Tag1”,我能够获取所有属性/值(如数据类型、地址、描述),但我无法获取包含“Tag1”实际值的属性。了解这种感觉:D
public void ReadValueFromOPC(string host, string userName, string password)
    {
        var options = new UaClientOptions
        {
            UserIdentity = new Opc.Ua.UserIdentity(
                userName,
                password)
        };

        using (var client = new UaClient(new Uri("opc.tcp://" +
            host), options))
        {

            client.Connect();
            var node = client.FindNode("SomeTag.SomeChildTag");

            // Find out what the type is before you try to get the value
            Type type = client.GetDataType(node.Tag);
            // If you find out it's a UInt32 then you use it.
            var value = client.Read<UInt32>(node.Tag).Value;

        }
    }