目录
1、OPC UA
2、节点
3、对象、变量和方法
对象类型和变量类型
简单对象类型
简单变量类型
复杂对象类型
复杂变量类型
4、编译
OPC UA(Unified Architecture,统一架构)是下一代的OPC 标准,通过提供一个完整的,安全和可靠的跨平台的架构,以获取实时和历史数据和时间。
OPC UA接口协议包含了之前的 A&E, DA,OPC XML DA or HDA【数据访问(DA)、报警和事件(AE)、历史数据访问(HDA)】,只使用一个地址空间就能访问之前所有的对象,而且不受WINDOWS平台限制,因为它是从传输层Scoket以上来定义的,灵活性和安全性比之前的OPC都提升了。
OPC UA建模的基本概念是节点以及节点之间的引用。节点可以根据不同的用途归属于不同的节点类别(NodeClass),一些节点代表实例,另一些代表类型等等。
OPCUA_NODECLASS_INVALID = 0,
OPCUA_NODECLASS_OBJECT = 1,
OPCUA_NODECLASS_VARIABLE = 2,
OPCUA_NODECLASS_METHOD = 4,
OPCUA_NODECLASS_OBJECT_TYPE = 8,
OPCUA_NODECLASS_VARIABLE_TYPE = 16,
OPCUA_NODECLASS_REFERENCE_TYPE = 32,
OPCUA_NODECLASS_DATA_TYPE = 64,
OPCUA_NODECLASS_VIEW = 128,
OPCUA_NODECLASS_END
属性(Attritube)被用来描述节点,一个节点的属性取决于NodeClass,不过,每个节点也有一些通用属性,例如:NodeId ,NodeClass ,BrowseName ,DisplayName ,Description等。
在OPC UA中,最重要的节点类别(NodeClass)是对象、变量和方法。对象可以拥有变量和方法,而且可以触发事件。
- 节点类别为变量的节点代表一个值,客户端可以对这个值进行读取、写入和订阅其变化。
- 节点类别为方法的节点代表服务器中一个由客户端调用并返回结果的方法。每个方法指定客户端应使用的输入参数和客户端希望得到的结果即输出参数。使用方法的目的是它执行的比较快。
- 节点类别为对象的节点用于地址空间结构,对象使用变量对外提供值,对象不像变量一样拥有Value属性。对象可以用于分组管理变量,方法或其他对象。对象也可以是一个事件通知器,客户端可以订阅事件通知其来接收事件。
- 除了些通用属性,对象唯一的附加属性是用来识别对象是否可以作为事件通知器,即客户端是否可以订阅对象来接受事件,或者读取、更新事件的历史。
- 变量的附加属性比较多。值得注意的一点是,变量的数据类型(DataType)这个附加属性。变量的数据类型表示为地址空间的节点,因此这个附加属性是NodeId类型的。
- 方法的附加属性有Executable和UseExecutable,这两个是关于执行方面的。除了附加属性,方法还拥有特性(Property),说白了就是属于方法的输入输出变量。方法的输入输出参数不是通过属性描述的,而是通过变量。
OPC UA的地址空间定义了两种节点类别(NodeClass),ObjectType用来定义对象类型,而VariableType用来定义变量类型。方法没有对应的类型定义。方法可以绑定到一个对象类型上,从而可以在对象上使用,方法是由浏览名称和方法参数确定的,因此没有定义类型的必要。
如果使用一个概念,来解释对象类型和变量类型共同的特征,则会称之为类型定义(TypeDefinition)(个人理解,类型定义就是使用ObjectType或VariableType来定义对象或变量类型的总称)。
对象类型分为简单的和复杂的。复杂对象类型暴露其下的一些节点结构,这些节点在类型的每一个实例中出现,而简单对象类型只定义对象的一些语义。
当使用NodeManagement(节点管理)服务创建一个新对象时,必须提供类型定义。新对象的一些属性没有必要被指定,可以用对象类型的默认值填充。另外对象类型支持继承。详细可以看书上的例子。
像对象类型一样,变量类型也分为简单的和复杂的。
复杂对象类型暴露其下的一些节点的结构,这些节点在对象类型的每一个实例中出现。
对象类型MotorType使用的节点类别是对象类型。但它下面的所有节点的节点类别都是对象、变量或方法。这些节点都是实例而不是类型,然而它们通常不是真正的包含实际值的实例,因此它们被称为实例声明。
实例声明有一点需要注意,因为实例声明的一个主要特点是:
可以相对该对象类型,唯一标识每个实例声明,而且同样的相对标识不仅适用于该实例声明,也适用于该对象类型实例的对应部分。
只有保证这个特点才可以用对象信息类型来编程。
那么NodeId不能作为这个标识。因为实例声明与实例是不同的节点,因此NodeId肯定不同。为此,我们使用浏览路径(BrowsePath)。从对象类型开始,顺着层次化引用的前进方向标识实例声明。
复杂变量类型与复杂对象类型非常相似,但主要区别是她们只能用变量作为实例声明,而不能用对象或方法。
我这里是在Linux下,用makefile+gcc编译,需要安装libssl-dev的库,然后添加到gcc命令:LFLAGS += -lpthread -lcrypto
有需要如下测试软件的可以留言,邮件。我这有win和Linux的。
server:
client: