我正在尝试使用OPC-UA客户端针对Simatic ProcessHistorian(Simatic PCS 7版本8.1)调用TranslateBrowsePathsToNodeIds
方法(在OPC-UA标准的View Service Set上定义)。
当我从UA-.NET使用Sample Client浏览服务器时,我可以在Objects root下看到两个节点:
对于Server
节点,该方法工作正常但我无法找到如何从Process Historian {7a3ea44f-b495-414c-84f9-7498095d43bd}
(实际上是数据模型)开始从树中获取节点的方法。
代码看起来像这样(C#):
var startNodeId = new NodeId(Objects.ObjectsFolder);
var browsePaths = new BrowsePathCollection
{
new BrowsePath
{
RelativePath = RelativePath.Parse(relativePath, session.TypeTree, session.NamespaceUris, session.NamespaceUris),
StartingNode = startNodeId
}
};
var responseHeader = session.TranslateBrowsePathsToNodeIds(
null,
browsePaths,
out var results,
out var diagnosticInfos);
生成的StatusCode为BadNoMatch
。
relativePath
参数为3:Process Historian {7a3ea44f-b495-414c-84f9-7498095d43bd}
(Sample Client显示为该节点的BrowseName的值)。我也试过没有3:
namespaceId前缀而没有区别。
如果我尝试将Process Historian {7a3ea44f-b495-414c-84f9-7498095d43bd}
节点的NodeId用作startNodeId
参数,则生成的StatusCode为BadNodeIdUnknown
。
相同的代码适用于其他OPC-UA服务器,如KEPServerEX或Aspen InfoPlus21。我不确定代码是否应该不同,或者ProcessHistorian是否不支持它。任何帮助表示赞赏。
修改
正如@AndrewCullen所指出的,如何获得RelativePath
实例的方法很少。我检查了UA-.NET中的代码,并尝试使用其构造函数创建RelativePath
,该构造函数控制对象的每个方面:
var qn = new QualifiedName("Process Historian {7a3ea44f-b495-414c-84f9-7498095d43bd}", 3);
var rp = new RelativePath(null, false, true, qn);
browsePaths.AddRange(relativePaths.Select(relativePath => new BrowsePath
{
RelativePath = rp,
StartingNode = startNodeId
}));
根据OPC UA Part 04 - Services(第7.26章),当未指定referenceTypeId
(RelativePath
的构造函数的第一个参数)时,包含所有引用和参数includeSubtypes被忽略。所以这个结构应该是最普遍的(如果我理解正确)。但这种方法都没有成功。
EDIT2:
为Process Historian节点附加视图节点属性:
我真正需要的是翻译标签的浏览路径。下一张图片中将显示一个样本标记的属性。
所以我需要将路径解析为3:Process Historian {7a3ea44f-b495-414c-84f9-7498095d43bd}/3:CMC/3:OSS1/3:OSS1_OSS1/3:ZAKLADAC/POC_VRSTEV.V
到其NodeId。可能还有另一个问题 - 名称中的斜线 - 我是否需要以某种方式逃避它?
EDIT3:
提交了问题答案 0 :(得分:0)
我发现RelativePath.Parse遵循第4部分 - 服务附件A.2中的字符串格式。
尝试使用正斜杠加前缀,例如“/ 3:Process Historian {7a3ea44f-b495-414c-84f9-7498095d43bd}”
PS。我看到,如果你不用“3:”,服务器就会认为你的意思是“0:”
PPS。使用仅具有参数字符串,ITypeTable的Parse版本。在这种情况下,您无需翻译命名空间。
ppps:我看到的大多数浏览名称都没有空格。我想知道为什么?
尝试阅读服务器对象?
var browsePaths = new [] { new BrowsePath { StartingNode= ObjectIds.ObjectsFolder, RelativePath=RelativePath.Parse("/0:Server/0:ServerStatus", session.TypeTree) } };
session.TranslateBrowsePathsToNodeIds(null, browsePaths, out BrowsePathResultCollection results1, out DiagnosticInfoCollection infos1);
Console.WriteLine($"Expecting 'i=2256', read {results1[0].Targets[0].TargetId}");
答案 1 :(得分:0)
所以最终结果是Proces Historian不支持TranslateBrowsePathsToNodeIds
(尽管它适用于Server
节点)。
最后我发现documentation(ch 3.9.5)Process Historian仅支持View Service Set
的以下功能:
Browse
BrowseNext
符合查看服务的View Basic
ConformanceUnit,详见OPC UA Part 7: Profiles