学习open62541 --- [20] 标准Reference类型_referencetype-程序员宅基地

技术标签: C/C++  open62541  

在OPC UA Server中,所有Node之间都是使用Reference进行连接的。Reference有很多类型,在之前的系列文章中,我们也已经见过几种Reference了,本文就专门讨论所有标准Rference类型。


一 Reference的使用方式

如果看过前面的系列文章,那么就会对Reference的使用方式有一定的理解,如下图,
在这里插入图片描述
节点A通过一个Reference指向B,那么对于这个Reference来说A是Source节点,B是Target节点。

同理,如果B也通过另外一个Reference指向A,那么从这个Reference来说B是Source节点,A是target节点。

特别要注意,这2个Reference是不同的。


二 标准Reference类型的结构图

图片来自OPC UA文档,图中包含了所有的Reference类型,总共18个
在这里插入图片描述
第一次看到这幅图时有点吓人,但是详细分析后就会发现挺简单的。下面是对图片的分析,

  • 整幅图描述的是Reference类型的继承关系图
  • 双箭头指向的一边是父类型,另外一边是子类型,子类型继承父类型
  • 属于Abstract的类型只能用来被继承,属于Concrete的类型可以被继承,也可以用来实例化对象

下面是对图中所有Reference类型的全面分析。按照从上到下,

1. References

整幅图中位于最上面位置的Reference类型,属于Abstract,不可以用来实例化对象,没有任何语义,是所有Reference类型的基类,其它类型都必须直接或间接继承它。

2. HierarchicalReferences

属于Abstract,不可以用来实例化对象,直接继承于References,Hierarchical的意思是层次,语义是该种类型的Reference可以把Node组成一个层次结构,甚至是那种环形的层次结构。

由于HierarchicalReferences是Abstract,所以它只能被继承,对于其子类来说,Source节点不允许是Property(Property也是一种变量节点,用处不一样),因为Property只能作为层次中的叶子,这是OPCUA文档的规定。

不允许节点使用HierarchicalReferences直接指向自己,这种称为self-references。可是前面不是说可以形成环形的层次结构吗?这是因为节点可以使用Reference间接的指向自己(如A->B->A),直接不行。

3. NonHierarchicalReferences

属于Abstract,不可以用来实例化对象,直接继承于References,语义是不能用于组成层次结构,假设节点A使用这种Reference的子类型指向了B,那么B后面就不能再有Reference指向其它节点了。多用于组成层次结构的叶子。

中途小结:
为了区分Hierarchical和NonHierarchical,所有concrete的子类都必须直接或间接继承于这2种类型,即HierarchicalReferences和NonHierarchicalReferences,这样就可以把所有concrete的子类分成这2大类了。

4. HasChild

属于Abstract,不可以用来实例化对象,直接继承于HierarchicalReferences,语义是该类型的Reference可以形成一个非循环的层次(non-looping hierarchy)。
假设从节点A开始,顺着这个Reference的子类型,绝对不允许又指回A,如果允许那么A和A本身互为父子关系,就矛盾了。允许顺着这个Reference的子类型,有多条路径指向相同节点,如B

5. Aggregates

属于Abstract,不可以用来实例化对象,直接继承于HasChild,语义是Target节点是Source节点的一部分,但是没有指明Target节点的所有权(ownership)。

如何理解所有权?假如B的所有权在A,那么当A被销毁时,B也会被销毁,假如B的所有权不在A,那么当A被销毁时,B不会被销毁。

6. HasComponent

属于Concrete,可以用来实例化对象,直接继承于Aggregates,语义是Target节点是Source节点的一部分,没有指明Target节点的所有权(ownership)。

常用于把对象或对象类型和它们包含的对象、数据变量和方法联系在一起。也可以把复合变量或变量类型和它们的数据变量联系在一起。

7. HasProperty

属于Concrete,可以用来实例化对象,直接继承于Aggregates,语义是用来找到节点的属性。
这个Reference的Source节点可以是任意NodeClass,但是Target节点必须是个变量,这样这个变量就变成了Property了

一个Property不能拥有自己Property,所以Property不能是HasProperty的Source节点。

8. HasOrderedComponent

