接触OPC UA 已经有一段时间了,开始只知道它将是工业4.0 中一个重要的通信协议(IEC 62541)。出于好奇,就了解一下。我看的主要内容包括:Open62541 库和uaExpert,uamodeler等工具软件。同时也阅读了OPC UA 的标准文本和网络上的许多文章。但是总觉得云里雾里,神龙见首不见尾。
俗话说”不识庐山真面目,只缘身在此山中”。在学习电脑新技术时,我们往往会被劈头盖脑的各种术语,数据结构,函数,协议,模型带到沟里去了。而忘却了思考它是什么?它解决上什么问题?为什么这样做?这些根本的问题。有时真的搞不懂,这么复杂的东西是这么想出来的?是大公司用来故弄玄虚的么?
有一个早上,我突然顿悟,OPC UA 就是在分布式系统中实现对象的描述,什么Node呀,variable呀,reference呀,无非是想描述一个对象!OPC UA 在工业4.0 中的重要性就是通过面向对象的技术,将物理设备,传感器,电机描述成一个个对象,形成数字化模型。让不同的软件可以像调用对象那样来控制设备。
于是,我放慢心情,顺着面向对象的思路,来探究OPC UA 的本质。
面向对象程序设计
软件设计的重要一环就是将物理世界的物体抽象成数字化模型。其中最重要的技术就是面向对象的程序设计技术。例如,对于一个马达,我们可以抽象成下面的类
class motor {
float speed;
int direction;
float current;
float voltage;
float temperature;
void start();
void stop();
}
这个类描述了电机的基本特性,它们包括 速度,转动方向,工作的电流,电压和温度。其中方法包括了启动和停止。
在程序中,我们可以将motor 类实例化,并且对实例的参数参数和控制。例如:
motor motor1,motor2;
motor1.speed=1200;
motor.direction=CCW;
motor.start();
delay(10)
motor.stop();
面向对象程序设计是最流行的程序设计方法,流行的OPP 语言是C++。面向对象程序设计的最大好处是突出了接口,屏蔽了细节。提高了软件的模块化和重用性。
分布式对象
类的应用和定义是在一个程序中的。如果将面向对象的概念扩展到程序之间,或者是网络中的不同程序之间会怎么样呢?人们的确是这么做了。
分布式计算环境下,程序之间的相互调用最早采用RPC(远程过程调用) 方式。但是对于更加复杂的情况下,更好的方式是采用分布式对象技术。计算机程序可以调用网络中的任何一个对象。这也符合实际应用的需要,比如自动控制SCADA程序启动注塑机上的主电机(motorA),就演变成为调用注塑机控制器中的对象motorA的start 函数。所以将面向对象程序设计中的对象概念衍生到分布式系统中,就产生了分布式对象的概念。
常见的分布式对象技术包括了
OPC
在了解OPC UA 的之前,我们首先了解一些它的前身OPC 协议。这样更有利于了解OPC UA 的本质和由来。
OPC 是基于微软的DCOM 技术,用于设备和软件之间交换数据。 这也意味着OPC 只能在window 系统上运行.在运行OPC 之前需要配置Window 的COM/DCOM.在运行命名行 键入”DCOMCNFG”可以看见window的服务组件的配置(细节我并不了解).不过有一点可以确实,就是OPC 是在运行windows的工业PC 和上位机上方可运行.这在window 一统天下的年代的不二选择.一台PLC 如果要和OPC 上位机软件通信,必需通过Windows 工业电脑来完成..
重新认识OPC UA
现在,我们来重新来认识OPC UA 的本质吧! OPC UA 是OPC 的后继标准,只是后面增加了UA ,意指”统一架构”(Unified Architecture).它的主要目的是摆脱windows! 实现与平台无关的OPC.
从OPC 演进到OPC UA,它的目的并没有改变,依然是为了实现分布式控制系统中的分布式对象技术.但是它的方式变成了与平台无关.面向了开放系统.这也就意味着我们可以在一个Arm /linux平台上实现OPC 的server,或者在云端linux平台上实现Client 程序.
opc ua 的代码足够地小,事实上已经可以将OPC UA 的server 端直接集成到PLC ,传感器或者小型网关中.
一旦了解了事物的本质,就可以高屋建瓴地理解许多细节.现在我们在来看看OPC UA 的许多概念.
1 信息模型(Information model)
OPC UA 使用了对象(objects)作为过程系统表示数据和活动的基础。对象包含了变量,事件和方法,它们通过引用(reference)来互相连接。这个概念和面向对象程序设计方法非常相似。
OPC UA 信息模型是节点的网络(Network of Node,),或者称为结构化图(graph),由节点(node)和引用(References)组成,这种结构图称之为OPC UA 的地址空间。这种图形结构可以描述各种各样的结构化信息(对象)。
节点(nodes) : 共计有8种节点(对象,对象类型,变量,变量类型,视图,方法,引用,数据类型)
也许我们通过一些实例能够更加容易理解这种节点图描述对象的能力。
视图节点(view node)
假如我们要为一个设备建立opc ua 模型,这个设备具有一个模拟量输入,一个数字输出,两个方法 ,分别是readAnalog和ReadDigital。这个模型如果使用C++的类来描述,是下面的样子。
class sensor {
public :
double analog;
uint32_t digital
double readAnalog(int port)
uint32_t readDigital(int port)
}
如果使用节点图来描述首先要区分不同的节点类型
相应的节点图是下面的样子
如果你熟悉C++面向对象程序设计,可以将C++的类与OPCUA 的节点图对应起来,这样比较容易理解OPC UA 信息模型是如何构建的。
opc ua 的模型采用XML 文件描述,然后通过一个编译工具可以将XML 编译成C++语言的程序。
为了方便地建立 opc ua 的信息模型,需要使用模型编辑软件,它们会产生XML 的小型模型,然后编译成C语言程序。
比较流行的是uaModeler 不过这是一个商业化的软件。免费的软件有 在python的opcua-modeler,可以在下面的地址找到
https://github.com/FreeOpcUa/opcua-modeler
编译工具
python ./nodeset_compiler.py --types-array=UA_TYPES --existing ../../deps/ua-nodeset/Schema/Opc.Ua.NodeSet2.xml --xml myNS.xml myNS
使用面向对象程序设计的概念去看待OPC UA 的信息模型,有助于理解OPC UA的许多概念。至少我是这样的。
这使我想起了《数学的语言》中关于数学的定义,数学是研究模型的学科,数学靠自然和物理的手脚架搭建的,当自然和物理的手脚架撤离之后,人们却无法理解数学宫殿是如何建造的了。