诊断、资产管理

利用面向对象的工业编程

工厂和设备是由对象组装而成的,因此控制架构也应该如此。新的工具帮助工业程序员在没有复杂性的情况下交付面向对象编程(OOP)的生产力。

通过Gary L. Pratt,P.E. 2019年4月5日

新的面向对象的工业编程(OOIP)技术提供面向对象编程(OOP)的生产率收益,同时保持工业控制应用所需的易用性和可靠性。由广泛的用户开发和维护的工业控制计划推动了广泛的使用图形语言(如梯形逻辑),并且对高可靠性的需求使工程师推动了最新的计算机科学趋势在采用之前成熟(例如符号寻址和数据结构,在进入工业控制主流之前成熟20年)。OoIP在保持符合这些要求的同时提供显着的生产率提高。

OOP在20世纪90年代开始被计算机科学家使用,但由于其复杂性和缺乏支持图形语言环境,因此对工业控制采用缓慢。工业软件供应商开始解决这些问题,为工业控制世界提供许多OOP福利,而无需复杂。

工程师可以通过掌握一个小型OOP概念的小子来利用好处。使用对象进行编程是一种控制基于对象的物理世界的自然和直观的技术。

面向对象的工业控制

工业控制和计算机科学界在面向对象解释上往往存在分歧。要理解OOP,重要的是要注意它与OOP的关键区别。

面向对象:

  • 包括一整套计算机科学OOP功能
  • 主要是基于文本的
  • 通常是高等教育的计算机科学家的领域。

OoIP:

  • 有能力使用封装,实例化和抽象的概念将功能块(FB)固定到其他FB中
  • 主要是基于图形的
  • 只要稍加培训,控制工程师和工厂技术人员就可以使用。

OoIP Evolution.

在工业自动化的早期,编程是单调的。程序员读取输入,缩放输入,在输入上生成警报,执行控制算法生成输出,在输出上执行警报,缩放输出,并使用内存映射的输入/输出(I/O)值写入输出,如图1所示。后来的函数允许合并一些重复的代码,但过程仍然是扁平的。

图2:面向任务的编程样式将操作划分为单独的任务,然后一系列集中进程在程序中的标签上执行了每个单独的操作。第一个任务将读取所有输入,下一个任务将缩放所有输入,下一个将在缩放点和依此类推上执行警报。礼貌:ControlSphere LLC [/标题]

这种集中的任务型方法是对平面方法的大进步,但它遭受了在将新功能添加到程序时修改每个任务的需要。此外,面向任务导向的编程通常很难看到信息流程,并了解控制代码中的原因和效果关系。这些缺点使编程更难以设计和更复杂的工厂技术人员维护,特别是对于在OOP中学的年轻队员,他们可能对面向任务的编程可能不那么舒服。

OOIP将面向任务的流程翻转过来,如图3所示。功能不是分散在许多任务中,而是包含在“对象”中。由于工业控制装置由电动机、输送机、阀门和传感器等对象组成,OOP是工业控制的自然选择,甚至可能比OOP的产生所依赖的计算机编程更重要。

控制器的对象可以被设计为对应于工厂中的物体,使得控制程序开始看起来与工厂设计非常相似,如图4所示。使用正确的控制图编辑器,工厂设计和控制图可能是相同的。

要实现OoIP,控件工程师需要掌握两个关键的OOP概念:封装和实例化。

封装

封装允许创建的对象包含控制其匹配工厂对象所需的所有功能和数据。用户不需要了解或理解基础实施;他们只是用它。一个良好的类比是汽车发动机。该发动机封装活塞,阀门,轴承和许多其他物体和复杂的功能。司机不需要知道发动机如何工作;他们只需要了解和互动其接口:起动器和加速器踏板。

图5:该模拟输入功能块封装模拟输入复杂性,包括缩放,钳位,过滤,覆盖,更换率报警,以及高/低报警。礼貌:ControlSphere LLC [/标题]

实例化

实例化是能够在不制作对象的副本的情况下声明和使用对象的多个副本。在IEC 61131-3编程语言中,这些对象称为“功能块”。功能块是以相同的方式为数据类型的数据类型是数据类型。

通过以相同的方式声明为声明的方式,通过声明函数块的“实例”。在幕后,编译器以相同的方式分配函数块的每个实例中的变量的唯一内存,同样的方式为整数的实例分配内存。就像一个可以声明无限数量的整数(最多为内存容量),一个可以声明特定功能块的无限数量的实例。图6显示了如何在CodeSys连续功能图表(CFC)编辑器中实例化并使用对象。[CodeSyS组制造代码,硬件无关的IEC 61131-3用于开发和工程控制器应用的自动化软件。]

