Skip to main content

Definición de variables persistentes

Las variables individuales, así como las instancias de estructura y las instancias de bloques de funciones, se pueden marcar como "persistentes" mediante el uso de atributos. Cuando se marca una instancia, todos los miembros de VAR, VAR_INPUT, y VAR_OUTPUT se almacenará de forma persistente. En caso de que las variables en un VAR PERSISTENT sección están marcados como "persistentes", se creará una advertencia.

Además, existen atributos para definir un grupo de almacenamiento predeterminado, así como para excluir variables particulares del almacenamiento persistente de estructuras o instancias de bloques de funciones.

Si se ha modificado la definición de variables persistentes (agregando, eliminando, renombrando, cambiando el tipo de datos) no se debe ejecutar ninguna nueva generación de código compositor (comando Generar). Estos cambios se actualizarán automáticamente en las instancias de Persistent Manager durante la compilación.

Para obtener información sobre las posibles conversiones implícitas en caso de una definición de tipo de datos modificada, consulte: Parámetro

Tipos de datos admitidos

Las instancias con los siguientes tipos de datos no se pueden almacenar de forma persistente:

  • BIT

  • Pointer

  • Interfaces

  • Constantes

  • Matrices de tipos de datos no persistentes

Todos los demás tipos de datos son compatibles. Esto incluye enumeraciones, tipos de datos de subrango, matrices de matrices y matrices multidimensionales:

ARRAY[0..9] OF ARRAY[5..6, 7..8, 9..10] OF INT

Tipo de datos: UNIÓN

Para guardar la instancia de una unión de forma persistente, uno de sus campos debe marcarse como "representante". Hay tres formas posibles:

  • Exactamente un campo en la declaración de la unión está marcado con el atributo ac_persist_union_representant (sin valor de atributo). Este campo entonces "representa" al sindicato. Su valor se guardará y cargará de forma representativa para la unión completa.

  • Exactamente un campo en la declaración de la unión está marcado con el atributo ac_persist – esto define al mismo tiempo al representante.

  • La instancia de la unión está marcada con el atributo. ac_persist_union_set_representant incluido el valor del atributo. El valor del atributo describe el nombre del campo de unión que se utilizará como representante. Este atributo sobrescribe un existente ac_persist_union_representant atributo en la declaración de la unión. Los conjuntos de uniones también se pueden marcar y hacer referencia a los elementos del conjunto.

ejemplo 2. Ejemplos

'ac_persist_union_representant'

TYPE UnionWithRep :
UNION
        di : DINT ;
        {attribute 'ac_persist_union_representant'}
        dw : DWORD ;
END_UNION
END_TYPE

'ac_persist'

TYPE UnionWithPersist :
UNION
        di : DINT ;
        {attribute 'ac_persist' := 'TestUnion'}
        dw : DWORD ;
END_UNION
END_TYPE

'ac_persist_union_set_representante'

FUNCTION_BLOCK FBTestUnion
VAR
        {attribute 'ac_persist_union_set_representant' := 'dw'}
        u2 : UnionWithoutRep ;
END_VAR

Array of union

VAR
        {attribute 'ac_persist_union_set_representant' := 'dw'}
        aElems ARRAY[0..7] OF SomeUnion ;

        {attribute 'ac_persist_union_set_representant' := 'dw'}
        aaElems ARRAY[0..7] OF ARRAY[0..1] OF SomeUnion ;
END_VAR


. Para que un representante sea válido debe cumplir las siguientes reglas:
  • El representante debe tener el mismo tamaño que todo el sindicato. De lo contrario no se guardarían los datos completos. El representante tampoco debe tener áreas de relleno (áreas de datos vacías creadas por el compilador para alinear los datos en el almacenamiento).

  • La descomposición del representante en tipos de datos primitivos no debe contener instancias de tipo REAL o LREAL o instancia de tipo STRING o WSTRING.

  • Además, el representante debe constar de tipos compatibles (ver arriba). Por ejemplo el representante puede ser del tipo Structure – sin embargo, la estructura en sí no debe contener un puntero.

Atributo: 'ac_persist'

El atributo 'ac_persist'puede usarse para

  • variables

  • Instancias de estructuras

  • Instancias de bloques de funciones

  • Miembros de estructuras

  • Miembros de bloques de funciones.

{attribute 'ac_persist' [ := '<PERSISTENCE_GROUP>']}

PERSISTENCE_GROUP es el nombre del grupo de persistencia al que debe asignarse la declaración. Debe ser un identificador IEC válido. Si no se nombra ningún grupo de persistencia aquí, la asignación se realizará según el atributo 'ac_persist_set_default_group', que en este caso debe definirse.

Si una instancia de estructura o una instancia de bloque de funciones está marcada como "persistente" y al menos un miembro en la declaración también está marcado como "persistente", se creará un mensaje de error.

ejemplo 3. Ejemplo de una instancia persistente

La variable t está asignado al grupo de persistencia PROCESS. Todos los miembros se almacenarán de forma persistente.

PROGRAM PLC_PRG
VAR
        {attribute 'ac_persist' := 'PROCESS'}
        t : TON;
END_VAR


ejemplo 4. Ejemplo de miembros persistentes de un bloque de funciones

El miembro iNumIOs está asignado al grupo de persistencia CONFIG. Este miembro se almacenará de forma persistente para todas las instancias del bloque de funciones (si no lo suprime explícitamente el atributo 'ac_persist_exclude').

FUNCTION_BLOCK FB
VAR
        {attribute 'ac_persist' := 'CONFIG'}
        iNumIOs : INT := 0;
END_VAR


Atributo: 'ac_persist_set_default_group'

Si el nombre del grupo falta en el atributo 'ac_persist', a grupo predeterminado debe definirse en una instancia de bloque de funciones o instancia de estructura que contenga directa o indirectamente la variable respectiva. Esto es posible con el atributo 'ac_persist_set_default_group'. El atributo también se puede configurar para un miembro del bloque de funciones. La definición más interna encontrada de 'ac_persist_set_default_group' se utilizará como grupo predeterminado para la variable.

No está permitido utilizar 'ac_persist_set_default_group' Juntos con 'ac_persist' o 'ac_persist_exclude'. En este caso, se creará un mensaje de error durante la generación del código.

ejemplo 5. Ejemplo de un grupo predeterminado
FUNCTION_BLOCK FB_Util
VAR
        {attribute 'ac_persist'} // no group
        //'ac_persist_set_default_group‘ and 'ac_persist_exclude' not allowed here
        i : INT := 0;
END_VAR
PROGRAM PLC_PRG
VAR
        {attribute 'ac_persist_set_default_group' := 'PROCESS'}
        fbu1 : FB_Util;

        {attribute 'ac_persist_set_default_group'´ := 'CONFIG'}
        fbu2 : FB_Util;
END_VAR


Atributo: 'ac_persist_exclude'

el atributo 'ac_persist_exclude' se utiliza para excluir una variable del almacenamiento persistente, sin importar si los miembros de la estructura o la declaración del bloque de funciones están definidos como "persistentes". Si no existen miembros persistentes en la declaración, se creará un error durante la generación del código.

ejemplo 6. Ejemplo de exclusión de variables
PROGRAM PLC_PRG
VAR
        {attribute 'ac_persist_exclude'}
        fb1 : FB;
END_VAR