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. Questo significa che implementazioni specifiche correlate alle classi derivate possono prevalere sulle azioni della classe di base.
Per far sì che prevalga l'azione della classe di base, assegnare alla classe di base l'istruzione pragma {attribute 'no_virtual_actions'}.
{attribute 'no_virtual_actions'}
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 passo singolo con azione associata ActiveAction relativa all'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. Differisce da quella originale per il fatto che viene assegnata la stringa 'child_action' anziché 'father_action' nella variabile test_act.
Analogamente, il metodo METH, che assegna la stringa 'father_method' alla variabile test_meth nella classe di base, verrà bypassato per cui test_meth verrà invece assegnato a 'child_method'.
Il programma principale PLC_PRG eseguirà più chiamate 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'.