Extensión de un bloque de funciones

Descripción general

Al admitir la programación orientada a objetos, un bloque de funciones se puede derivar de otro bloque de funciones. Esto significa que un bloque de funciones puede ser la extensión de otro, con lo que obtienen automáticamente los métodos/propiedades/acciones/transiciones y variables del bloque de funciones base además de los suyos propios.

La extensión se efectúa con la palabra clave EXTENDS en la declaración de un bloque de funciones. Puede seleccionar la opción EXTENDS ya durante la adición de un bloque de funciones al proyecto mediante el cuadro de diálogo Agregar objeto.

Para obtener más información, consulte las secciones en las que se describe cómo añadir un método, una propiedad, una acción o una transición.

Sintaxis

FUNCTION_BLOCK <nombre bloque funciones> EXTENDS <nombre bloque funciones>

A esto le sigue la declaración de las variables.

Ejemplo

Definición del bloque de funciones fbA

FUNCTION_BLOCK fbA
VAR_INPUT
    x:int;
END_VAR
...

Definición del bloque de funciones fbB

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

Extensión mediante EXTENDS

La extensión mediante EXTENDS significa que:

  • fbB contiene todos los datos y métodos definidos por fbA. Ahora se puede utilizar una instancia de fbB en cualquier contexto en el que se espere un bloque de funciones de tipo fbA.

  • fbB tiene autorización para anular los métodos/propiedades/acciones/transiciones definidos en fbA. Esto significa que fbB puede declarar un método con el mismo nombre y la misma entrada y salida que el declarado por A.

  • fbB no tiene autorización para declarar variables de bloque de funciones con el mismo nombre que las utilizadas en fbA. En este caso, el compilador generará un mensaje de error.

  • Se puede acceder a las variables y los métodos de fbA directamente desde un ámbito de fbB mediante el puntero SUPER (SUPER^.<method>).

NOTA: Un bloque de funciones puede implementar diversas interfaces, pero solo puede extender un único bloque de funciones.

Ejemplo

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;