OPC UA基本概念结构
标签(空格分隔): 工控 OPC
本文摘自《OPC统一架构》,作者:Wolfgang Mahnke • Stefan-Helmut Leitner•Matthias Damm
OPC UA建模的基本概念是节点以及节点之间的引用。节点可以根据不同的用途归属于不同的节点类别(NodeClass),一些节点代表实例,另一些代表类型等等。
属性(Attritube)被用来描述节点,一个节点的属性取决于NodeClass,不过,每个节点也有一些通用属性,例如:NodeId,NodeClass,BrowseName,DisplayName,Description等。
引用
从理论上讲,引用描述了两个确定节点之间的关系。因此,源节点、目标节点、引用的语义(即RefenceTyoe)和引用的方向唯一确定一个引用。
我们可以把引用看作一个指向其他节点的指针,通过保存其他节点的Id来指向另一个节点。指针可引用不存在(或不再存在)于服务器的节点,也可以引用其他服务器上的节点。
引用是两个节点之间的连接,引用不能直接访问,只能间接的通过浏览节点访问。引用有引用类型,分为分层次化引用和非层次化引用两个子类型。
例如:
1. 当需要建立层次模型时,应当使用层次化引用;例如,组织(Organizes)引用类型表示两个节点需要通过层次方式连接起来,我们可以把文件系统映射到OPC UA,文件夹可以被当做节点,使用Organsizes引用来引用其子文件夹。
2. 其他一些情况应使用非层次化引用,如暴露不同层次结构间的关系,例如,非层次化的HasTypeDefinition从一个实例引用到类型层次中的类型。
对象、变量和方法
在OPC UA中,最重要的节点类别(NodeClass)是对象、变量和方法。对象可以拥有变量和方法,而且可以触发事件。
- 节点类别为变量的节点代表一个值,客户端可以对这个值进行读取、写入和订阅其变化。
- 节点类别为方法的节点代表服务器中一个由客户端调用并返回结果的方法。每个方法指定客户端应使用的输入参数和客户端希望得到的结果即输出参数。使用方法的目的是它执行的比较快。
- 节点类别为对象的节点用于地址空间结构,对象使用变量对外提供值,对象不像变量一样拥有Value属性。对象可以用于分组管理变量,方法或其他对象。对象也可以是一个事件通知器,客户端可以订阅事件通知其来接收事件。
- 除了些通用属性,对象唯一的附加属性是用来识别对象是否可以作为事件通知器,即客户端是否可以订阅对象来接受事件,或者读取、更新事件的历史。
- 变量的附加属性比较多。值得注意的一点是,变量的数据类型(DataType)这个附加属性。变量的数据类型表示为地址空间的节点,因此这个附加属性是NodeId类型的。
- 方法的附加属性有Executable和UseExecutable,这两个是关于执行方面的。除了附加属性,方法还拥有特性(Property),说白了就是属于方法的输入输出变量。方法的输入输出参数不是通过属性描述的,而是通过变量。
对象类型和变量类型
OPC UA的地址空间定义了两种节点类别(NodeClass),ObjectType用来定义对象类型,而VariableType用来定义变量类型。方法没有对应的类型定义。方法可以绑定到一个对象类型上,从而可以在对象上使用,方法是由浏览名称和方法参数确定的,因此没有定义类型的必要。
如果使用一个概念,来解释对象类型和变量类型共同的特征,则会称之为类型定义(TypeDefinition)(个人理解,类型定义就是使用ObjectType或VariableType来定义对象或变量类型的总称)。
简单对象类型
对象类型分为简单的和复杂的。复杂对象类型暴露其下的一些节点结构,这些节点在类型的每一个实例中出现,而简单对象类型只定义对象的一些语义。
当使用NodeManagement(节点管理)服务创建一个新对象时,必须提供类型定义。新对象的一些属性没有必要被指定,可以用对象类型的默认值填充。另外对象类型支持继承。详细可以看书上的例子。
简单变量类型
像对象类型一样,变量类型也分为简单的和复杂的。
复杂对象类型
复杂对象类型暴露其下的一些节点的结构,这些节点在对象类型的每一个实例中出现。
对象类型MotorType使用的节点类别是对象类型。但它下面的所有节点的节点类别都是对象、变量或方法。这些节点都是实例而不是类型,然而它们通常不是真正的包含实际值的实例,因此它们被称为实例声明。
实例声明有一点需要注意,因为实例声明的一个主要特点是:
可以相对该对象类型,唯一标识每个实例声明,而且同样的相对标识不仅适用于该实例声明,也适用于该对象类型实例的对应部分。
只有保证这个特点才可以用对象信息类型来编程。
那么NodeId不能作为这个标识。因为实例声明与实例是不同的节点,因此NodeId肯定不同。为此,我们使用浏览路径(BrowsePath)。从对象类型开始,顺着层次化引用的前进方向标识实例声明。
复杂变量类型
复杂变量类型与复杂对象类型非常相似,但主要区别是她们只能用变量作为实例声明,而不能用对象或方法。