我正在尝试TranslateBrowsePathsToNodeIds
使用 OPC-UA 客户端针对 Simatic ProcessHistorian(Simatic PCS 7 版本 8.1)调用方法(在 OPC-UA 标准的查看服务集上定义)。
当我使用来自UA-.NET的示例客户端浏览服务器时,我可以在对象根目录下看到两个节点:
- 服务器
- Process Historian {7a3ea44f-b495-414c-84f9-7498095d43bd}
对于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);
结果状态码是BadNoMatch
。
relativePath
参数是3:Process Historian {7a3ea44f-b495-414c-84f9-7498095d43bd}
(示例客户端显示为该节点的 BrowseName 的值)。我也试过没有3:
namespaceId 前缀,没有区别。
如果我尝试使用Process Historian {7a3ea44f-b495-414c-84f9-7498095d43bd}
节点的 NodeId 作为startNodeId
参数,则生成的 StatusCode 为BadNodeIdUnknown
.
相同的代码适用于其他 OPC-UA 服务器,如 KEPServerEX 或 Aspen InfoPlus21。我不确定代码是否应该不同,或者 ProcessHistorian 是否不支持它。任何帮助表示赞赏。
编辑:RelativePath
正如@AndrewCullen 指出的,获取实例
的方法很少。我检查了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 第 04 部分 - 服务(第 7.26 章),如果referenceTypeId
未指定(RelativePath
构造函数的第一个参数),则包含所有引用并忽略参数 includeSubtypes。所以这个结构应该是最普遍的(如果我理解正确的话)。但这种方法都没有成功。
编辑2:
为 Process Historian 节点附加视图节点属性:
而我真正需要的是翻译标签的浏览路径。一个示例标签的属性如下图所示。
所以我需要将路径解析为:3:Process Historian {7a3ea44f-b495-414c-84f9-7498095d43bd}/3:CMC/3:OSS1/3:OSS1_OSS1/3:ZAKLADAC/POC_VRSTEV.V
到它的NodeId。可能还有另一个问题 - 名称中的斜线 - 我需要以某种方式逃避它吗?
编辑3: