功能块的扩展

支持面向对象的编程方式一个 功能块可以被另一个功能块派生,这意味着一个功能块可以扩展另一个,可以自动获得基础功能块的基本属性。

扩展是通过功能块定义中 的关键字EXTENDS实现的。在添加功能块时可以通过 '添加对象'对话框中选择择EXTENDS操作,实现功能块的扩展。

语法:

FUNCTION_BLOCK <function block name> EXTENDS <function block name>

规则按照变量声明的规则。

Example

定义功能块 fbA:

FUNCTION_BLOCK  fbA
VAR_INPUT
VAR_INPUT
    x:int;
END_VAR
...
 

定义功能块 fbB:

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

用过 EXTENDS 方式进行扩展表示:

  • fbB包含fbA中定义的所有数据和方法。一个fbB的实例可以用在任何能够使用功能块fbA的地方。
  • fbB可以重载fbA中定义的方法。这意味着:fbB可以定义一个与A有相同名字和输入输出的方法。
  • fbB不允许使用与fbA中定义的变量。否则编译器将会报错。
  • fbA可以直接访问 fbB内的变量和方法通过使用 “SUPER 指针” (SUPER^.<method>)。

小心!

多重继承是不允许的。

示例

    
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;