天天看点

从PLC 到IEC61499 控制器

PLC 是工业控制领域被广泛使用的控制器。并且制定了相关的国际标准IEC61131。于1992年发布.

  IEC 61131-3  规定了PLC 的编程语言

  -梯形图(Ladder Diagram)

-序列功能图(Sequential Function Charts)

  -功能块(Function Block)

  -结构文本(Structure Text)

  -指令表(Instruction List)

    梯形图是使用最广泛的PLC编程方式.学习PLC编程的人大多数是从梯形图开始的。不过对于复杂的控制系统。梯形图就难以建模。这就需要功能块图形编程。比如运动控制.PLCOpen 就使用功能块来描述.但是IEC61131-3的功能块编程看来进展并不大.无法满足复杂工业控制越来越多的需求。也没有体现.软件工程的最新技术进步。

    事实上,现代工业自动控制系统大多数是分布式系统。而PLC 是独立运行的控制设备。IEC61131 缺乏对分布式系统的支持 .另一方面,PLC 的程序一般都是使用厂家提供的专用开发环境预先编写,并且编译好之后,下载到PLC 中运行的.没有支持动态在线更新和参数设定。也就是说,PLC 没有支持系统的重配置(reconfiguration).这些性能的确失,导致了它的表兄-IEC61499 标准的诞生。

 本文我们来讨论基于IEC61131的PLC和IEC61499 兼容型控制器之间的差别。

运行模式

PLC 的运行模式

PLC 采取的循环扫描方式运行程序PLC的CPU将用户程序存储在内存中。当程序执行时,它首先开始我们所谓的PLC  扫描周期。扫描周期将读取所有输入并更新输入状态文件。它将其应用于PLC梯形图逻辑。最后,它更新输出状态文件并将信号发送到适当的输出以打开或关闭。在整个PLC程序执行过程中,将反复重复此扫描周期。这使PLC能够实时读取和写入输入和输出.

扫描周期是一个顺序执行的过程,这意味着它一次读取并执行一行代码。像梯形图一样从左至右读取程序。CPU不断更新并执行程序文件状态。如果需要其他数据或数学/逻辑,它将停止扫描并从内存中调用子例程。这些子例程具有附加的数据文件,该文件存储某些功能(例如计时器和计数器)的值。子例程完成后,它将返回主用户程序并继续扫描周期。

这是基于梯形图逻辑的PLC程序的基本结构。

IEC61131的功能块编程是为了扩展当前的梯形逻辑编程,并且现在越来越多地使用它。它基本上允许程序员将子例程定义为一个数据块,该子例程可以反复调用和使用,而无需重写代码。

语句列表编程是一种使用编程语句而不是梯形图逻辑写入PLC的方法。

两者都在不断发展并在市场上占有一席之地,但它们偏离了PLC的梯形逻辑编程。不过,它们依然遵循了循序程序执行的模式.每次扫描周期中,读入所有的输入信号,并且存储在内存中,然后从左到右地执行一遍功能块图,并输出状态。

 显然,输入没有变化,功能块也将会执行一遍.除非标注每个数据是否有变化.当扫描周期确定之后,PLC 的CPU的处理能力决定了一个周期内执行程序指令数.为了提高PLC 的实时性能,也有PLC 通过FPGA 硬件来加速梯形图的执行速度。

PLC 程序执行的方式是同步方式的.每个时钟周期,同步地执行所有的功能块.功能块的执行顺序应该是有程序中的位置来确定的.. 是静态不变的。

IEC61499 控制器的运行模式

  IEC61499 标准的编程方式只有一种-功能块图.不过,它和IEC61131-3 中的功能块有很大的不同.下面同样是一个计数器电路.左边是IEC61131,右边是IEC61499.可以看出IEC61499 的功能块多了事件的输入输出。

从PLC 到IEC61499 控制器
从PLC 到IEC61499 控制器

