使用 Simatic ProcessHistorian 的 TranslateBrowsePathsToNodeIds() OPC-UA 方法
TranslateBrowsePathsToNodeIds() OPC-UA method with Simatic ProcessHistorian
我正在尝试使用 OPC-UA 客户端针对 Simatic ProcessHistorian(Simatic PCS 7 版本 8.1)调用 TranslateBrowsePathsToNodeIds
方法(在 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);
结果 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。可能还有另一个问题 - 名称中的斜线 - 我需要以某种方式转义它吗?
编辑3:
中作为问题提交
我发现 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}");
因此最终结果是 Proces Historian 不支持 TranslateBrowsePathsToNodeIds
(尽管它适用于 Server
节点)。
最后我发现 documentation (ch 3.9.5) Process Historian 仅支持来自 View Service Set
的以下功能:
Browse
BrowseNext
符合View Services的View Basic
ConformanceUnit,详见OPC UA Part 7: Profiles
我正在尝试使用 OPC-UA 客户端针对 Simatic ProcessHistorian(Simatic PCS 7 版本 8.1)调用 TranslateBrowsePathsToNodeIds
方法(在 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);
结果 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。可能还有另一个问题 - 名称中的斜线 - 我需要以某种方式转义它吗?
编辑3:
中作为问题提交我发现 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}");
因此最终结果是 Proces Historian 不支持 TranslateBrowsePathsToNodeIds
(尽管它适用于 Server
节点)。
最后我发现 documentation (ch 3.9.5) Process Historian 仅支持来自 View Service Set
的以下功能:
Browse
BrowseNext
符合View Services的View Basic
ConformanceUnit,详见OPC UA Part 7: Profiles