OPC 基金会2018年公布了OPC UA Part14 –关于OPC UA 的发布/订阅模式(简称为Pub/Sub),这是一个具有里程碑意义的事件。现在,我们就来谈谈opc ua的pub/sub的意义和在open62541 开源项目下的具体测试。

发布/订阅模式

    所谓发布/订阅机制是一种以基于内容的消息传输方式,每个消息都有一个主题(Topic),网络中的客户可以发布和订阅某一主题的消息,一旦发布了某一个主题的消息,所有订阅者都将会及时收到该主题的消息。

解耦工业控制系统

    工业控制网络中网络协议,总线和设备非常多,网络的结构也非常复杂,而且往往是分级结构,难以互联互通。每个设备之间采用一种协议,点对点结构。这样的系统是称为紧耦合的架构。不适合多应用系统的部署。例如,我们在工业界推行大数据分析就遇到这样的问题,大量的运行系统通过PLC 采集,直接传送到了控制室的SCADA 中,而且SCADA是第三方软件公司在不同时期开发的,没有统一的的标准化对外开放。大数据分析软件难以合法地获取原始数据。除非你从总线上像黑客那样获取数据,或者从SCADA 数据库中扒出来。

所以,未来的数字化工业控制系统要实现数据和应用解耦。生产现场的传感器数据不再是某个特定应用程序独占。要在不同应用程序共享生产现场的数据。

不过,如果采取下面这样的模式实现生产数据的共享是不现实的。我们需要寻找一种统一的网络架构。

经典的OPC UA 协议是client/ server 的结构。client 通过一条TCP 连接读写OPC UA Server的数据。这样的架构有一个缺点就是要建立许多的TCP连接,所以这是一种会话为主的网络(session centric network)。所有称之为耦合网络(coupling network)。

相比之下使用Pub/Sub 机制网络,非常适合实现网络的扁平化,是一种解耦(decouple)系统。可以实现点对多点的传输,发送者不需要知道有多少接收者,他们是否就绪,就可以发布信息。

如下所示,就是使用MQTT 实现的工业控制系统。


实际上,现在已经有许多场合使用的MQTT ,以至于研华的网关设备中直接安装了MQTT 消息代理。三菱PLC 中集成了MQTT 协议。

而opc ua 和Pub/Sub 网相结合有利于构建一个扁平化的工业控制系统。

有助于opc ua 下沉到传感器和小型嵌入式设备中

         虽然pub/sub 完整地整合到了已有的OPC UA 技术中,但是它也使OPC UA 下沉到了车间的最底层。车间中的控制器,传感器,嵌入式设备通常需要优化地,低功耗和低延时地在本地网络中通信。所以,也需要OPC UA能够在嵌入式单片机上运行。而市面上的大多数开源软件都是在linux/windows 上实现的。德国的MatrikonOPC公司实现了单片机上的OPC UA Server的开发。它大概需要 35KB的RAM和240KB的闪存资源。我们也尝试将open62541 的代码移植到STM32F4 单片机上,后来发现还是非常复杂的事情,毕竟OPC UA 有10几个文件,大量的子程序。实现起来还是不容易的。opc pub/sub 模式的出现,给小型设备连接opc ua 提供了机会。我们只要在信息模型和pub/sub 机制上实现“opc ua 兼容”,就可以的,据国外资料介绍,能在一个2K RAM 的8位单片机上实现opc ua pub/sub 协议。这就可以实现无数小型的传感器,控制器能够安全地向互联网消息代理发送数据。更为直接地,Pub/Sub 能够使用OPC UA 在更加普及的MQTT和AMQP 互联网上传递数据。同样地,使用UDP协议在LAN 上建立低延时,低丢失的连接。

       OPC UA Pub/Sub 在时间敏感网络上的运行是另一个里程碑事件。它将使OPC UA 搭上实时通信的快车道。设备和设备之间快速地交换信息。

OPC Pub/Sub 机制的实现

四种传输层