属于Concrete,可以用来实例化对象,直接继承于HasComponent,语义除了HasComponent原本语义之外,还有个order,即有序,举例说明:
假设A使用HasOrderedComponent添加了多个节点,那么当浏览A包含的节点时,A返回的节点顺序和添加时是一样的,并且多次浏览返回的顺序都是一样的。

9. HasSubtype

属于Concrete,可以用来实例化对象,直接继承于HasChild,语义是表示类型之间subtype关系,也就是表示类型之间继承关系,如B类型继承于A类型,那么A类型就可以有一个HasSubtype的reference指向B类型。

HasSubtype的Source节点是一个ObjectType, 或一个VariableType, 或一个DataType 或 一个ReferenceType,Target节点和Source节点必须属于相同的NodeClass。

如果Target节点是ReferenceTyppe,那么只能最多一个HasSubType的Reference指向它。

10. Organizes

属于Concrete,可以用来实例化对象,直接继承于HierarchicalReferences,语义是用来在地址空间中组织节点。

Organizes 的Source节点必须是一个Object或一个View,如果是一个Object,那么其类型应当是FolderType或者FolderType的子类型。

举个类似的例子:我们创建了一个叫动物的目录,下面又创建了犬科,猫科等目录,这个动物目录和犬科目录,猫科目录的关系就是organize,用来组织归类

Organizes 的Target节点可以是任意NodeClass。

11. HasModellingRule

属于Concrete,可以直接用来实例化对象,直接继承于NonHierarchicalReferences,语义是用来把ModellingRule绑定到Object,Variable或Method上,用于指定Object,Variable或Method的创建规则。

例如,如果ModellingRule是mandatory,那么这个Object,Variable或Method就必须被创建。

HasModellingRule的Source节点是Object,Variable或Method,Target节点是ModellingRule类型或ModellingRule的子类型创建的对象。

每个节点最多有一个HasModellingRule类型的Reference对象。

12. HasTypeDefinition

属于Concrete,可以直接用来实例化对象,直接继承于NonHierarchicalReferences,语义是把Object或Variable和ObjectType或VariableType绑定到一起,也就是指示Object或Variable属于哪个类型。

HasTypeDefinition的Source节点是一个Object或Variable,相应的,Target节点则是一个ObjectType或VariableType。

每个Object或Variable只能有一个HasTypeDefinition类型的Reference指向对应类型。

13. HasEncoding

属于Concrete,可以直接用来实例化对象,直接继承于NonHierarchicalReferences,语义是用来指示一个DataType的DataTypeEncoding。

HasEncoding的Source节点是一个DataType,Target节点是DataTypeEncodingType类型或者DataTypeEncodingType的子类型的对象。

14. HasDescription

属于Concrete,可以直接用来实例化对象,直接继承于NonHierarchicalReferences,语义是用来指示一个DataTypeEncoding的DataTypeDescription。

HasDescription的Source节点是DataTypeEncodingType类型或者DataTypeEncodingType的子类型的对象,Target节点是DataTypeDescriptionType类型或者DataTypeDescriptionType的子类型创建的Variable。

15. GeneratesEvent

属于Concrete,可以直接用来实例化对象,直接继承于NonHierarchicalReferences,语义是用来指示ObjectTypes或VariableTypes可能产生哪些类型的事件,或者发生Methods调用时产生哪些类型的事件。

GeneratesEvent的Source节点是一个ObjectType,一个VariableType 或 一个Method,Target节点是表示事件类型的ObjectType,即BaseEventType或BaseEventType的子类型。

16. AlwaysGeneratesEvent

属于Concrete,可以直接用来实例化对象,直接继承于GeneratesEvent,语义是用来表示一个Method每次发生调用时必须生成某种类型的事件。

AlwaysGeneratesEvent的Source节点是一个Method,Target节点是表示事件类型的ObjectType,即BaseEventType或BaseEventType的子类型。

17. HasEventSource

属于Concrete,可以直接用来实例化对象,直接继承于HierarchicalReferences,语义是用来把事件源(event source)关联到hierarchical, non-looping结构中来。可用来在Server中发现产生的事件。

HasEventSource的Source节点是一个Object,该Object可作为事件订阅的源,也就是这个Object可以发出事件,其它订阅该对象的节点可以收到发出的事件。 Object的EventNotifier属性中SubscribeToEvents位要置1,典型的就是Server对象,如下图示,
在这里插入图片描述
在这里插入图片描述