IEC61499 是基于事件的功能块.图。当事件来到时,功能块更据事件的类型和内部的状态,来决定执行内部的程序(算法)。并且根据执行的结果输出事件。数据是和事件同步地输入输出的(交叉点的小方块决定了数据和哪一个事件同步。

从PLC 到IEC61499 控制器

下面是一个小例子,实现一个32分频器。由E_CYCLE功能块周期性地产生事件,每次施加在计数器上。当计数器到达PV 设置的值时,引起Q 输出TRUE。E_CTU 复位。

从PLC 到IEC61499 控制器

具有硬件数字电路设计经验的读者会发现,IEC61499功能块的事件类似于数字逻辑电路中的时钟。整个功能块图是在时钟的驱动和控制下运行的。E_CYCLE 相当于一个内部时钟源,而所有的输入接口功能块。当收到新的输入信号时,会产生相应的事件。

  在IEC61499 中没有周期的扫描过程。只有周期性的事件节拍。上面的例子中,脉冲节拍的周期是1000ms。功能块执行的循序会应为状态的变化而改变。

  可以开发IEC61499兼容的IEC61131-3 功能块, 事实上在IEC61499 的开发环境中,也提供了IEC61131的功能块库。 同样地,使用IEC61499 功能块的事件IO,也可以实现PLC周期扫描的工作方式。

如何支持分布式系统

  PLC 是独立运行的控制设备,厂商提供的开发工具是用来开发单个PLC 内部程序的。当需要多个PLC 协同操作时,系统设计师需要定义好PLC相互之间交换数据的方向和格式,每个PLC各自编程。然后进行系统联合调试。

PLC也具有与外界通信的网络接口,这些网络包括:

-Modbus

-EtherNet/IP

-Profibus

-ControlNet

-EtherCAT

-HART

  当多台PLC 构建一个控制网络时,需要设计相关的消息格式和语义。PLC 联网更多地是通过上位机来实现的,比如SCADA 系统就是通过PC 机构建 一个PLC+上位机的星型网。

  也可以使用额外的网关来实现各种结构的PLC控制网络。例如,使用一个Modbus/MQTT 网关和MQTT 代理构建一个Publish/Subscribe 发布/订阅网络。能够实现于云端的各种协议的通信。现在的许多设备远程监控项目大多数是采用这样的方式。PLC 只是一个控制末端设备,通过网关接入物联网或者云端系统。

  由于涉及各种协议转换和异种机互联,这样的控制系统的软件开发和设备安装过程是比较复杂和耗费时间精力的。由于各个PLC 产品是一个严重依赖厂商的产品。而且是部分符合标准。各厂商提供的网络接口的使用方式各不相同。而且各种网络模块价格不菲。

IEC61499 标准是针对分布式控制系统而开发的,在它的概念下,当你要开发一个有多台控制器构成的分布式系统时,你是建立一个统一的功能块网络。可以想象是在一个大的控制器上编写一个应用程序。当编写好之后,最后再将功能块网络分段映射到不同的控制器中去运行。映射时自动地增加了用于功能块之间事件和消息交换的通信功能块。如下图所示。这些工作是IEC61499开发环境和运行时预先设计好的。应用程序员完全不用关心。只要网络是通的。功能块网络就能分布在各个控制器中运行。就像在一台大的控制器上运行一样。当我第一次映射IEC61499 功能块网络到几个树莓PI 上时,着实吃惊了一次。感觉十分神奇。

从PLC 到IEC61499 控制器

IEC61499 这种系统化设计,分段映射到控制器的编程方式带来的好处是使得系统的修改和重配置变得简单,比如如果我们希望将某些功能块从一个控制器转移到另一个控制器上运行的时候,只要重新的map一下就可以了。如果在PLC 构建的系统中,这样的修改是比较费劲的。

硬件平台

  PLC 产品是厂商依赖型产品,各家的硬件平台各不相同。用户对其硬件不甚了解。甚至它们使用的什么CPU 都不知道。当然现在也出现了基于通用计算机平台的“软件PLC”。除了软件PLC之外,标准PLC 产品的性能扩展是十分有限的,

  相比之下IEC61499 的运行时(runtime)和软件PLC一样是基于通用的计算机平台的。通常是可以在一个RT linux OS 加上一些硬件IO模块就能够构建一个一个IEC61499 兼容的控制器。事实上,我们在瑞芯微RK3399 ,树莓PI 上都运行了开源项目4diac的IEC61499 的运行时forte。基于开放平台开发的控制器使我们能够及时地选用最先进的硬件。提高控制器的性能。更多的第三方工业PC 开发上能够加入开放IEC61499 的行列。形成一个开放型生态系统。用户可以更加系统设计的需求,选择各种性能的控制器,它们可以是基于X86 的系统,也可以是单核或者多核Arm 的系统。

功能扩展 

  同样地,要想在标准PLC 产品上扩展功能只能等待厂商。比如我们想在PLC 上添加一个AI 算法。目前的方法只能是外接一台计算机来完成。PLC厂商就像外国警察那样总是行动迟缓。

  基于Linux OS是一个开放性平台,如果采用IEC61499 开源运行时(例如4diac ),就可以任意地扩展功能。它们包括几个方面:

1 第三方厂商开发功能块库

IEC61499 的开发环境具有功能块类型的开发工具,它们使用交互界面来设计功能块的事件输入/输出。数据输入输出。能够使用java 或者ST 语言,lua语言 ,C语言开发功能块的算法。然后结合到IEC61499 的运行时中。这些功能块库能够给用户使用。

例如著名的IEC61499 厂商nxtControl为建筑自动化,过程控制和机器控制编写的功能块库。专业的公司可以将自己的核心算法,KNOW-HOW 编写到功能块中,以功能块的方式提供给客户使用。

2 使用Lua 编写控制块的算法

用户可以使用Lua 编写功能块。不需要编译在运行时内部解释执行。在Linux OS 下开发各种服务组件,通过服务接口功能块访问这些服务组件。

3 使用基本的功能块编写复合功能块

4 编写外部微服务,通过服务接口功能块交换消息。

在当前信息系统领域,容器/微服务技术在云平台和物联网边缘设备中已经广泛地应用了。所谓微服务(micro service)技术是将以前大型的单一程序分解成为功能单一的微服务。它们可以独立的开发,部署,维护和升级。而容器是将微服务的程序以及运行环境打包成为一个容器,在容器环境中运行。目前最流行的容器管理技术是docker技术。微服务之间采用通用的消息平台交换消息。

从PLC 到IEC61499 控制器

 我们可以将IEC61499 运行时打包成为一个容器在docker中运行。并且通过消息系统(比如MQTT)与其它微服务交换数据。提供的微服务可以是基于web 的HMI用户界面,时间序列数据库,与云端的接入,AI 和数据分析等。

事实上,我们在2019年,曾经开发了基于容器技术的小型工业边缘计算机设备。采用了Go语言作为主要的程序设计语言,使用RabbitMQ 作为消息系统。其目的是希望像手机App 那样安装工业App。但是遇到的问题是尽管已经编写了各种支持型微服务。使应用程序的编写更加简捷。但是毕竟还需要编写程序。而让控制工程师编写程序是困难的。

一种创新的方法是将这两种方法结合起来,以便在制造设备上轻松分发和管理软件模块,同时利用IEC 61499应用模型来启用应用程序编排工具。我们已经初步的做了一些尝试。证明是可行的。

继续阅读