OPC UA Pub/Sub 通过传输层传输消息。从目前公布的文件上看,OPC UA Pub/Sub 具有四种传输方式。

  1. 在LAN 中使用UDP 广播机制实现快速Pub/Sub 消息交换,UADP 消息映射
  2.  直接在Ethernet 网上传输 将UADP 消息映射到Ethernet 帧中。以太类型为0xB62C 。
  3. 通过MQTT,AMQP消息代理消息交换。
  4. 通过TSN 时间实现消息交换

    OPC UA Pub/Sub 是2018年发布的,除了UDP 方式已经在Open62541 中实现之外,在MQTT/AMQP和TSN 没有更多的东西放出来,大多数在测试床上试验。估计2019年会趋向成熟。

Open62541 Pub/Sub 测试

        OPEN62541 是一个开源的 OPC UA 项目,可以实现OPC UA 的服务器端,客户端程序。我一直使用该项目编写opc ua 的测试程序。

项目的官网:https://open62541.org/

 Github 项目:https://github.com/open62541/open62541

      Open62541.C 开源程序已经支持Pub/Sub功能。它实现在UDP 广播网段opc.udp://224.0.0.22:4840/上实现Pub/Sub 信息交换。

基本概念

UADP 消息映射

在UDP 包中传输的是UADP (UA DatagramPacket)。Pub/Sub 将服务器的变量组成所谓的Datasets。多个Dataset 形成一组,进行UADP打包,在选择的传输层传输。

数据集(DataSet)

数据集和OPC UA 的信息模型的节点相连(例如变量)。它包括了两个重要的数据结构

-PublishedDataSets

PublishedDataSets(PDS)是发布信息的容器,PDS包含了发布的变量和元信息。它包括了

  -一组变量

-事件过滤

-应用特定信息

 DataSetMetaData

-DataSetFields

     发布变量的描述命名为DataSetFields。包含了选择的一个信息模型节点。DataSetFields还包含发布,采样,出错处理的额外信息

写入组 (WriterGroup)

         你可以想象WriteGroup 是消息的生产者,你可以在WriteGroup 中添加 DataSetWrite ,可以定义发布消息的时间间隔(publishingInterval),一旦设置好之后,会自动定时地发布消息。

 

编译过程中的坑

      之前我编写自己的opc ua 应用程序的时候,都是从官网下载单一文件库(open612541.c和open62541.h),但是它们不包含Plugin 的部分,也就是说,它们不支持PubSub。要在Github 网上下载open62541-master项目,使用cmake 来编译。由于本人并不熟悉cmake 的使用。所以花费了许多时间。

 cmake 的过程

 在window 环境下没有搞成功,改成ubuntu 下编译cmake

下载程序

github 下载,解压。将文件夹改成open62541.

ubuntu 上安装 cmake-gui

运行 cmake-gui

编译开关

下面的开关要设置为ON

UA_ENABLE_PUBSUB

UA_ENABLE_PUBSUB_INFORMATIONMODEL

UA_BUILD_EXAMPLES

 编译example 中的应用实例程序。

UA_ENABLE_AMALGAMATION 

   这个开关打开时,在make 时会在build 文件夹中产生单一文件库(open62541.c和open62541.h),但是值得注意的是,当你勾选UA_BUILD_EXAMPLES时,不能勾选UA_ENABLE_AMALGAMATION。

运行make

好像在build/bin 文件夹中没有产生相关的二进制应用程序。和库

然后又运行ccmake..

使用手动方式选择编译选项 为ON

最后

make 

在build /bin 文件夹中出现了 examples 文件夹和open62541.a 程序库。运行了一下,看来成功了

cd open62541
mkdir build
cd build
cmake ..
make

# select additional features
ccmake ..
make

生成含有Pub/Sub 的单一文件库

重复上面的步骤,不过要修改下面两个编译选项:

UA_BUILD_EXAMPLES OFF

UA_ENABLE_AMALGAMATION  ON

生成Win32 下的单一文件库

生成freeRTOS/lwip 下的程序库

基于UDP 的Pub/Sub 意思还不是很大,我们期待MQTT的 OPC UA PubSub 早日出现。

 

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