TranslateBrowsePathsToNodeIds()使用Simatic ProcessHistorian的OPC-UA方法

时间:2018-02-01 14:55:43

标签: opc-ua historian

我正在尝试使用OPC-UA客户端针对Simatic ProcessHistorian(Simatic PCS 7版本8.1)调用TranslateBrowsePathsToNodeIds方法(在OPC-UA标准的View Service Set上定义)。

当我从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);

生成的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章),当未指定referenceTypeIdRelativePath的构造函数的第一个参数)时,包含所有引用和参数includeSubtypes被忽略。所以这个结构应该是最普遍的(如果我理解正确)。但这种方法都没有成功。

EDIT2:

为Process Historian节点附加视图节点属性:

View Node Attributes for Process Historian node

我真正需要的是翻译标签的浏览路径。下一张图片中将显示一个样本标记的属性。

所以我需要将路径解析为3:Process Historian {7a3ea44f-b495-414c-84f9-7498095d43bd}/3:CMC/3:OSS1/3:OSS1_OSS1/3:ZAKLADAC/POC_VRSTEV.V到其NodeId。可能还有另一个问题 - 名称中的斜线 - 我是否需要以某种方式逃避它?

Tag attributes

EDIT3:

还在GitHub of OPCFoundation

提交了问题

2 个答案:

答案 0 :(得分:0)

我发现RelativePath.Parse遵循第4部分 - 服务附件A.2中的字符串格式。

尝试使用正斜杠加前缀,例如“/ 3:Process Historian {7a3ea44f-b495-414c-84f9-7498095d43bd}”

PS。我看到,如果你不用“3:”,服务器就会认为你的意思是“0:”

PPS。使用仅具有参数字符串,ITypeTable的Parse版本。在这种情况下,您无需翻译命名空间。

ppps:我看到的大多数浏览名称都没有空格。我想知道为什么?

Browse Name

尝试阅读服务器对象?

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