Grâce à la prise en charge de la programmation orientée objet, il est possible de dériver un bloc fonction d'un autre bloc fonction. Cela signifie qu'un bloc fonction peut en étendre un autre, récupérant ainsi automatiquement les méthodes/propriétés/actions/transitions et variables du bloc fonction de base en plus des siennes.
L'extension est effectuée en introduisant le mot-clé EXTENDS dans la déclaration d'un bloc fonction. Vous pouvez déjà choisir l'option EXTENDS lors de l'ajout d'un bloc fonction dans un projet par le biais de la boîte de dialogue Ajouter un objet.
Pour plus d'informations, reportez-vous aux sections expliquant comment ajouter une méthode, une propriété, une action ou une transition.
FUNCTION_BLOCK <nom du bloc fonction> EXTENDS <nom du bloc fonction>
Viennent ensuite les déclarations des variables.
Définition du bloc fonction fbA
FUNCTION_BLOCK fbA
VAR_INPUT
x:int;
END_VAR
...
Définition du bloc fonction fbB
FUNCTION_BLOCK fbB EXTENDS fbA
VAR_INPUT
ivar: INT := 0;
END_VAR
...
Signification de l'extension avec EXTENDS :
ofbB contient toutes les données et toutes les méthodes définies par fbA. Il est possible d'utiliser une instance de fbB chaque fois qu'un bloc fonction de type fbA est attendu.
ofbB peut remplacer les méthodes/propriétés/actions/transitions définies dans fbA. Cela signifie que fbB peut déclarer une méthode portant le même nom qu'une méthode déclarée par A et avec des entrées et une sortie identiques.
ofbB ne peut pas déclarer des variables de bloc fonction portant le même nom que celles utilisées dans fbA. Si c'est le cas, le compilateur génère un message d'erreur.
oLes méthodes et les variables de fbA sont accessibles directement via fbB, à l'aide du pointeur SUPER (SUPER^.<method>).
NOTE : un bloc fonction peut mettre en œuvre plusieurs interfaces, mais ne peut étendre qu'un seul bloc fonction.
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;