PLC程序设计|简化程序元素的最佳方式——面向对象编程
摘要
面向对象编程,是一种利用对象、方法和属性,来组织和简化程序元素的最佳方式。
最新发布的IEC-61131-3标准更新包括面向对象编程(OOP)语言。虽然面向对象编程是高大上的术语,但它其实是关于组织和简化的。组织是指程序元素进行分组以及分组所采用的机制。组织良好的程序更直观和更易于使用。面向对象的特征旨在改善和促进健全的组织项目。简化是指向外部世界提供简化的接口。封装之下,对象内部的复杂细节则保留在程序中。
何为对象?
编程中的“对象”,就是将功能和数据整合在一起,用其来实现对实际设备、过程和其它结构的状态和行为的建模。 在IEC 61131-3标准中,对象是带额外特性的功能块。功能块可以定义方法和属性,从而可以进一步划分代码和扩展接口。方法和属性可以使用任何IEC-61131-3语言来实现。语言的选择在每个方法或属性的基础上确定,这使其很容易根据环境来使用最适合的语言。
示例项目包含一个功能块,该功能块实现一个简单的加/减计数器(如图1所示)。在其它面向对象编程(OOP)语言中使用的“类”,是“函数功能块”的同义词。两者的定义都必须在使用前进行实例化。类的实例或功能块被称为“对象”。
图1:该示例工程包含了一个简单的增/减计数器的功能块。图片来源: Mitek 自动化
定义方法
“方法”,是能够访问所定义的函数块内部数据和参数的函数。 它们也可以有输入、输出参数和返回值,这和普通函数一样。
方法,可以用梯形图来定义。 当输入参数为“真”时,计数器递增,最后达到一个最大值。在功能块的主体中,定义PMaxCount和Count参数。由于方法可以访问功能块的数据和参数,方法内部就可以使用PMaxCount和Count参数。返回值被写入到CountUp,它是方法本身的名字。
在方法中定义NotMax变量,并将其分配给方法的调用堆栈。 这意味着,前一个运行周期的变量值不会保持。在功能块主体中定义的变量被分配到内存中,并在不同的运行周期中保持一致。
另一种方法是定义递减计数器,比如使用结构化文本语言来实现。 当输入参数为“真”时,计数器递减,直到减为零为止。Count 是功能块的输出参数,并将返回值写入变量CountDn,这也是方法的名称。此方法提供了一种简单方便的方法,将整个程序分解成更小、更易于管理的程序块。这种设计,更易于匹配不同的语言。
从函数块本体调用这些方法,是很简单的事情(如图2所示)。 由于这些方法是使用关键字“私有”定义的,所以只能在函数中调用它们。使用关键字“公共”定义的方法,也可以在外部调用。
图2:用户可以从功能块本体来调用这些方法,并使用关键词作为方法的防护。
定义属性
“属性”是类似于变量的函数,可以在表达式中使用,与使用变量的方法相同。 不同于绑定到某个存储位置,属性与get()和set()功能绑定。当需要从属性中读取数据时,就需要执行get()功能。当需要向属性写入数据时,就需要执行set()功能。
“公有”与“私有”关键词,也可以用来控制属性的访问权限。 “私有”意味着属性只能在定义的功能块内部使用。“公有”,则意味着该属性可用在外部调用。然而,“公有”与“私有”关键词也可以用于get()和set()函数的定义。这就使得该属性,外部可读,内部可写。
在最基本的形式中,属性从内部变量读取、或写入数据。 它们的附加功能可用于验证数据值或执行其它操作。例如,可在程序中添加MaxCount属性。这允许将最大计数设置为指定的值,且其当前值可读。数据通过MaxCount属性传递给set()和get()函数,就像变量一样。get()函数返回功能块变量PMaxCount的值。set()函数验证输入值,以便在将结果写入PMaxCount之前确保它是一个正数。
图3:重置属性没有潜在读写操作对象。
在图3所示的例子中,在项目中增加了使用梯形图语言实现的复位功能。重置属性没有潜在的读写操作对象变量。当写入“真”时,执行复位操作。当读取属性时,计算表达式的值,并返回结果。
值得一提的是,项目结构和组织如何反映到项目树中。 在项目中,每个程序、函数块、方法和属性都用一个节点表示。双击节点,就会在主窗口的文档页打开一个选项卡。标签可以被移除并以单独的窗口显示。get()和set()功能都可以单独显示,因此可以用于属性定义的显示。
图4:程序可以像功能块一样定义内部数据、参数、方法和属性。
面向对象程序元素的优化
面向对象包括很多,但它最根本的目的就是以一种最优的方式组织程序元素。 对象、方法和属性,是实现这一目标的主要手段,对于理解和掌握这些概念,是最基本的。
项目初期,可采用较小的程序步骤来组织常规程序;基于对象的设计可以稍后进行。熟悉使用这些技术以后,会让你更容易考虑所有其它的可能性。没有理由不做尝试。
本文来自于《控制工程中文版》(CONTROL ENGINEERING China )2017年9月刊《技术进展》栏目,原标题为:PLC程序设计:面向对象编程
西门子PLC标准化程序面向对象和面向过程的概念
面向对象和面向过程概念
“面向过程”(ProcedureOriented)是一种以过程为中心的编程思想。这些都是以什么正在发生为主要目标进行编程,不同于面向对象的是谁在受影响。
图 3‑1 : 面向过程编程方法
面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了
面向对象(Object Oriented)是软件开发方法。面向对象的概念和应用已超越了程序设计和软件开发,扩展到如数据库系统、交互式界面、应用结构、应用平台、分布式系统、网络管理结构、CAD技术、人工智能等领域。面向对象是一种对现实世界理解和抽象的方法,是计算机编程技术发展到一定阶段后的产物。
图 3‑2 : 面向对象编程方法
面向对象是把构成问题事物分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描述某个事物在整个解决问题的步骤中的行为
面向对象是相对于面向过程来讲的,面向对象方法,把相关的数据和方法组织为一个整体来看待,从更高的层次来进行系统建模,更贴近事物的自然运行模式。
在PLC中虽然没有面向对象编程的类等术语的概念,但在PLC中都能找到与面向对象中相类似概念的表达方法;
比如面向对象中类的概念在PLC可以通过UDT定义出来,不同的是PLC中可能需要多个UDT才能将一个对象的类完整表达出来;
面向对象中方法的概念在PLC中可以通过FB表达出来,同时FB的嵌套可以稍微的和面向对象中的继承类似;
而在标准化系统中,所有设备的性能属性都被归纳总结在工艺描述中,那面向对象的编程方法就是将其在程序系统中实例化出来;为便于理解,下文将用一个面向对象的编程思路来剖析“怎么将大象放进冰箱”;
3.2.面向对象和面向过程的不同表达
面向过程在面对这样的课题的时候,面向过程的编程人员就会二话不说针对分析这个需求之后列出了几个步骤:
把冰箱门打开。把大象装进去。把冰箱门关上。上面每一个步骤,程序员都会用一个函数或者功能来实现,比如定义了如下的功能块:
FB_OpenTheDoor();
FB_PushElephant();
FB_CloseTheDoor();
再通过排列组合完成客户的需求,顺利交工。
通过以上描述我们发现,程序员做的工作就是在接到需求以后,会把这些需求拆成一个一个的指令或者步骤,然后根据客户的需求串起来交给控制器去执行。和上面面向过程的定义是一致的,而且现实中的编程人员(PLC)大部分可能都是这样的做法。
我们以为这样就结束了?但是后续交流客户又说还要实现以下功能:
【我要把大象装冰箱,但是门别关,敞着就行】
【我还需要冰箱的冷藏温度调到10°】
。。。。。。
这个时候我们就必须得把整个程序系统通读一遍,找出可以用的函数(如果没有就再定义一个),最后依次调用它们。随着客户后续要求的不断提出,最后整个系统越来越杂乱无章难以管理,程序员不堪重负。
面向对象面向对象思维,从另一个角度来解决这个问题。面向对象是把【对象】作为程序的基本单元,我们控制过程中的驱动器,传感器,智能设备都可以归纳为对象。那么对象到底是什么呢?对象就是对事物的一种抽象描述。人们发现,现实世界中的事物,都可以用「数据」和「能力」来描述。比如我要描述一个人,「数据」就是他的年龄、性别、身高体重,「能力」就是他能做什么工作,承担什么样的责任。
例如你可以让「狗」这个对象「吃狗粮」,就可以把「吃狗粮」的命令发给「狗」让其执行,然后我们就实现了「狗吃狗粮」的需求。
如何进行面向对象的编程呢?根据上面课题的需求,演示按照面向对象是怎么编程的。
3.3.对象属性
第一步,提炼对象属性。分析这个需求里面我们要面对的对象是显而易见的,大象和冰箱都是这个需求中明确的实体对象。
装进这个动作是一串的指令,其实包括两方面的动作:打开(冰箱)+装(大象);那这个需求的对象就如下表;
表3-1 : 对象提炼清单表
第二步,对象属性分析对象。属性分析就是描述对象特征,像上文说的一样,可以用一些数据和能力来描述,如下表所示提炼的对象的数据和能力。
表 3-2 : 对象属性分析表
在PLC编程过程中,除了分析这个对象属性以外,其实我们还要做的就是将对象属性和我们程序结构相关联,细化到程序中就如下表所示。
表 3-3 : 对象属性实例化分析表
3.4.对象编程
3.4.1.冰箱的编程
参数说明: 可以来自HMI或者信息管理系统,包括冷藏室温度设置和冷冻室温度设置;
输入说明 :
存储:向冰箱下达存储指令,存储指令包括的信息有存储的对象(大象),存储的位置(冷冻室还是冷藏室)等;
取件:向冰箱下达取件指令,存储指令包括的信息有取件的对象(大象),取件的位置(冷冻室还是冷藏室)等;
启停命令:此信号为True的时候冰箱启动,否则冰箱停止运行;
输出说明:
冷冻室门的开关:True表示冷冻室打开,False表示冷冻室关闭;
冷藏室门的开关:True表示冷藏室打开,False表示冷藏室关闭;
启停状态:True:冰箱已经启动,False:冰箱停止运行;
属性说明:
三维尺寸:冰箱的外在存储,包括长宽高的尺寸;
冷藏室:当前温度以、当前剩余空间、载重能力;
冷冻室:当前温度以、当前剩余空间、载重能力;
逻辑信息 :包括运算逻辑以及运行状态;
运算逻辑信息,比如储存对象不符合当前冰箱的容量、取件对象在冰箱里面不存在、大象重量超重(以上信息冷藏冷冻是分别存储的);
运行状态数,比如冰箱是否启动,是否有故障等等;
将以上信息概括后可以在一个统一的模型中(后续有模型说明)得到体现,具体见下图所示:
图 3‑3 : 冰箱在PLC中的程序模型
3.4.2.大象的编程
参数: 没有;
输入说明:
进冰箱:True表示要求大象进入冰箱,False无定义;
出冰箱:True表示要求大象走出冰箱,False无定义;
输出说明:
正向行走:True表示大象进冰箱方向行走,False无定义;
反向行走:True表示大象出冰箱方向行走,False无定义;
属性说明:
三维尺寸:大象的体积,包括长宽高的尺寸;
重量:大象的总重量;
智商:大象的智商;
将以上信息概括后可以在一个统一的模型(后续有模型说明)中得到体现,具体见下图所示:
图 3‑4 : 大象在PLC中的程序模型
如此,就将冰箱和大象的模型在程序中得以再造,只要将这两个模型在程序中建立接口关系,那客户的需求将大象装进冰箱就很容易得以实现。此时,只要我们给大象下达走进冰箱的指令,冰箱就会在得到信息后打开对应门,大象自己就走进去了。
若此时大象体积太大或者超重(数据来自传感器),冰箱模块还会告知系统不能装载大象的原因。
同时,后续客户有其他需求的时候,只要在给冰箱的输入信息中说明,冰箱就会执行相应的动作,比如门打开就好或者冷冻温度设置到-18°等等其他需求;
3.5.其他说明
通过上述的描述发现大象和冰箱有两个相同点:
1.两个控制对象的控制模型是一样的;
2.两个控制对象有一个相同的Function:正反转;
表 3-4 : 对象正反转定义表
现假设冰箱对象的程序名为FB_FrIndentityge,大象的程序名为FB_Elephant。那后续的项目中只要有这两个对象,我们要做的工作就是将程序名实例化而已。
面向过程只是着眼于当前工艺需求,编程简便快捷但后续维护和再次使用比较困难,也无法形成对应模型知识库,相关技术及知识得不到累积和传承。
面向对象就是在制造东西,是将现实中的对象在程序中再造一次。面向对象编程工作量大且需要具备相当的能力将对象的属性提炼总结出来,但面向对象的程序具有模块化,接口化等特点,便于后续的维护和使用,利于形成行业知识库,技术可以得到累积、发展、传承和更新。
随着技术发展,冰箱的能力会越来越先进,那对于程序员来说要做的工作就是与时俱进更新FB_Fridge的功能,这样FB_Fridge的版本就会从原始版本跟着时代的更新发展到更多的版本。这样,对于冰箱这个对象,我们的再造功能已经完成而且我们还能按照客户需求选择不同版本的程序来满足客户(客户的冰箱可能是老款)的需求;
表3-5 : 两种编程方法优缺点对比
3.6.后记
上述就是以一个非控制实体为列演示的面向对象的编程思路,在实际编程中最重要的就是要把对象详细拆分正确,而这些就是前面两章从机械和电气两方面对设备工艺的详细拆分;
不要看上述工艺的拆分,这是最考验工程师能力的地方;往往很多标准化设备由于工艺理解不到位,或者工艺总结没有细致详细,到实际工作就发现某个已经做好的标准化设备,由于其中很小的一个改动或者客户的一个不同要求的提出,这个标准的设备就又无法适用需求;
所以,前面两章节是整个标准化系统最重要的环节,这两个部分做的很好,后面章节就是将整个工艺在控制器中搭建出来,只是一个思想的执行者而已;
所以,工艺部分的理解和拆分的标准化,才是我们整个标准化的灵魂;这也应了一句话就是,程序就是工艺;
相关问答
plc程序运行规则?
1.简单性使PLC程序尽可能简单。简单的含义就是尽可能的使用标准化的程序框架,尽可能使用简单的指令。要想程序简单,从大的方面讲,要优化程序结构,用流程...
什么专业主修PLC?
PLC是电气设计及自动化专业的主要课程,有的学校的电子工程专业也要求这门课。PLC,即可编程逻辑控制器,它采用一类可编程的存储器,用于其内部存储程序,执行逻...
PLCS7-SCL是什么意思?
...可以说,SCL(SCL其实是西门子的称呼,其他基于61131-3标准的叫ST,结构化文本)简化版的pascal。但是,真正的完全支持61131-3标准的ST语言复杂度是不亚于pasc...
怎么才能练习编程的思想?
编程,是做控制类工程师都很头疼的事,尤其是一些刚刚入门的初学者,更是对程序无从下手,编出来的程序总是错误百出,易读性差。那么对于编程,怎么才能编出好的...本...
plc的与或非图怎样表示?
PLC编程,其与或非跟其他语言是一样的,只是表示方法不一样而已,当然,PLC体现的是实际的控制电路,所以可以这么来理解:与:就是两个触点的串联;或:就是两...PL...
plc的上端,下端都是哪些东西?
PLC上端一排是输入端子X,下端一排是输出端子Y。上面一排可以接输入信号包括接近开关、行程开关、按钮、编码器等,下面一排可以接输出信号包括中间继电器、接触...
stl语言和scl语言的区别?
STL语言和SCL语言都是西门子公司的工业自动化编程语言,不过二者在语法和特点上有所不同。STL(StructuredTextLanguage)语言是一种结构化文本语言,它采用类...
ddc与plc的区别?
1.结构差别:DDC是一种“分散式控制系统”,组成的系统是分层的结构,可以实现点对点的通讯,而PLC只是一种控制“装置”,常用于生产线上某个部位的控制,组成...
PLC是用来控制相关接触器,继电器从而来控制电路的嘛?
主要看PLC输出功率是否与接触器线圈电流匹配,若不匹配则需增加过渡继电器:PLC的输出接到继电器的线圈。从而控制几点起的通断,再用继电器来控制电机,电磁阀等...
DDC和PLC的区别是什么呢?
1.结构差别:DDC是一种“分散式控制系统”,组成的系统是分层的结构,可以实现点对点的通讯,而PLC只是一种控制“装置”,常用于生产线上某个部位的控制,组成...