如何在OPC UA中正确使用OPC foundation UA-.net标准库的TypeDefinition和Object实例。

问题描述 投票:1回答:1

阅读了一些OPC UA文件,这些文件是有的(OPC UA电子书), (github repo), (首页)你会遇到类型定义,以及如何使用它们来绘制任何引用它的对象的蓝图。

然而,通过github repo中的一些示例代码,我找不到一个清晰的例子来说明类型定义是如何使数据访问更容易或更干净的。

例如:在github repo中的 "UA QuickStart applications "解决方案中,有一个windows窗体项目 "Boiler client",它在地址空间中使用了2个不同的 "Boiler Type "实例,并根据所选的组合框项目将其变量投射到文本框中。当查看代码时,你可以看到锅炉确实是使用'锅炉类型'标志来选择的,但要映射的属性仍然是硬编码的,并使用相对路径而不是使用类型来查找。

两个不同的锅炉实例

获取锅炉方法

锅炉客户端有独立的变量显示。

目前,对我来说,消耗OPC UA数据(节点)意味着我必须将所有我想读取的节点地址列成一个列表,然后在Session.Read()中使用它们或用MonitoredItem监听它们。相反,我认为应该可以读取一个对象中的所有节点,并将它们映射到CLR对象上。

我的问题。在C#回购中,是否可以从整个对象中捕获数据(使用类型定义或其他方式),而不是通过地址手动读取每个节点?(read("节点地址"))

另一个问题。如果不能在消费者中利用,即使增加一个类型定义又有什么用?这对PLC程序员来说是一种安慰吗?

c# plc opc opc-ua
1个回答
0
投票

我想答案已经包含在你的问题中了。是的,你使用相对路径来到达实际Object的节点。但是相对路径是由类型决定的,而且对于该类型的所有对象都是一样的。所以,类型给了你(除其他外)相对路径的知识。而且你可以依赖这样一个事实,即相同的相对路径可以用于任何这样的对象。这就是你所要求的 "消费者的杠杆作用"。

但是没有,对于一个Object来说,没有一个通用的 "给我所有 "的读取服务。你仍然需要单独读取每一块内容。这是有意义的,因为Object的全部内容可能是巨大的(甚至是无限的),所以为了提高效率,客户端应用需要选择它实际需要的内容。同样,这个答案隐含在你的问题中,因为你写道:"我必须把我要读取的所有节点地址一一列出来"--但别人会需要不同的。

一些服务器可能会在一个单一的Variable中提供关于对象的最重要的信息,也许是作为自定义DataType,但在一般情况下你不能依赖它。

© www.soinside.com 2019 - 2024. All rights reserved.