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 .
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
...
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>
).
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;