如何通过 OPC 基础 UA-.net 标准库正确使用 OPC UA 中的 TypeDefinition 和 Object 实例
How to properly use the TypeDefinition and Object instances in OPC UA with the OPC foundation UA-.net standard libraries
阅读现有的一些 OPC UA 文档
(OPC UA eBook), (github repo), (Home page)
您会遇到类型定义以及如何使用它们来绘制引用它的任何对象的蓝图。
但是,通过 github 存储库中的一些示例代码,我无法找到类型定义如何使数据访问更容易或更清晰的明确示例。
例如:
在 github 存储库的解决方案 'UA QuickStart applications' 中,有一个 windows 表单项目 'Boiler client',它在地址 space 中使用了 2 个不同的 'Boiler Type' 实例并投影了它的根据所选的组合框项目将变量添加到文本框。
查看代码时,您可以看到确实使用 'Boiler Type' 标志选择了锅炉,但要映射的属性仍然是硬编码的,并且使用相对路径而不是使用类型找到。
Two different boiler instances
Fetch boilers method
Boiler client with seperate variable display
目前,对我来说使用 OPC UA 数据(节点)意味着我必须列出我想要读取的所有节点地址中的每一个,并在 Session.Read() 或使用 MonitoredItem 监听它们。
相反,我认为应该可以读取对象中的所有节点并将它们映射到 CLR 对象。
我的问题:
C# 存储库是否可以从整个对象(使用类型定义或其他方式)捕获数据,而不必使用其地址手动读取每个节点? (阅读("node address"))
备选问题:
如果不能在消费者中使用,那么即使添加类型定义又有什么用呢?
这对 PLC 程序员来说是一种安慰吗?
我想答案已经包含在你的问题中了。是的,您使用相对路径到达实际对象的节点。但是相对路径由类型决定,并且对于该类型的所有对象都是相同的。因此,Type 为您提供了(除其他外)相对路径的知识。您可以相信相同的相对路径可以与任何此类对象一起使用这一事实。那就是你要的"leverage in a consumer"。
但是不,没有针对对象的通用 "give me all" 读取服务。您仍然需要单独阅读每篇文章。这是有道理的,因为对象的全部内容可能很大(如果不是无限的话),因此为了提高效率,客户端应用程序需要选择它实际需要的内容。同样,这个答案隐含在您的问题中,因为您写了 "I have to make a list of each and every one of all the node addresses I want to read" - 但其他人需要不同的答案。
一些服务器可能会在单个变量中提供有关对象的最重要信息,也许作为自定义数据类型,但在一般情况下您不能依赖它。
阅读现有的一些 OPC UA 文档 (OPC UA eBook), (github repo), (Home page) 您会遇到类型定义以及如何使用它们来绘制引用它的任何对象的蓝图。
但是,通过 github 存储库中的一些示例代码,我无法找到类型定义如何使数据访问更容易或更清晰的明确示例。
例如:
在 github 存储库的解决方案 'UA QuickStart applications' 中,有一个 windows 表单项目 'Boiler client',它在地址 space 中使用了 2 个不同的 'Boiler Type' 实例并投影了它的根据所选的组合框项目将变量添加到文本框。
查看代码时,您可以看到确实使用 'Boiler Type' 标志选择了锅炉,但要映射的属性仍然是硬编码的,并且使用相对路径而不是使用类型找到。
Two different boiler instances
Fetch boilers method
Boiler client with seperate variable display
目前,对我来说使用 OPC UA 数据(节点)意味着我必须列出我想要读取的所有节点地址中的每一个,并在 Session.Read() 或使用 MonitoredItem 监听它们。
相反,我认为应该可以读取对象中的所有节点并将它们映射到 CLR 对象。
我的问题: C# 存储库是否可以从整个对象(使用类型定义或其他方式)捕获数据,而不必使用其地址手动读取每个节点? (阅读("node address"))
备选问题: 如果不能在消费者中使用,那么即使添加类型定义又有什么用呢? 这对 PLC 程序员来说是一种安慰吗?
我想答案已经包含在你的问题中了。是的,您使用相对路径到达实际对象的节点。但是相对路径由类型决定,并且对于该类型的所有对象都是相同的。因此,Type 为您提供了(除其他外)相对路径的知识。您可以相信相同的相对路径可以与任何此类对象一起使用这一事实。那就是你要的"leverage in a consumer"。
但是不,没有针对对象的通用 "give me all" 读取服务。您仍然需要单独阅读每篇文章。这是有道理的,因为对象的全部内容可能很大(如果不是无限的话),因此为了提高效率,客户端应用程序需要选择它实际需要的内容。同样,这个答案隐含在您的问题中,因为您写了 "I have to make a list of each and every one of all the node addresses I want to read" - 但其他人需要不同的答案。
一些服务器可能会在单个变量中提供有关对象的最重要信息,也许作为自定义数据类型,但在一般情况下您不能依赖它。