IEC 61131-3第三版对IEC 61131-3:2003的功能块概念进行如下扩展,以支持使用类的概念的面向对象范式。
1)添加用于功能块的方法。
2)添加用于功能块的接口实现。
3)添加用于功能块的继承。
表1-68是面向对象的功能块的性能。它是表1-53的扩展。
表1-68 面向对象的功能块的性能
(续)
1.附加的用于功能块的方法
面向对象的功能块中,可以添加方法。方法是一组可选的语言元素,用于定义在功能块实例数据执行的操作。
面向对象的功能块可有一个功能块本体和附加的一组方法。根据附加方法的有无,功能块有三种变形。
(1)只有功能块本体的功能块
这种功能块就是1.4.7节介绍的功能块。功能块不含可实现的方法。表1-69显示该功能块元素和功能块的调用。
功能块的输入和输出变量可直接从外部进行写和读的操作。但对功能块的输入-输出变量,不允许从外部直接读取,只允许在调用功能块时读取。
表1-69 只有功能块本体的功能块的调用
(2)只有方法的功能块
只有方法的功能块没有功能块本体程序。由于方法的输入变量、输出变量、内部变量和返回值都是暂存变量,不是静态变量,因此,只能在调用时存取。表1-70显示该类功能块元素和功能块的调用。
功能块可包含多个方法。这些方法的输入变量和输出变量只在调用该方法时才与外部进行信息交换。外部变量可直接读取方法的返回值。
表1-70 只有方法的功能块的调用
(3)包含方法和功能块本体的功能块
包含方法和功能块本体程序的功能块是上述两种功能块的组合。功能块本体的输入变量、输出变量可直接与外部进行信息交换,而其方法的输入变量、输出变量,功能块的输入-输出变量只能在调用时进行信息交换。
表1-71是包含方法和功能块本体程序的面向对象的功能块元素和功能块调用方法。
表1-71 包含方法和功能块本体程序的面向对象的功能块元素和功能块调用方法
2.功能块中方法的声明和执行
(1)功能块中方法的声明
功能块中方法的声明与方法在类中方法的声明类似,遵循下列规则:
1)功能块中方法的声明段位于功能块变量声明段与功能块本体程序之间。
2)功能块中方法的声明段应在功能块类型的范围内声明。
3)方法的声明可用IEC61131标准规定的任何一种编程语言定义。
4)方法对实例数据的操作有不同的存取属性,即PUBLIC(公有)、PRIVATE(私有)、INTERNAL(内部)和PROTECTED(保护)。没有给出存取声明符的方法,具有默认的PROTECTED存取属性。
5)方法声明中可以声明它自己的变量,包括VAR_INPUT、VAR、VAR_TEMP、VAR_OUTPUT、VAR_IN_OUT和一个方法的返回值结果。
6)方法可选用附加属性。它们是OVERRIDE(覆盖)或ABSTRACT(抽象)。但方法的覆盖属性不在IEC 61131-3的本部分范围。
与函数类似,方法的声明段应包含下列内容:
1)方法名。它用于标识方法。
2)方法的返回值数据类型。与函数类似,方法可有返回值和没有返回值。如果有返回值,则应声明其数据类型。
3)参数列表。在方法中采用的各参数(形式参数)列表。每个参数应有其变量名,数据类型和(如果用户约定,可设置的)初始值。方法参数用逗号分隔,在一个圆括号内列出。空括号表示没有方法参数。
4)方法的本体,即方法需要执行的操作。
【例1-64】包含方法的功能块的声明。可参见例1-46,便于比较。
(2)功能块中方法的执行
与方法在类中的执行方法类似,功能块中方法的执行遵循下列规则:
1)方法被执行时,一个方法可以读它的输入和用它的暂存变量来计算它的输出和它的返回值结果。
2)方法的返回值赋值给方法名。
3)方法的所有变量和返回值都是暂存的,即其值在方法的本次执行到下一次执行之间是不被存储的。因此,方法执行的输出变量求值只能在方法调用时直接的结果。
4)每个方法和类的变量名应是唯一的。但因内部变量表存储,因此,不同方法的内部变量名可相同。
5)对在功能块内声明的输入、输出、静态变量和外部变量,所有方法具有进行读和写操作的功能。但功能块内声明的暂存功能块变量VAR_TEMP和VAR_IN_OUT变量不具有存取功能。
6)所有变量和返回值结果可以是多值的,即可以是一个数组或一个结构变量。与函数类似,方法的返回值结果可作为表达式的一个操作数。(www.xing528.com)
7)方法执行时,方法可使用THIS调用在该功能块内定义的其他方法。其他调用见下述。
8)方法的变量不能用功能块本体(算法)存取。
(3)功能块中方法和变量的存取属性
功能块中的方法和变量都有它们的可访问属性。功能块中的方法可以设置其存取属性,即方法有PUBLIC(公有)、PRIVATE(私有)、INTERNAL(内部)和PROTECTED(保护)属性。变量也有PUBLIC(公有)、PRIVATE(私有)、INTERNAL(内部)和PROTECTED(保护)属性。调用时,根据方法的存取属性在其允许的范围进行存取访问的操作。功能块中的方法具有其自己的变量存取属性。
在VAR变量段,它必须从该变量段变量允许被存取的地方被定义。
通常,变量的存取属性如下:
1)输入和输出变量的存取属性是隐式的PUBLIC。因此,在输入和输出变量段声明的变量不使用存取符。
2)输出变量是隐式只读属性(READ ONLY)。
3)输入-输出变量只能用于功能块本体和在调用语句时赋值,不允许从外部直接赋值给输入-输出变量。
4)外部变量VAR_EXTERNAL段的变量存取是隐式的PROTECTED,因此,在外部变量声明段的变量也不使用存取符。
3.功能块的继承
与类的继承类似,面向对象的功能块可以继承。一个或多个功能块类型可以被派生,派生的功能块可以继续派生出它的子功能块。
(1)功能块的继承
功能块可从基功能块继承,也可从基类继承,都采用关键字EXTENDS。
【例1-65】功能块的继承。
不管是从基功能块继承,还是从基类继承,派生的功能块具有其父功能块或父类的所有输入、输出等变量和有关的方法。此外,派生的功能块还可自己声明其输入、输出等变量等和其功能块本体。
(2)派生功能块本体程序的调用
基功能块的本体程序不能通过功能块的继承,自动传递到派生功能块。派生功能块有它自己的本体程序,默认为空,为将基功能块的本体程序继承到派生功能块,可采用SUPER()调用。
SUPER()调用的规则如下:
1)当调用基功能块时,派生功能块的本体(如果有的话)被执行。
2)调用SUPER()实现在派生功能块内附加的基功能块本体程序的执行。调用SUPER()不需要设置参数。
3)调用SUPER()将在基功能块本体执行一次,而不是循环执行。
4)在基功能块或基类和派生功能块中变量名应是唯一的。
5)SUPER()只在功能块本体被调用,它不在功能块的方法内被调用。
6)功能块的调用是动态绑定的。
①派生功能块用于基功能块或基类所定义使用的范围内。
②SUPER()只在功能块本体调用,不能在功能块的方法内调用。
【例1-66】功能块继承中SUPER()的作用。
示例说明,采用SUPER()可调用基功能块程序,而本体程序也可执行。因此,上述功能块FB_BASE1既继承基功能块的变量,也可用SUPER()调用基功能块的本体程序,并增加它所需的本体程序。它也可表示为:
(3)派生功能块中方法的覆盖
派生功能块继承父功能块的方法或父类的方法。如果派生功能块不想原封不动地继承父功能块或父类中的方法,而需做修改,则可采用方法的覆盖。与类中方法的覆盖类似,功能块中方法覆盖时,派生功能块中的方法与父功能块或父类中某一方法应具有相同的方法名、返回数据类型和参数表(也称三同),则新方法将覆盖原有的方法。
【例1-67】派生功能块中覆盖方法。
覆盖后的方法应有相同的存取属性。需注意,具有FINAL属性的方法不能被覆盖。具有FINAL属性的功能块不能再继承。因此,FINAL属性的功能块不能被用于成为基功能块。
(4)动态名绑定
方法名的绑定与方法实现的方法名有关。功能块的动态名绑定是将方法名关联到功能块实例的实际类型的一种方法实现。与类中方法的动态绑定类似,在功能块中方法的动态绑定是将该方法名与功能块实例的实际类型进行关联。
动态名绑定的优点是在运行前可进行多种选择绑定,但绑定是在程序执行时进行,因此执行效率低。
4.功能块中方法的调用
方法的调用分为从方法所在功能块实例内的调用和从方法所在基功能块实例的方法调用两种。调用格式与类实例的方法调用类似。
(1)用THIS实现功能块实例内方法调用
与类实例内方法的调用类似,THIS关键字用于调用本功能块实例的方法。这是方法的动态绑定。
【例1-68】本功能块实例内方法的调用,可参见例1-46。
(2)用SUPER实现功能块实例外的方法调用类似地,可用SUPER实现对基功能块实例的方法调用。注意,这是方法的静态绑定。
【例1-69】基功能块实例的方法调用,可参见例1-48。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。