摘要
面向对象编程,是一种利用对象、方法和属性,来组织和简化程序元素的最佳方式。
最新发布的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 )2022年9月刊《技术进展》栏目,原标题为:PLC程序设计:面向对象编程