Attribute no_virtual_actions
Questo attributo è valido per i blocchi funzione derivati da un blocco funzione di base implementato in SFC e che utilizzano il flusso di lavoro SFC principale della classe di base. Le azioni qui richiamate mostrano lo stesso comportamento virtuale dei metodi. Pertanto, le azioni della classe base possono essere sostituite da implementazioni specifiche correlate alle classi derivate.
Per evitare che l'azione della classe base venga sovrascritta, è possibile assegnare il pragma {attribute 'no_virtual_actions'}
alla classe base.
Nel seguente esempio, il blocco funzione POU_SFC
fornisce la classe di base da ampliare con il blocco funzione POU_child
.
Con l'uso della parola chiave SUPER
, la classe derivata POU_child
chiama il flusso di lavoro della classe di base implementata nell'SFC.
L'implementazione di esempio di questo flusso di lavoro è limitata al passo iniziale. Questo è seguito da 1 singolo passo con l’azione del passo ActiveAction riguardante l'assegnazione delle variabili di uscita:
an_int:=an_int+1; // counting the action calls
test_act:='father_action'; // writing string variable test_act
METH(); // Calling method METH for writing string variable test_meth
Nel caso della classe derivata POU_child
, un'implementazione specifica di ActiveAction prevarrà sull'azione del passo. Si differenzia da quella originale assegnando la stringa 'child_action'
anziché la stringa 'father_action'
alla variabile test_act
.
Allo stesso modo, il metodo METH
, che assegna la stringa 'father_method'
alla variabile test_meth
all'interno della classe base, verrà sovrascritto in modo che test_meth
sarà invece assegnato a 'child_method'
.
Il programma principale PLC_PRG
eseguirà chiamate ripetute a Child (un'istanza di POU_child
). Come previsto, il valore attuale della stringa di uscita riporta la chiamata all'azione e al metodo della classe derivata:
È possibile osservare un comportamento diverso se la classe di base è preceduta dall'attributo 'no_virtual_actions'
{attribute 'no_virtual_actions'}
FUNCTION_BLOCK POU_SFC...
Mentre il metodo METH
verrà ancora bypassato dalla rispettiva implementazione nella classe derivata, una chiamata dell'azione del passo risulterà una chiamata dell'azione ActiveAction della classe di base. Pertanto, test_act
verrà assegnato alla stringa 'father_action'
.