Skip to main content

Atributo: no_virtual_actions

El pragma se utiliza para bloques de función derivados de un bloque de función implementado en SFC y que utilizan la secuencia fundamental de SFC de esta clase base. Las acciones invocadas desde él presentan el mismo comportamiento virtual que los métodos. Esto significa que las implementaciones de las acciones en la clase base pueden ser reemplazadas por la clase derivada con sus propias implementaciones específicas.

Si aplica el pragma a la clase base, sus acciones estarán protegidas contra la sobrecarga.

Sintaxis:

{attribute 'no_virtual_actions'}

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

ejemplo 10.

El bloque de función POU_SFC es la clase base para el bloque de función derivada 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 ejemplar de esta secuencia se limita al paso inicial, seguido de un solo 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 del paso se reemplaza por una implementación especial de ActiveAction. Active Action Se diferencia del original solo por la asignación de la cadena 'child_action' en lugar de 'father_action' en la variable test_act.

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

_cds_img_pragma_virtual3.png

Ahora, sin embargo, usted coloca el pragma {attribute 'no_virtual_actions'} delante de la clase base:

{attribute 'no_virtual_actions'}

FUNCTION_BLOCK POU_SFC...

Esto cambia el comportamiento: aunque la implementación de la clase derivada todavía se utiliza para el método METH, la llamada de la acción de paso ahora resulta en una llamada de la acción ActiveAction de la clase base. Por lo tanto test_act ahora se le da el valor 'father_action':

_cds_img_pragma_virtual4.png