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 existenteac_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.
'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
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
oLREAL
o instancia de tipoSTRING
oWSTRING
.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.
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
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.
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.
PROGRAM PLC_PRG VAR {attribute 'ac_persist_exclude'} fb1 : FB; END_VAR