Extensión de un bloque de funciones
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.
FUNCTION_BLOCK <nombre bloque funciones> EXTENDS <nombre bloque funciones>
A esto le sigue la declaración de las variables.
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
...
La extensión mediante EXTENDS significa que:
ofbB 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.
ofbB 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.
ofbB 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.
oSe 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.
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;