在支持面向对象的编程的情况下,功能块可衍生自另一个功能块。这意味着功能块可扩展另一个功能块,从而自动获得除自己以外的方法/属性/操作/转移以及基本功能块的变量。
扩展通过在功能块的声明中使用关键字 EXTENDS
来执行。在通过 对话框向项目添加功能块期间,可选择 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;