功能块的扩展

概述

在支持面向对象的编程的情况下,功能块可衍生自另一个功能块。这意味着功能块可扩展另一个功能块,从而自动获得除自己以外的方法/属性/操作/转移以及基本功能块的变量。

扩展通过在功能块的声明中使用关键字 EXTENDS 来执行。在通过添加对象对话框向项目添加功能块期间,可选择 EXTENDS 选项。

有关更多信息,请参阅介绍任何添加方法属性操作转移的章节。

语法

FUNCTION_BLOCK <功能块名称> EXTENDS <功能块名称>

这后面是变量的声明。

示例

功能块 fbA 的定义

FUNCTION_BLOCK fbA
VAR_INPUT
    x:int;
END_VAR
...

功能块 fbB 的定义

FUNCTION_BLOCK fbB EXTENDS fbA
VAR_INPUT
    ivar: INT := 0;
END_VAR
...

通过 EXTENDS 扩展

通过 EXTENDS 扩展意味着:

  • fbB 包含所有由 fbA 定义的数据和方法。fbB 的实例现在可在存在 fbA 类型的功能块的任何上下文中使用。

  • fbB 用于覆盖 fbA 中定义的方法/属性/操作/转移。这意味着:fbB 可声明的方法具有和 A 所声明的一样的名称、输入和输出。

  • 不允许 fbB 声明具有和在 fbA 中使用的一样的名称的功能块变量。在该情况下,编译器将生成错误信息。

  • 可使用 SUPER 指针SUPER^.<method>)直接在 fbB 范围内访问 fbA 变量和方法。

注: 功能块可实现多个接口,但只能扩展单个功能块。

示例

FUNCTION_BLOCK FB_Base
VAR_INPUT
END_VAR
VAR_OUTPUT
    iCnt : INT;
END_VAR
VAR
END_VAR
THIS^.METH_DoIt();
THIS^.METH_DoAlso();
    
    METHOD METH_DoIt : BOOL
    VAR
    END_VAR
    iCnt := -1;
    METH_DoIt := TRUE;
    
    METHOD METH_DoAlso : BOOL
    VAR
    END_VAR
    METH_DoAlso := TRUE;
FUNCTION_BLOCK FB_1 EXTENDS FB_Base
VAR_INPUT
END_VAR
VAR_OUTPUT
END_VAR
VAR
END_VAR
// Calls the method defined under FB_1
THIS^.METH_DoIt();
THIS^.METH_DoAlso();
// Calls the method defined under FB_Base
SUPER^.METH_DoIt();
SUPER^.METH_DoAlso();
    METHOD METH_DoIt : BOOL
    VAR
    END_VAR
    iCnt := 1111;
    METH_DoIt := TRUE;
PROGRAM PLC_PRG
VAR
    Myfb_1: FB_1;
    iFB: INT;
    iBase: INT;
END_VAR
Myfb_1();
iBase := Myfb_1.iCnt_Base;
iFB := Myfb_1.iCnt_THIS;