新的面向对象的工业编程(OOIP)技术,可提高面向对象编程(OOP)的交付能力,同时保持工业控制应用程序所需的易用性和可靠性。工业控制程序需要由广大用户开发和维护,这推动了面向图形语言(如梯形逻辑)的广泛使用控制工程网版权所有,而对高可靠性的需求,则促使控制工程师在采用某种最新的计算机技术之前,必须确保其已经成熟(例如符号寻址和数据结构,在进入主流工业控制系统之前,都已经成熟使用20年了)。本文将展示面向对象的工业编程在显著提高生产率的同时,是如何满足上述两个需求的。
在1990年代,计算机科学家开始使用面向对象编程,但是由于它的复杂性和缺乏支持的图形化语言环境,使其在工业控制中的应用一直很缓慢。工业软件供应商开始着手解决这些问题,使工业控制领域可以受益于面向对象编程所带来的诸多优势,并且不会增加复杂性。
工程师可以通过了解和掌握一些面向对象编程技术来从中获益。对于控制基于对象的物理世界,使用对象进行编程是一种自然且直观的技术。
了解面向对象的工业编程
关于面向对象编程的解释,工业控制领域和计算机科学往往有所不同。要了解面向对象的工业编程,请务必注意其与面向对象编程的主要区别。
面向对象编程:
●包括全套计算机科学领域面向对象的编程功能;
●主要基于文本;
●通常是受过高等教育的计算机科学家的专长。
面向对象的工业编程:
能够使用封装、实例化和抽象的概念,将功能块(FB)实例化为其它功能块;
●主要基于图形;
●只需很少的培训,控制工程师和工厂技术人员就可以使用。
面向对象工业编程的演进
在工业自动化的早期,编程是扁平的。编程人员读取输入,缩放输入,根据输入值生成警报,执行控制算法以生成输出,在输出上执行警报,缩放输出并使用存储器映射的输入/输出(I/O)写入输出值(如图1所示)。后来的功能允许合并一些重复的代码,但是过程仍然是扁平化的。
图1 :原始的扁平化编程风格。图片来源:ControlSphere
当控制软件开始执行多个任务时,工业编程人员采用了集中式的面向任务的方法。这种方法将操作划分为单独的任务,然后由一系列集中过程,对程序中的标签执行单独的操作活动。例如www.cechina.cn,第一个任务读取所有输入,然后是缩放所有输入,接着在处理后的数据上进行警报活动,以此类推(如图2所示)。
图2:面向任务的编程风格,将操作划分为多个单独的任务,然后由一系列集中处理过程,对程序中的标签单独执行操作活动。
相较于扁平化的方法,这种集中式的面向任务的编程方法有很大的进步,但是当需要向程序添加新功能时,它需要修改每个任务。另外,面向任务的编程在查看信息流和理解控制代码中的因果关系时,会变得比较困难。这些缺点使编程人员设计困难,工厂技术人员维护也困难,特别是对于在面向对象编程中学习、成长的年轻工程师而言更是如此,因为他们不太适应面向任务的编程。
由于工业控制工厂由诸如马达、输送机、阀门以及传感器等对象组成,因此面向对象编程是工业控制的自然选择,甚至可能比为其创建面向对象编程的计算机编程应用还要多。
面向对象的工业编程与面向任务的过程不同(如图3所示),其功能没有分散在许多任务中,而是包含在“对象”内部。面向对象的工业编程可以将控制的对象设计为与工厂中的对象相对应,从而可以使控制程序看起来非常类似于工厂配置(如图3所示)。使用正确的控制图编辑器,工厂设计和控制图可以相同。
图3:面向对象的工业编程风格,功能封装在可复用的对象中。
为了实现面向对象的工业编程,控制工程师需要掌握两个关键的面向对象编程概念:封装和实例化。
封装
封装允许创建对象,包含控制其相应工厂对象所需的所有功能和数据。用户不需要了解或理解底层实现;他们只是使用它。这与汽车发动机很类似。发动机封装了活塞、阀门、轴承和许多其它部件控制工程网版权所有,功能相当复杂。但是驾驶员不需要知道发动机的工作原理。他们只需要了解其接口并与之交互:点火器和油门踏板。
图4左下方的模拟输入模块(图5进行了详细说明)展示了面向对象的工业编程封装。该模块封装了与模拟输入有关的所有复杂的功能,包括缩放、钳位、滤波、指令覆盖、变化率报警和高/低报警。编程人员只需关心模块的配置(左端以_CI结尾的输入)和程序输出(输出_PO和优化输出_PO)。编程人员不需要了解或担心潜在的复杂性。
图4:控制对象镜像工厂对象。左下方的模拟输入块展示了面向对象的工业编程封装。
图5 :该模拟输入功能块封装了模拟输入的复杂的功能,包括缩放、钳位、滤波、信号覆盖、变化率报警和高/ 低报警。
实例化
实例化是声明和使用一个对象的多个副本而无需制作该对象副本的功能。在IEC61131-3编程语言中,这些对象被称为“功能块”。功能块,就像整数或实数一样,是一种数据类型。
与声明整数实例的方式相同,通过对其进行声明来创建功能块的“实例”。在后台,编译器用为整数实例分配内存相同的方式,为功能块每个实例中的变量分配唯一的内存。就像定义整数的数量不受限制(最大为存储容量)一样,特定功能块实例的声明也不受数量的限制。图6显示了在Codesys软件连续功能图(CFC)编辑器中www.cechina.cn,如何实例化和使用对象。
图6:该图显示了如何创建和实例化功能块(在CFC编辑器的声明区域中)以及如何调用该功能块的实例(在CFC编辑器的实现区域中)的机制。
例如www.cechina.cn,如图7所示,一辆1964年的“野马”是车辆“类型”(同样控制工程网版权所有,整数是数据的“类型”)。在创建它的实例之前,没有人可以驱动该“野马”类型(同样控制工程网版权所有,除非声明了整数,否则无法使用它)。指示汽车装配线创建“野马”实例的工作指令,类似于指示编译器分配整数内存的声明。这样,车道中的“野马”就变成了该数据类型的实例。
图7:一个功能块可以类似于设计(创建类型)、构建(实例化)和驾驶(调用)野马汽车。
用户可以声明多个整数(并且编译器可以为其分配内存),工厂可以制造多个“野马”实例。通过这种方式,邻居拥有的“野马”,可以完全独立于之前创建的野马。该功能被封装在对象的每个实例中(尽管存在潜在的量子纠缠)。
面向对象工业编程的优势
工具供应商开始将面向对象的工业编程所具有的优势提供给控制工程师。为了利用这些优势,控制工程师需要掌握封装和实例化。控制工程师可以将工厂对象的功能封装到与之对应的控制对象中,然后实例化这些对象以创建映射工厂设计的控制设计。
面向对象的工业编程使设计易于构建,工厂技术人员易于排除故障,并且便于未来的控制工程师进行维护。正如在工业控制中采用了通用软件的进步一样,面向对象的工业编程也遵循了相同的模式,并且正在成为控制工程的未来。(作者:Gary Pratt)