例如,如图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安培,Auger2有一个较大的电机,电流报警限值为2安培。如果1amp参数被硬编码到auger对象中,那么1amp限制将被锁定到所有实例中。同样,该螺钻对象不能被重用。

使用完全路径映射解决I / O问题。这是20世纪70年代内存映射的自然进展和20世纪90年代的全球象征映射。完整路径名称是程序名称的点分隔组合,后跟所有中间实例名称,并以变量名结尾(例如:main.r1.auger1.augermotor.speed_fo)。完整路径名称用于将I / O映射到工厂层次结构中的适当流程变量,如图8的下部所示。

配置问题通过中央服务处理。在启动时,对象的实例使用中央配置器服务寄存器。然后,该服务从CSV文件或SQL数据库获取配置数据,并将值分发到每个实例。

OOIP环境元素

寻找这些能力,以确定一个开发系统是否支持OOIP:

  • 一种创建自包含的控制对象的方法,该对象对应于匹配的工厂对象并完成该工厂对象所需的所有功能,例如报警,审核,物理I / O,人机界面(HMI)I / O,缩放,控制, 等等。
  • 图形编辑器允许声明要无限数量的对象的实例,以任意时尚互连的对象的实例,以及将其他对象实例化为任意深度和复杂性的层次结构。在运行时期间,编辑器应允许允许层次结构的简单导航,例如双击对象的实例以下降到项目层次结构并导航回。
  • 在运行时调试单个对象实例的能力,包括:在单个实例中设置断点,单步进入单个实例,以及查看/更改对象实例的私有变量。
  • 通过将唯一值分配到实例的实例可以在项目层次结构中为实例的配置输入分配唯一值来区分相同对象的实例的手段。这些配置值应从CSV / Excel文件,SQL数据库或通过OPC UA源。在运行时期间还必须有一种方法来搜索这些配置变量的值(例如,搜索ISA标签名称配置)。
  • 能够在项目层次结构中的任何情况下将物理I / O映射到任何变量(包括将输入点映射到多个实例)。诸如来自现场总线设备的复合I / O必须能够映射到单个变量,或者在项目层次结构中的任何位置到一个或多个数据结构变量。该工具必须提供一种方法来追踪信号的路径,通过逻辑以及其驱动的输出(同样从物理输出反向通过逻辑到影响该输出的物理输入)。
  • 构建匹配层次控制对象的层次HMI对象的能力,以及通过顶级对象的实例名互连两个对象(以及它们潜在的数千个底层互连)的能力。
  • 能够打印层次结构设计的“扁平”版本,显示对象实例之间的相互连接和每个实例上的唯一配置值。
  • 实现继承、方法、多态性和接口的能力可能会有所帮助。
  • 可以共享一个有效的用户社区和论坛,其中可以共享开源工厂对象和建议。

迅速利用OoIP福利

工具供应商开始制作OoIP可用于控制工程师的福利。为了利用这些福利,控制工程师只需要掌握两个关键的OOP概念:封装和实例化。控件工程师可以将工厂对象的功能封装到匹配控制对象中,然后将这些对象实例化以创建镜像植物设计的控制设计。

OOIP使设计易于构建,易于为工厂技术人员排除故障,并易于为未来的控制工程师维护。就像其他通用软件的最好的改进已经被用于工业控制一样,OOIP也在遵循同样的模式,并正在成为控制工程的未来。

下一个:第2部分

本系列的第2部分将介绍附加的OOP技术可用于实现集中配置服务。

Gary L. Pratt,P.E.是…的主席ControlSphere有限责任公司。由Mark T. Hoske,Content Manager编辑,控制工程、CFE媒体mhoske@cfemedia.com.

更多的答案

关键词:控制系统编程,面向对象的工业编程

面向对象的工业编程(OOIP)提供福利。

基于任务的控制与基于对象的控制不同。

控制工程师只需要掌握两个OOP概念:封装和实例化。

考虑一下这一点

会编码更容易更新和重用使它值得学习?

网上临时演员

关于作者的更多信息:普拉特的职业生涯于1982年开始与雪佛龙企业工程公司,包括整个工业控制行业的众多职位。他通过IEC 61131-3编程语言和CODESYS综合开发环境(IDE)通过咨询和培训课程,持有工业控制的专利,并专注于共享知识和经验,并通过咨询和培训课程进行下一代。

关于在OOIP中实现的离散、批量和连续控制系统设计的更详细的例子,看到这个视频。

可以找到用于开源OoIP功能块和设计示例的清算室www.OOIP-Foundation.org

本文示例中使用的Codesys IDE可以是免费下载。下载包括完整的基于软件的PLC,它将在重置之间运行2小时。

对于OOIP、模拟和配置对象的视频演示,看到这个视频。


Gary L. Pratt,P.E.
作者简介:Gary L. Pratt,P.E.,是ControlSphere LLC的总裁。