Estensione di un blocco funzione
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 Aggiungi oggetto.
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
...
Estensione tramite EXTENDS significa:
ofbB 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.
oA 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.
ofbB non può dichiarare variabili del blocco funzione con lo stesso nome utilizzato in fbA. In questo caso, il compilatore genererebbe un messaggio di errore.
oAlle variabili e ai metodi di fbA si può accedere direttamente nel campo di fbB tramite il puntatore SUPER (SUPER^.<method>).
NOTA: Un blocco funzione può implementare più interfacce, ma estendere solo un singolo blocco funzione.
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;