Puede añadir las palabras clave de atributo siguientes a la declaración del tipo de variable para especificar el ámbito:
RETAIN
: consulte Variables Retain
PERSISTENT
: consulte Variables persistentes
CONSTANT
: consulte Constantes - CONSTANT, Literales con tipo
VAR_GENERIC CONSTANT
: consulte Constantes - VAR_GENERIC CONSTANT
RETAIN
, PERSISTENT
Las variables remanentes pueden conservar sus valores durante el periodo de ejecución del programa habitual. Declárelas como variables Retain o, para una mayor exigencia, como variables persistentes.
La declaración determina el grado de resistencia de una variable remanente en caso de restablecimientos, descargas o un reinicio del controlador. En las aplicaciones se utiliza principalmente la combinación de ambos indicadores remanentes (consulte Variables persistentes).
VAR PERSISTENT
se interpretan de la misma manera que una VAR PERSISTENT RETAIN
o VAR RETAIN PERSISTENT
.
La persistencia se consigue con los siguientes procedimientos:
Determinar las tareas cíclicas que acceden a la variable.
Copiar la variable en la listas de variables globales persistentes al final de la primera tarea cíclica (en cada ciclo).
Copiar el valor de la variable persistente en la variable normal cuando se reinicia el controlador.
Como la memoria se asigna tanto en la ruta de instancia como en la declaración, esta variable persistente requiere doble asignación de memoria en cada ciclo. Esto puede aumentar el tiempo de procesamiento, sobre todo con valores estructurados grandes.
Las variables declaradas como Retain se almacenan en un área de memoria no volátil. Para declarar este tipo de variable, utilice la palabra clave RETAIN
en la parte de declaración de una POU o en una lista de variables globales.
Ejemplo
VAR RETAIN
iRem1 : INT; (* 1. Retain variable*)
END_VAR
Las variables Retain conservan su valor incluso después de un apagado imprevisto del controlador o después de una operación de apagado y encendido normal del controlador (o cuando se ejecuta el comando
). Al reiniciar el programa, los valores conservados se seguirán procesando. Las otras variables (que no son Retain) se inicializan de nuevo, ya sea con sus valores de inicialización o con sus valores de inicialización predeterminados (en el caso de que no se haya declarado un valor de inicialización).Por ejemplo, puede utilizar un valor conservado cuando una operación (por ejemplo, el conteo de piezas en una máquina de producción) debe continuar tras un corte en el suministro eléctrico.
Las variables Retain, sin embargo, se reinicializan al ejecutar el comando
y, a diferencia de las variables persistentes, al ejecutar el comando o durante la descarga de una aplicación.VAR RETAIN
se almacenan en la memoria no volátil. Sin embargo, las variables locales definidas como VAR RETAIN
en las funciones NO se almacenan en la memoria volátil. La definición de VAR RETAIN
localmente en las funciones no tiene efecto alguno.
Si utiliza interfaces o bloques de funciones que no provienen de las bibliotecas de configuración del sistema en la sección del programa de retención (VAR_RETAIN
), provocará excepciones en el sistema que podrían dejar al controlador inoperativo, por lo que sería necesario un reinicio.
ADVERTENCIA | |
---|---|
RETAIN
, la instancia del bloque de funciones con sus variables se almacena en la memoria remanente. Esta función no está disponible para todos los controladores. Consulte la guía de programación específica de su controlador para obtener más detalles.
Las variables persistentes se identifican por palabra clave PERSISTENT
(VAR_GLOBAL PERSISTENT
). Solamente se reinicializan al ejecutar el comando . A diferencia de las variables Retain, conservan sus valores después de una descarga.
AT
en combinación con VAR PERSISTENT
.
Ejemplo de aplicación:
Un contador de horas de funcionamiento, que debe continuar contando incluso después de un corte en el suministro eléctrico o una descarga. Consulte la tabla sinóptica referente al comportamiento de las variables remanentes.
Las variables persistentes solamente se pueden declarar en una lista de variables globales especial de variables persistentes de tipo de objeto, que se asigna a una aplicación. Solamente se puede añadir una única lista de este tipo a una aplicación.
VAR_GLOBAL PERSISTENT
tiene el mismo efecto que una declaración con VAR_GLOBAL PERSISTENT RETAIN
o VAR_GLOBAL RETAIN PERSISTENT
.
PERSISTENT
fuera del editor de lista persistente. Si desea más información, consulte el comando.
Al igual que las variables Retain, las variables persistentes se almacenan en un área de la memoria por separado.
Ejemplo
VAR_GLOBAL PERSISTENT RETAIN
iVarPers1 : DINT; (* 1. Persistent+Retain Variable App1 *)
bVarPers : BOOL; (* 2. Persistent+Retain Variable App1 *)
END_VAR
Cada vez que la aplicación se vuelva a cargar, la lista de variables persistentes del controlador se comparará con la del proyecto. La lista del controlador se identifica por la aplicación. En caso de discrepancias, se le pedirá que reinicialice todas las variables persistentes de la aplicación. La discrepancia puede ser el resultado de cambiar el nombre de las declaraciones existentes en la lista, de eliminar dichas declaraciones o de realizar otro tipo de modificaciones en ellas.
Puede añadir declaraciones nuevas únicamente al final de la lista. Durante una descarga, se detectarán como nuevas y no exigirán una reinicialización de toda la lista. Si modifica el nombre o el tipo de datos de una variable, esta se gestionará como una nueva declaración, lo cual provocará la reinicialización de la variable en la próxima descarga o modificación que se realice en línea.
PERSISTENT
, la instancia de bloque de funciones con sus variables se almacena en la memoria remanente, pero solo la variable se trata como persistente.
Consulte la guía de programación específica de su controlador para obtener más información sobre el comportamiento de las variables remanentes.
CONSTANT
Las constantes se identifican mediante la palabra clave CONSTANT
. Puede declararlas localmente (programming object unit) o globalmente (lista de variables globales). Puede acceder a las variables de constante con acceso de solo lectura en la parte de implementación de una POU.
Sintaxis
<scope> CONSTANT <identifier>:<type> := <initialization>;
END_VAR
Con <scope> : VAR | VAR_INPUT | VAR_STAT | VAR_GLOBAL
Asegúrese de asignar un valor de inicialización cuando declare una variable de constante.
Ejemplo
VAR CONSTANT
c_iCon1:INT:=12; (* 1. Constant*)
END_VAR
Consulte el capítulo Operandos para ver una lista de las constantes posibles.
VAR_GENERIC CONSTANT
Una constante genérica es una variable en el VAR_GENERIC CONSTANT
área de declaración de un bloque de funciones a la que no se asigna un valor de inicialización hasta que se asigna la instancia del bloque de funciones.
Sintaxis: Declaración del bloque de funciones:
FUNCTION_BLOCK <function block name>
VAR_GENERIC CONSTANT
<generic constant name> : <integer data type> := <initial value>; //Initial value will be overwritten
END_VAR
;
Puede utilizar la constante genérica (tipo de datos entero) de un bloque de funciones para el tamaño de las matrices o la longitud de las cadenas, por ejemplo. El valor inicial <initial value>
solo es necesario para las comprobaciones de compilación. En tiempo de ejecución, el valor se sobrescribe.
Sintaxis: Declaración de la instancia del bloque de funciones:
PROGRAM PLC_PRG
VAR
<fb instance name> : <function block name> < <literal> >;
<fb instance name> : <function block name> <( <expression> )>;
END_VAR
;
Cuando se declaran las instancias del bloque de funciones, se asigna a la constante un valor específico que es válido exclusivamente para esta instancia. Con este fin, el valor <literal>
entre paréntesis angulares se agrega al bloque de funciones <function block name>
que actúa como tipo de datos.
Como alternativa, se puede agregar una expresión <expression>
. Colóquelo entre paréntesis para permitir el uso de símbolos como <
o >
en una expresión y para que ayude a conservar la exclusividad del código.
Ejemplo: Bloque de funciones genérico con variable de matriz parametrizable:
En el ejemplo de código siguiente se muestra cómo definir un bloque de funciones que puede procesar matrices de longitud arbitraria. El bloque de funciones tiene una matriz con una longitud genérica pero constante. En este contexto, el término constante significa que, aunque cada instancia del bloque de funciones varía en la longitud de su matriz, permanece constante durante la vida útil del objeto.
Esto puede resultar útil en la programación de bibliotecas, por ejemplo, para implementar una POU de biblioteca genérica.
FUNCTION_BLOCK FB_MyString
VAR_GENERIC CONSTANT
maxlen : UDINT := 1;
END_VAR
VAR
test : ARRAY[0..maxlen-1] OF BYTE;
END_VAR
;
PROGRAM PLC_PRG
VAR CONSTANT
cconst: DINT := 1000;
END_VAR
VAR
fbMyString1 : FB_MyString<100>;
fbMyString2 : FB_MyString<(2 * cconst)>;
arrMyString : ARRAY [0..5] OF FB_MyString<100>;
END_VAR
;
Herencia
Un bloque de funciones con constantes genéricas también puede utilizar las construcciones de herencia EXTENDS
y IMPLEMENTS
.
EXTENDS
y IMPLEMENTS
, ya que las constantes genéricas también se pueden utilizar con clases básicas.
Ejemplo de herencia:
INTERFACE IString
METHOD Append : BOOL
VAR_INPUT
strAppend : IString;
END_VAR
METHOD Assign : BOOL
VAR_INPUT
stringIn: String;
END_VAR
METHOD ToString : STRING
VAR_INPUT
END_VAR
PROPERTY Length : DINT
FUNCTION_BLOCK MyString
VAR_GENERIC CONSTANT
maxlen : UDINT;
END_VAR
IMPLEMENTS IString
FUNCTION_BLOCK LongString EXTENDS MyString<1000>
FUNCTION_BLOCK MySpecialString
VAR_GENERIC CONSTANT
maxlen2 : UDINT:= 1;
END_VAR
EXTENDS MyString<maxlen2>
METHOD ToLatin1: STRING
PROGRAM PLC_PRG
VAR CONSTANT
cconst: DINT := 1000;
END_VAR
VAR
string1 : MyString<100>;
string2 : MyString<(2 * cconst)>;
derived1 : LongString;
derived2 : MySpecialString<100>;
END_VAR
string1.Assign ('Welt');
string2.Assign ('Hallo ');
string2.Append(string1);
derived2.ToLatin1('Hello World');
Básicamente, al usar constantes IEC, se utilizará el tipo de datos más pequeño posible. Si tiene que utilizarse otro tipo de datos, se puede hacer con la ayuda de literales con tipo sin necesidad de declarar explícitamente las constantes. Para ello, la constante se proporcionará con un prefijo que indica el tipo.
Sintaxis
<tipo>#<literal>;
<tipo> |
Especifica el tipo de datos que se desea. Entradas posibles: BOOL, SINT, USINT, BYTE, INT, UINT, WORD, DINT, UDINT, DWORD, REAL, LREAL Escriba el tipo con letras mayúsculas. |
<literal> |
Especifica la constante. Introduzca datos que se ajusten al tipo de datos especificado en <tipo>. |
Ejemplo
iVar1:=DINT#34;
Si la constante no se puede convertir al tipo de destino sin sufrir una pérdida de datos, aparece un mensaje.
Puede utilizar los literales con tipo allí donde se pueda utilizar una constante normal.
Siempre que la configuración predeterminada delante del valor en la columna de la vista de supervisión o declaración. En este caso, no se puede acceder a ellas mediante forzado o escritura, por ejemplo.