HasEventSource的Target节点可以是任意NodeClass的节点,只是这个节点可以通过订阅参考源来产生事件。

这里再举例总结一下:假设有个锅炉,我们需要监测其温度,温度过高时需要往锅里加水,温度过低时需要往炉里添煤,这个锅炉温度就是实际的源,我们建立一个Node叫A,A不断检查锅炉温度,当温度过高或过低就会发出一个事件,那么A就是event source,我们再建立一个Node叫B,B使用HasEventSource和A相连,我们再建立2个Node叫C和D,C和D订阅B,这样当A监测到温度过高或过低时,就会通知B,然后B再发出事件通知C和D。

18. HasNotifier

属于Concrete,可以直接用来实例化对象,直接继承于HasEventSource,语义是用来把notifier对象节点关联起来。所谓notifier对象就是事件通知器对象,这个ReferenceType的目的是用于建立notifier对象之间的层级组织结构。

HasNotifier的Source节点是一个Object或View,这个Object或View可作为事件订阅的源(参考HasEventSource的解释)

HasNotifier的Target节点是一个Object,这个Object可以作为事件订阅的源(参考HasEventSource的解释)

核心理解 :Target节点产生事件后,这个事件会传递给Source节点,Target节点就扮演了通知器的角色。这样就可以实现事件的传递,这也是建立notifier对象之间的层级组织结构的原因。

下面是个例子
在这里插入图片描述
图中节点关系如下描述,

  • Area 1,Tank A,Machine B,Pump和Temp Sensor使用HasNotifier组成层级结构
  • Tank A有一个事件源叫Phase Start
  • Pump有2个事件源叫Start和Stop
  • Temp Sensor有一个事件源叫Calibration

如果Calibration产生了一个事件,这个事件就会发给Temp Sensor,然后再传给Tank A,最后传给Area 1;如果Phase Start产生了一个事件,这个事件就会发给Tank A,然后传给Area 1,但是不会传给Pump,Temp Sensor和Machine B


三 总结

本文简述了18个标准ReferenceType,Reference作为Node之间的纽带,是个非常重要的概念。平时使用时一般只会用到Concrete类型,如下

HierarchicalReferences NonHierarchicalReferences
HasComponent HasModellingRule
HasProperty HasTypeDefinition
HasOrderedComponent HasEncoding
HasSubtype HasDescription
Organizes GeneratesEvent
HasEventSource AlwaysGeneratesEvent
HasNotifier

虽然数量还是不少,但是实际使用时只会重点用到几个。

如果有写的不对的地方,希望能留言指正,谢谢阅读。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/whahu1989/article/details/104418361

智能推荐

JWT(Json Web Token)实现无状态登录_无状态token登录-程序员宅基地

文章浏览阅读685次。1.1.什么是有状态?有状态服务,即服务端需要记录每次会话的客户端信息,从而识别客户端身份,根据用户身份进行请求的处理,典型的设计如tomcat中的session。例如登录:用户登录后,我们把登录者的信息保存在服务端session中,并且给用户一个cookie值,记录对应的session。然后下次请求,用户携带cookie值来,我们就能识别到对应session,从而找到用户的信息。缺点是什么?服务端保存大量数据,增加服务端压力 服务端保存用户状态,无法进行水平扩展 客户端请求依赖服务.._无状态token登录

SDUT OJ逆置正整数-程序员宅基地

文章浏览阅读293次。SDUT OnlineJudge#include<iostream>using namespace std;int main(){int a,b,c,d;cin>>a;b=a%10;c=a/10%10;d=a/100%10;int key[3];key[0]=b;key[1]=c;key[2]=d;for(int i = 0;i<3;i++){ if(key[i]!=0) { cout<<key[i.

年终奖盲区_年终奖盲区表-程序员宅基地

文章浏览阅读2.2k次。年终奖采用的平均每月的收入来评定缴税级数的,速算扣除数也按照月份计算出来,但是最终减去的也是一个月的速算扣除数。为什么这么做呢,这样的收的税更多啊,年终也是一个月的收入,凭什么减去12*速算扣除数了?这个霸道(不要脸)的说法,我们只能合理避免的这些跨级的区域了,那具体是那些区域呢?可以参考下面的表格:年终奖一列标红的一对便是盲区的上下线,发放年终奖的数额一定一定要避免这个区域,不然公司多花了钱..._年终奖盲区表

