1. 从节点讲起
OPC UA 建模的基本, 是基于节点。一个一个的节点构成了 UaExpert 的地址空间看到的内容。
上图包括三种节点,分别用三种颜色表示出来。黄色为对象节点,绿色为变量节点,紫色为方法节点。下面我们将详细描述。
1.1 对象节点,变量节点 & 方法节点
UaExpert 的地址空间中Objects 下面通常看到的有三种节点,即是我们上面说的对象节点,变量节点,和方法节点。 它们均通过该节点的Attributes 中的NodeClass 来识别。
我们只列出一些常见的NodeClass (节点种类)。
节点类型 | 说明 |
---|---|
Object | 对象节点 |
Variable | 变量节点 |
Method | 方法节点 |
一般的, 一个对象节点 = 其他对象节点 + 变量节点+ 方法节点构成。
为了好于理解,你可以完全和OOP 中的Object 对应(object == 节点),一个Object 可以由对象+变像 +方法 构成, 但不是必须存在的,而是按需组合的。
变量节点 & 方法节点总是存在于一个对象节点下,而不能单独存在。
如何来描述一个节点呢?
属性(Attributes)+引用(References)
1.2 属性
一个节点根据节点类型的不同,有不同的属性集合组成,用以描述该节点的基本信息。但仍何一个OPCUA 节点都有以下通用属性。
属性 | 说明 |
---|---|
NodeId | OPCUA 服务器内定位一个节点的ID |
NodeClass | 节点类型,区分是对象节点,变量节点,还是方法节点的 |
BrowseName | 节点在server的搜索名称,要保证唯一性 |
DisplayName | 节点显示的名称 |
Description | 节点描述 |
WriteMask | 可选,表示节点的那些属性是可写的 |
UserWriteMask | 可选,当前用户可以写那些节点属性 |
在UaExpert 的Attributes中如下所示。
由此可知节点属性只是描述了节点类型,节点名称等相关基础信息。关于节点有那些具体内容,如该节点包含那些对象,变量,方法节点呢? 描述这个关系的被OPCUA 叫做引用。
1.3 类型&引用
引用类似于OOP中的类型申明,一个节点就像一个Object实例,这个Object实例是基于什么class 构建的,这个class 在OPCUA 中就叫做类型(Type)。每一个对象节点,变量节点在创建时,都必须要引用一个对应的类型,类型在UaExpert 的Root/Types下被定义。
上图可以看出Types 下定义了所有的节点类型(类似于OOP中的类),对象节点类型,变量节点类型等,在Root/Objects下的节点实例(OPCUA 中也称为object,但容易和对象节点产生混淆,所以我们只叫它节点)除了方法节点外,其他都需要引用对应的类型来创建(类似OOP 中object &Class的关系)。
类型也被定义为一种特殊的节点,它们的nodeClass 为XXXType(如ObjectType, VariableType等)。
值的注意的是,和对象节点,变量节点一样, 引用也有引用类型,引用类型定义了OPCUA 引用的方式。
OPCUA 提供了两种引用类型来定义引用:
- 层次化引用
- 非层次化引用
我们上面说的创建节点一般都需要引用对应的类型,属于非层次化引用中的一种。其在UaExpert 的引用中用hasTypeDefinition 来指明,该对象引用那个类型。
关于层次化引用,它更倾向于描述这个节点有那些其他节点构成,或者该节点和其他节点的关系等。其定义如下:
最常见的Organizes,它表示一个对象引用另外一个对象。
002_History 对象节点由3个变量节点+2个方法节点构成。
我们再来看下它的引用申明:
hasTypeDefinition 指明该节点基于FolderType 的对象类型创建。
Organizes 指明了它包含 引用(包含了)3个变量节点。
HasComponent 表示它引用了2个方法。
以上内容构成了002_History 的对象节点。
2. 服务
服务就是OPC UA server 提供给Client 端的API。
https://opcfoundation.cn/developer-tools/specifications-unified-architecture