工厂和设备由对象组装而成,因此控制架构也应该如此。新工具可帮助工业程序员提高面向对象编程 (OOP) 的生产力,同时又不会增加复杂性。
新的面向对象工业编程 (OOIP) 技术提供了面向对象编程 (OOP) 的生产力收益,同时保持了工业控制应用程序所需的易用性和可靠性。工业控制程序需要由广泛的用户开发和维护,这推动了面向图形的语言(如梯形图逻辑)的广泛使用,而对高可靠性的需求促使工程师们让最新的计算机科学趋势在被采用之前已经成熟(例如符号寻址和数据结构,它们在进入工业控制主流之前都成熟了 20 年)。OOIP 可显着提高生产力,同时保持对这两项要求的遵从性。
OOP 在 1990 年代开始被计算机科学家使用,但由于其复杂性和缺乏支持的图形语言环境,在工业控制中的采用一直很缓慢。工业软件供应商开始着手解决这些问题,并为工业控制领域提供许多 OOP 优势,同时又不增加复杂性。
工程师可以通过掌握 OOP 概念的一小部分来利用这些好处。使用对象编程是一种自然而直观的技术,用于控制基于对象的物理世界。
面向工业控制的 OOP
工业控制和计算机科学界在 OOP 解释上往往存在分歧。要理解 OOIP,重要的是要注意它与 OOP 的主要区别。
面向对象:
- 包括全套计算机科学 OOP 功能
- 主要基于文本
- 通常是受过高等教育的计算机科学家的领域。
面向对象:
- 具有使用封装、实例化和抽象的概念将功能块 (FB) 实例化为其他 FB 的能力
- 主要基于图形
- 控制工程师和工厂技术人员只需接受最少的培训即可使用。
面向对象的进化
在工业自动化的早期,编程是平淡无奇的。程序员读取输入、缩放输入、在输入上生成警报、执行控制算法以生成输出、在输出上执行警报、缩放输出并使用内存映射输入/输出 (I/O) 值写入输出,如图 1 所示。后来的功能允许合并一些重复的代码,但过程仍然是平坦的。
面向任务的编程风格将操作划分为单独的任务,然后一系列集中处理对程序中的标签执行每个单独的操作。第一个任务将读取所有输入,下一个任务将缩放所有输入,下一个任务将对缩放点执行警报等。
这种集中的面向任务的方法比平面方法有了很大的进步,但它的缺点是在程序中添加新功能时需要修改每个任务。此外,面向任务的编程常常使查看信息流和理解控制代码中的因果关系变得困难。这些缺点使编程更难设计,工厂技术人员维护起来也更复杂,尤其是对于受过 OOP 教育的年轻团队成员来说,他们可能不太适应面向任务的编程。
OOIP 将面向任务的过程放在一边,如图 3 所示。功能不是分散在许多任务中,而是包含在“对象”中。由于工业控制工厂由电机、传送带、阀门和传感器等对象组成,因此 OOP 是工业控制的自然选择,甚至可能超过创建 OOP 的计算机编程。
控件的对象可以设计为与工厂中的对象相对应,这样控制程序开始看起来与工厂设计非常相似,如图 4 所示。使用正确的控制图编辑器,工厂设计和控制图可以相同。
要实施 OOIP,控制工程师需要掌握两个关键的 OOP 概念:封装和实例化。
封装
封装允许创建包含控制其匹配工厂对象所需的所有功能和数据的对象。用户不需要知道或理解底层实现;他们只是使用它。一个很好的类比是汽车发动机。引擎封装了活塞、阀门、轴承和许多其他对象和复杂的功能。司机不需要知道引擎是如何工作的;他们只需要了解它的接口并与之交互:启动器和加速踏板。
图 5:此模拟输入功能块封装了模拟输入的复杂性,包括缩放、钳位、过滤、覆盖、变化率报警和高/低报警。
实例化
实例化是在不复制对象的情况下声明和使用对象的多个副本的能力。在 IEC 61131-3 编程语言中,这些对象称为“功能块”。功能块是一种数据类型,就像整数或实数是一种数据类型一样。
功能块的“实例”是通过以与声明整数实例相同的方式声明它们来创建的。在幕后,编译器为功能块的每个实例中的变量分配唯一的内存,其方式与为整数实例分配内存的方式相同。就像一个人可以声明无限数量的整数(达到内存容量)一样,一个人可以声明一个特定功能块的无限数量的实例。图 6 显示了如何在 Codesys 连续功能图 (CFC) 编辑器中实例化和使用对象。[Codesys Group 生产独立于硬件的 IEC 61131-3 自动化软件 Codesys,用于开发和设计控制器应用程序。]
例如,如图 7 所示,特定品牌和型号的汽车是车辆“类型”(以同样的方式,整数是数据“类型”)。在创建它的实例之前,没有人可以驱动该品牌和型号“类型”(以完全相同的方式在声明之前不能使用整数)。指示汽车装配线创建特定品牌和型号实例的工作指令类似于指示编译器分配整数内存的声明。这样,车道上的品牌和型号车辆就成为该数据类型的一个实例。
虽然用户可以声明(并且编译器可以为其分配内存)大量整数,但工厂可以制造特定品牌和型号车辆“类型”的大量实例。通过这种方式,邻居可以拥有完全独立于之前创建的品牌和型号的特定品牌和型号。功能被封装在对象的每个实例中(尽管存在潜在的量子纠缠)。
抽象、嵌套、接口
封装和实例化的使用导致了其他三个 OOP 概念的使用。第一个是抽象,细节在层次结构中按级别分组,因此程序员只需要在设计的任何一个级别处理相关的复杂级别。第二种是嵌套,允许对象实例化其他对象。第三个是接口,它提供了一种与层次结构中下一层进行交互的简化方法。
在汽车类比中,车辆有一个发动机,有一个启动器,有一个电枢,电枢有铜线,铜线是在特定位置开采和提炼的。抽象可以将引擎的嵌套复杂性和铜的挖掘留给其他人,其中该细节级别适合层次结构中的该级别。用户只需要知道发动机的接口——启动器和油门踏板。
OOIP 使用与图 8 所示相同的概念。在顶层,一个工厂对象可以嵌套(实例化)两个反应器对象,每个反应器对象都抽象出两个螺旋钻对象的复杂性,每个螺旋钻对象都有嵌套的电机和轴编码器对象。电机对象包含控制该电机所需的所有功能(关闭其接触器、监控其辅助触点或向心开关以验证其已启动、如果未启动则生成警报等)
多亏了抽象,在层次结构的任何层次上唯一关心的是到下一层的接口。例如,螺旋钻将有一个输入接口来打开电机和一个输出接口来反馈来自轴编码器的脉冲。在反应堆级别,无需了解或处理任何潜在的复杂性,例如启动电机或生成警报。
一个例外是如果需要知道电机是否已经启动,如果螺旋钻有冗余电机就会出现这种情况。然而,在那种情况下,附加功能将被抽象到一个附加的层次结构层中。它不是螺旋钻实例化电机,而是实例化冗余电机,这将实例化多个电机本身以及在主电机发生故障时启动备用电机的逻辑。与螺旋钻的接口仍然只是运行电机的命令。每个级别都封装了它可以实现的所有功能,并且只向更高级别寻求它自己无法完成的任务。
对象配置、I/O 映射
基于任务的控制和基于对象的控制之间的区别可以比作不同形式的政府。基于任务的控制类似于一个强大的中央集权政府,新功能必须在联邦定标局、联邦警报局等处注册。基于对象的控制类似于分散的政府,其中新功能是自我支持的,并且可以在很大程度上照顾自己。
现在,您可能会想,“大多数人会同意需要某种级别的政府”和“并非所有品牌、型号和年份的车辆都是相同的。它们具有不同的功能和选项。这些在 OOIP 中是如何处理的?” 和“全局 I/O 内存如何与 OOIP 一起工作?” 这些都是很好的问题。第一个问题通过中央服务解决,第二个问题通过配置参数解决,第三个问题通过全路径 I/O 映射解决。
为了实现 OOIP 的可重用性优势,I/O 和参数不能硬编码到任何对象的实例化中。例如,在图 8 中,如果在 Auger1 对象中实例化的电机对象的 Speed_FO 输出绑定到全局 I/O 变量,则 Auger2 中电机的 Speed_FO 将连接到同一全局变量。因此,该螺旋钻对象无法重复使用。
如果电机配置是硬编码的,也会出现同样的问题。例如,假设 Auger1 的电机较小,电流警报限值为 1 Amp,而 Auger2 的电机较大,警报限值为 2 Amp。如果 1 Amp 参数被硬编码到螺旋钻对象中,则 1 Amp 限制将被锁定到所有实例中。同样,该螺旋钻对象无法重复使用。
I/O 问题已通过完整路径映射解决。这是 1970 年代的内存映射和 1990 年代的全局符号映射的自然发展。完整路径名是程序名的点分隔组合,后跟所有中间实例名,并以变量名结尾(例如:Main.R1.Auger1.AugerMotor.Speed_FO)。完整路径名称用于将 I/O 映射到工厂层次结构中相应的过程变量,如图 8 下半部分所示。
配置问题通过中央服务处理。在启动时,对象的实例向中央配置器服务注册自己。然后,该服务从 CSV 文件或 SQL 数据库中获取配置数据,并将这些值分发给每个实例。
OOIP 环境元素
查看这些功能以确定开发系统是否支持 OOIP:
- 一种创建独立控制对象的方法,这些对象对应于匹配的工厂对象并执行该工厂对象所需的所有功能,例如警报、审计、物理 I/O、人机界面(HMI) I/O、缩放、控制, ETC。
2. 一个图形编辑器,允许声明无限数量的对象实例,以任意方式互连对象实例,以及将其他对象实例化为任意深度和复杂度的层次结构的对象。
3. 在运行时,编辑器应该允许层次结构的简单导航,例如双击对象的实例以下降到项目层次结构并导航回来。 - 在运行时调试单个对象实例的能力,包括:在单个实例中设置断点,单步进入单个实例,以及查看/更改对象实例的私有变量。
- 通过为实例在项目层次结构中可能位于的任何位置的实例的配置输入分配唯一值来区分相同对象的实例的一种方法。这些配置值应来自CSV/Excel 文件、SQL 数据库或通过 OPC UA。还必须有一种方法可以在运行时搜索这些配置变量的值(例如,搜索 ISA 标记名称配置)。
- 能够将物理 I/O映射到项目层次结构中任何位置的任何实例中的任何变量(包括将输入点映射到多个实例)。来自现场总线设备的复合 I/O必须能够映射到单个变量,或者映射到项目层次结构中任何位置的一个或多个数据结构变量。该工具必须提供一种方法来跟踪信号从其输入、通过逻辑到它驱动的输出的路径(同样从物理输出通过逻辑返回到影响该输出的物理输入的反向过程)。
- 构建与分层控制对象匹配的分层 HMI 对象的能力,以及通过顶级对象的实例名称互连两个对象(及其潜在的数千个底层互连)的能力。
- 能够打印分层设计的“扁平化”版本,显示对象实例之间的互连以及每个实例上的唯一配置值。
- 实现继承、方法、多态性和接口的能力会很有帮助。
- 一个活跃的用户社区和论坛,可以在其中共享开源植物对象和建议。
快速利用 OOIP 的优势
工具供应商开始向控制工程师提供 OOIP 的好处。要利用这些优势,控制工程师只需掌握两个关键的 OOP 概念:封装和实例化。控制工程师可以将工厂对象的功能封装到匹配的控制对象中,然后实例化这些对象以创建反映工厂设计的控制设计。
OOIP 使设计易于构建,便于工厂技术人员进行故障排除,并便于未来的控制工程师进行维护。正如工业控制采用了其他通用软件的最佳进步一样,OOIP 也遵循同样的模式,并正在成为控制工程的未来。
原文