Skip to main content

Atributo: no_virtual_actions

El pragma se utiliza para bloques de funciones que se derivan de un bloque de funciones implementado en SFC y que utilizan la secuencia SFC fundamental de esta clase base. Las acciones llamadas desde ella presentan el mismo comportamiento virtual que los métodos. Esto significa que la clase derivada puede sustituir las implementaciones de las acciones de la clase base por sus propias implementaciones específicas.

Si aplica el pragma a la clase base, sus acciones quedan protegidas contra la sobrecarga.

Sintaxis:

{attribute 'no_virtual_actions'}

Ubicación de inserción: Línea superior de la parte de declaración del bloque de funciones

ejemplo 12.

El bloque de funciones POU_SFC es la clase base del bloque de funciones derivado POU_child. La clase derivada POU_child llama a la secuencia de la clase base escrita en SFC con la variable especial SUPER.

_cds_img_pragma_virtual1.png
_cds_img_attribute_nva_ex1.png

La implementación de ejemplo de esta secuencia se limita al paso inicial, seguido de un único paso con una acción de paso vinculada ActiveAction. Este paso con una acción de paso vinculada se encarga de la configuración de las variables de salida.

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

En el caso de la clase derivada POU_child, la acción de paso se sustituye por una implementación especial de ActiveAction. ActiveAction solo se diferencia del original por la asignación de la cadena 'child_action' en lugar de 'father_action' a la variable test_act.

Del mismo modo, el método METH, que en la clase base asigna la cadena 'father_method' a la variable test_meth, se sobrescribe de modo que test_meth obtiene ahora el valor 'child_method'. El programa principal PLC_PRG llama a una instancia del bloque de funciones POU_child denominada Child. Como era de esperar, el valor de las cadenas refleja la llamada de la acción y del método de la clase derivada:

_cds_img_pragma_virtual3.png

Ahora, sin embargo, anteponga a la clase base el pragma {attribute 'no_virtual_actions'}:

{attribute 'no_virtual_actions'}

FUNCTION_BLOCK POU_SFC...

Esto cambia el comportamiento: Mientras que para el método METH se sigue utilizando la implementación de la clase derivada, la llamada de la acción de paso da lugar ahora a una llamada de la acción ActiveAction de la clase base. Por lo tanto, test_act recibe ahora el valor 'father_action':

_cds_img_pragma_virtual4.png