matlab 提取struct结构体中某个字段所有变量的值_matlab读取struct类型数据中的值-程序员宅基地

文章浏览阅读7.5k次,点赞5次,收藏19次。matlab结构体struct字段变量值提取_matlab读取struct类型数据中的值

Android fragment的用法_android reader fragment-程序员宅基地

文章浏览阅读4.8k次。1,什么情况下使用fragment通常用来作为一个activity的用户界面的一部分例如, 一个新闻应用可以在屏幕左侧使用一个fragment来展示一个文章的列表,然后在屏幕右侧使用另一个fragment来展示一篇文章 – 2个fragment并排显示在相同的一个activity中,并且每一个fragment拥有它自己的一套生命周期回调方法,并且处理它们自己的用户输_android reader fragment

FFT of waveIn audio signals-程序员宅基地

文章浏览阅读2.8k次。FFT of waveIn audio signalsBy Aqiruse An article on using the Fast Fourier Transform on audio signals. IntroductionThe Fast Fourier Transform (FFT) allows users to view the spectrum content of _fft of wavein audio signals

随便推点

Awesome Mac:收集的非常全面好用的Mac应用程序、软件以及工具_awesomemac-程序员宅基地

文章浏览阅读5.9k次。https://jaywcjlove.github.io/awesome-mac/ 这个仓库主要是收集非常好用的Mac应用程序、软件以及工具,主要面向开发者和设计师。有这个想法是因为我最近发了一篇较为火爆的涨粉儿微信公众号文章《工具武装的前端开发工程师》,于是建了这么一个仓库,持续更新作为补充,搜集更多好用的软件工具。请Star、Pull Request或者使劲搓它 issu_awesomemac

java前端技术---jquery基础详解_简介java中jquery技术-程序员宅基地

文章浏览阅读616次。一.jquery简介 jQuery是一个快速的,简洁的javaScript库,使用户能更方便地处理HTML documents、events、实现动画效果,并且方便地为网站提供AJAX交互 jQuery 的功能概括1、html 的元素选取2、html的元素操作3、html dom遍历和修改4、js特效和动画效果5、css操作6、html事件操作7、ajax_简介java中jquery技术

Ant Design Table换滚动条的样式_ant design ::-webkit-scrollbar-corner-程序员宅基地

文章浏览阅读1.6w次,点赞5次,收藏19次。我修改的是表格的固定列滚动而产生的滚动条引用Table的组件的css文件中加入下面的样式:.ant-table-body{ &amp;amp;::-webkit-scrollbar { height: 5px; } &amp;amp;::-webkit-scrollbar-thumb { border-radius: 5px; -webkit-box..._ant design ::-webkit-scrollbar-corner

javaWeb毕设分享 健身俱乐部会员管理系统【源码+论文】-程序员宅基地

文章浏览阅读269次。基于JSP的健身俱乐部会员管理系统项目分享:见文末!

论文开题报告怎么写?_开题报告研究难点-程序员宅基地

文章浏览阅读1.8k次,点赞2次,收藏15次。同学们,是不是又到了一年一度写开题报告的时候呀?是不是还在为不知道论文的开题报告怎么写而苦恼?Take it easy!我带着倾尽我所有开题报告写作经验总结出来的最强保姆级开题报告解说来啦,一定让你脱胎换骨,顺利拿下开题报告这个高塔,你确定还不赶快点赞收藏学起来吗?_开题报告研究难点

原生JS 与 VUE获取父级、子级、兄弟节点的方法 及一些DOM对象的获取_获取子节点的路径 vue-程序员宅基地

文章浏览阅读6k次,点赞4次,收藏17次。原生先获取对象var a = document.getElementById("dom");vue先添加ref <div class="" ref="divBox">获取对象let a = this.$refs.divBox获取父、子、兄弟节点方法var b = a.childNodes; 获取a的全部子节点 var c = a.parentNode; 获取a的父节点var d = a.nextSbiling; 获取a的下一个兄弟节点 var e = a.previ_获取子节点的路径 vue