Skip to main content

Attribut : no_virtual_actions

Le pragma est utilisé pour les blocs fonctionnels qui sont dérivés d'un bloc fonctionnel implémenté en SFC et qui utilisent la séquence SFC fondamentale de cette classe de base. Les actions qui y sont appelées présentent le même comportement virtuel que les méthodes. Cela signifie que les implémentations des actions de la classe de base peuvent être remplacées par la classe dérivée avec ses propres implémentations spécifiques.

Si vous appliquez le pragma à la classe de base, ses actions sont protégées contre la surcharge.

Syntaxe:

{attribute 'no_virtual_actions'}

Emplacement d'insertion : première ligne de la partie déclaration du bloc fonctionnel

Exemple 12.

Le bloc fonctionnel POU_SFC est la classe de base du bloc fonctionnel dérivé POU_child. La classe dérivée POU_child appelle la séquence de la classe de base écrite en SFC au moyen de la variable spéciale SUPER.

_cds_img_pragma_virtual1.png
_cds_img_attribute_nva_ex1.png

L'implémentation de cette séquence donnée à titre d'exemple se limite à l'étape initiale, suivie d'une seule étape avec une action d'étape liée ActiveAction. Cette étape avec une action d'étape liée se charge de la configuration des variables de sortie.

an_int := an_int+1;    // Counting the action calls
test_act := 'father_action';
METH();              // Call of the method METH in order to set the string variable test_meth

Dans le cas de la classe dérivée POU_child, l'action d'étape est remplacée par une implémentation spécifique de ActiveAction. ActiveAction ne diffère de l'original que par l'affectation de la chaîne 'child_action' au lieu de 'father_action' à la variable test_act.

De même, la méthode METH, qui affecte la chaîne 'father_method' à la variable test_meth dans la classe de base, est redéfinie de sorte que test_meth reçoive désormais la valeur 'child_method'. Le programme principal PLC_PRG appelle une instance du bloc fonctionnel POU_child, nommée Child. Comme prévu, la valeur des chaînes reflète l'appel de l'action et de la méthode de la classe dérivée :

_cds_img_pragma_virtual3.png

Toutefois, vous faites maintenant précéder la classe de base du pragma {attribute 'no_virtual_actions'} :

{attribute 'no_virtual_actions'}

FUNCTION_BLOCK POU_SFC...

Cela modifie le comportement : alors que l'implémentation de la classe dérivée est toujours utilisée pour la méthode METH, l'appel de l'action d'étape entraîne désormais un appel de l'action ActiveAction de la classe de base. Par conséquent, test_act reçoit désormais la valeur 'father_action' :

_cds_img_pragma_virtual4.png