C# 使用OPC UA.NET读取;通道1.设备1.标记1“;来自Kepserver的值
我在这里使用NetCoreConsoleClient示例: 我定制了代码,能够浏览整个服务器,为服务器上的每个节点获取时间戳、描述、数据类型等值 对于节点“Channel1.Device1.Tag1”,我能够获取所有属性/vlue(如数据类型、地址、描述),但无法获取包含“Tag1”实际值的属性 在Kepserver上,我注意到对于“Channel1.Device.Tag1”,没有任何名为“Value”的属性保存实际的标记值 当我使用KepServer提供的“Quick Client”时,会出现“Tag1”值 我需要使用自己的客户机以某种方式提取“标记”值 修改后的代码: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”时,会出现
`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;
}
}