A supporto della programmazione a oggetti, è possibile derivare un blocco funzione da un altro blocco funzione. Ciò significa che un blocco funzione può estenderne un altro e ottenere automaticamente, oltre alle proprie, anche metodi/proprietà/azioni/transizioni del blocco funzione su cui si basa.
L'estensione avviene utilizzando la parola chiave EXTENDS
nella dichiarazione del blocco funzione. È possibile scegliere l'opzione EXTENDS
già quando si aggiunge il blocco funzione al progetto tramite la finestra di dialogo .
Per ulteriori informazioni, consultare le sezioni che descrivono come aggiungere un metodo, una proprietà, un'azione o una transizione.
FUNCTION_BLOCK <nome blocco funzione> EXTENDS <nome blocco funzione>
Segue la dichiarazione delle variabili.
Definizione di blocco funzione fbA
FUNCTION_BLOCK fbA
VAR_INPUT
x:int;
END_VAR
...
Definizione di blocco funzione fbB
FUNCTION_BLOCK fbB EXTENDS fbA
VAR_INPUT
ivar: INT := 0;
END_VAR
...
EXTENDS
Estensione tramite EXTENDS
significa:
fbB
contiene tutti i dati e i metodi definiti da fbA
. È possibile utilizzare un'istanza di fbB
in qualsiasi contesto in cui potrebbe trovarsi un blocco funzione di tipo fbA
.
A fbB
è consentito ignorare metodi/proprietà/azioni/transizioni definiti in fbA
. Ciò significa che fbB
può dichiarare un metodo con lo stesso nome, gli stessi ingressi e le stesse uscite dichiarati da A
.
fbB
non può dichiarare variabili del blocco funzione con lo stesso nome utilizzato in fbA
. In questo caso, il compilatore genererebbe un messaggio di errore.
Alle variabili e ai metodi di fbA
si può accedere direttamente nel campo di fbB
tramite il puntatore 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;