IEC61499 标准是面向分布式工业自动化控制系统,与PLC 相比,IEC61499 突出了分布式的概念,也就是说,一个工业自动化控制程序将在多个设备上运行。
在传统的分布式控制系统的设计过程是
1 需求分析
2 确定分散控制设备的数量,位置和实现的功能定义
3 确定网络类型和协议。 协议中还包括了设备之间数据接口,相互交互的方式,就是所谓的网络API。
4 分别设计各个设备的程序,然后联调系统
如果设计过这样的分布式系统的工程师,都会深切地感受到这一过程是十分繁重的工作。研发周期长,成本高,维护和修改困难。
而IEC61499标准针对分布式系统,提出了一种全新的设计方法。从应用模型入手,为控制系统设计一个统一的应用程序功能块网络。然后映射到各个设备中去。在下图中,功能块FB1 被映射到Device1,而功能块FB2 映射到设备2 中。当应用模型分布在多个设备上的时候,功能块之间的事件和数据传送就需要通过网络来实现。在4 diac 的实现中,当功能块网络映射到设备时,会自动地添加通信功能块,比如下图中,在Device1 的功能块网络中添加的订阅(SUB)和发布(PUB) 功能块。而在Device2 的网络中添加了SUB 功能块。Publish /Subscribe 是一种点对多点的通信机制。非常适合功能块事件的传输。
IEC61499 似乎并没有规定publish/subscribe 的协议。在4DIAC 中默认PUB/SUB 是基于TCP 的pub/sub 机制。也可以使用其它的pub/sub协议。通过服务接口功能块(SIFB)来实现。比如MQTT 协议。
显然,在分布式控制系统中,通信网络的性能直接会影响到系统的性能。网络协议对于IEC61499 分布式系统是十分重要的。在本文我们详细地介绍4DIAC 的网络架构。
通信功能块
默认的通信功能块
我觉得4DIAC 的文档并没有描述的特别清楚。 我的理解是在4diac 中有一个默认的通信功能块,用于不同设备之间功能块之间传输事件,这个功能块就是 CComm功能块 。正如前面所述,当应用功能块网络映射到不同设备时,在设备的功能块网络中自动插入CComm 功能块。它是一个基于TCP 网络协议,采用ASN.1 数据编码的Publish/Subscribe 协议。这个协议完全基于TCP 协议,与通常的Publish/Subscribe 协议不同,它没有使用消息代理(比如在MQTT 协议中,需要一个消息代理(Message Broker))。而是直接建立在TCP 连接之上。如果一个设备需要与另一个设备之间传输功能块的事件和数据的话。这两个设备之间就需要建立一个TCP 连接。
显式的通信接口
实现不同设备的功能块传输数据和事件的另一种方式是使用服务接口功能块(service interface FB) 在4DIAC 的功能块库的net 库中,提供了各种Publish/subscribe 功能块。在应用程序的功能块网络中能够显式地添加publish/subscribe 功能块。实现不同设备之间的通过。这样的服务功能块可以实现MQTT,HTTP,Client/Server 等多种通信协议。
这些显式通信功能块除了能够实现设备间的功能块通信之外,还能用于与外部应用程序的数据交互。如下图所示,通过MQTT 协议的功能块实现基于web 的HMI。
使用服务接口功能块,能够使IEC61499 的应用调用外部强大的数据处理能力,比如数据库存储,数据可视化,人工智能模块等等。为了设计一个功能强大的IEC61499 控制器,我们一方面可以不断地扩大功能块库,也可以为功能块提供更多,更强大的资源。我们可以将目前物联网流行的技术和IEC61499 标准相结合。这样的混搭也许会产生奇妙的结果。例如,我们可以将4diac 的Forte运行在docker容器中,与其它微服务交互。用户通过功能块网络使用和配置其它docker容器中的微服务,灵活,方便地实现物联网和工业控制应用。这也是我们投入IEC61499 标准研究的原因。万一成功了呢?
4diac forte分层网络接口
在4diac 的运行时forte 中如前所述,CCommFB 是应用访问网络的通信功能块,并采用了分层结构来实现网络接口。
网络分层三层,分别为顶层,中间层和底层。
顶层(Top Layer):顶层能够直接访问功能块的数据端口,而发送功能仅用于指示所有数据端口已准备好发送。
中间层(Middle Layer):对于中间层,必须实现通用接口中定义的所有功能。在大多数情况下,中间层会向消息中添加一些额外的信息,例如编码,压缩,会话信息等。
底层(Bottom Layer):底层能够直接访问网络。底层还必须能够从网络异步获取数据。在大多数情况下,底层将不实现recvData功能,因为该功能直接由网络接口处理。
层与层之间的API 定义简单和统一
-openConnection:由功能块调用以打开连接,必须由每个层和网络堆栈来实现。
-closeConnection:由功能块调用以关闭连接,必须由每一层和网络堆栈来实现。
-sendData:由功能块调用以通过网络发送消息,必须由每个层和网络堆栈来实现。
-recvData:当从网络接收到新消息时调用,必须由每一层实现。
-processInterrupt:当层需要处理数据时,从网络堆栈调用。
下图显示了分层传输的过程