【发布时间】:2018-02-01 14:55:43
【问题描述】:
我正在尝试使用 OPC-UA 客户端针对 Simatic ProcessHistorian(Simatic PCS 7 版本 8.1)调用 TranslateBrowsePathsToNodeIds 方法(在 OPC-UA 标准的查看服务集上定义)。
当我使用来自 UA-.NET 的 Sample Client 浏览服务器时,我可以在 Objects root 下看到两个节点:
- 服务器
- 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 是否不支持它。任何帮助表示赞赏。
编辑:
正如@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。可能还有另一个问题 - 名称中的斜线 - 我需要以某种方式对其进行转义吗?
编辑3:
也作为问题提交至GitHub of OPCFoundation
【问题讨论】: