Tipos de datos estándar

Descripción general

EcoStruxure Machine Expert admite todos los tipos de datos descritos en la norma IEC61131-3.

Los siguientes tipos de datos se describen en este capítulo:

Asimismo, se admiten ciertos tipos de datos de extensión de la norma y el usuario puede definir sus propios tipos de datos definidos por el usuario.

BOOL

Las variables de tipo BOOL pueden tener los valores TRUE (1) y FALSE (0). Se reservan 8 bits de espacio de memoria.

Para obtener más información, consulte el capítulo Constantes BOOL.

NOTA: Puede usar las comprobaciones implícitas para validar la conversión de los tipos de variable (consulte el capítulo POU para comprobaciones implícitas).

Entero

En esta tabla se enumeran los tipos de datos enteros disponibles. Cada uno de estos tipos abarca un rango distinto de valores. Se aplican las limitaciones de rango siguientes.

Tipo de datos

Límite inferior

Límite superior

Espacio en memoria

BYTE

0

255

8 bits

WORD

0

65.535

16 bits

DWORD

0

4.294.967.295

32 bits

LWORD

0

264-1

64 bits

SINT

-128

127

8 bits

USINT

0

255

8 bits

INT

-32.768

32.767

16 bits

UINT

0

65.535

16 bits

DINT

-2.147.483.648

2.147.483.647

32 bits

UDINT

0

4.294.967.295

32 bits

LINT

–263

263-1

64 bits

ULINT

0

264-1

64 bits

NOTA: Las conversiones desde tipos más grandes hasta tipos más pequeños pueden provocar una pérdida de información.

Para obtener más información, consulte la descripción de constantes de números.

NOTA: Puede usar las comprobaciones implícitas para validar la conversión de los tipos de variable (consulte el capítulo POU para comprobaciones implícitas).

Tipos de datos enteros independientes del destino __UXINT, __XINT, __XWORD

Para crear código IEC adecuado para los diferentes sistemas de destino, utilice los tipos de datos enteros independientes del destino __UXINT, __XINT y __XWORD. El compilador convierte estos tipos de datos en los tipos de datos estándar adecuados compatibles con el sistema de destino. Se admiten sistemas con registros de direcciones de 32 bits y 64 bits de ancho.

Se incluyen los siguientes operadores de conversión de tipo:

Tipos de datos independientes del destino

En plataformas de 64 bits

En plataformas de 32 bits

__UXINT

ULINT

UDINT

__XINT

LINT

DINT

__XWORD

LWORD

DWORD

REAL / LREAL

Los tipos de datos REAL y LREAL son tipos de coma flotante. Representan números racionales.

Características de los tipos de datos REAL y LREAL:

Tipo de datos

Límite inferior

Límite superior

Espacio en memoria

REAL

-3.402823e+38

3.402823e+38

32 bits

LREAL

-1.7976931348623158e+308

1.7976931348623158e+308

64 bits

Ejemplo:

PROGRAM PLC_PRG
VAR
    rMax: REAL := 3.402823E+38; // Largest number
    rPosMin : REAL := 1.0E-44; // Smallest positive number
    rNegMax: REAL := -1.0E-44; // Largest negative number
    rMin: REAL := -3.402823E+38; // Smallest number
    lrMax: LREAL := 1.7976931348623158E+308; // Largest number
    lrPosMin : LREAL := 4.94065645841247E-324; // Smallest positve number
    lNegMax: LREAL := -4.94065645841247E-324; // Largest negative number
    lrMin: LREAL := -1.7976931348623158E+308; // Smallest number
END_VAR
NOTA: La compatibilidad del tipo de datos LREAL depende del dispositivo de destino. Consulte la documentación correspondiente para ver si el tipo de 64 bits LREAL se convierte a REAL durante la compilación (posiblemente con una pérdida de información) o se mantiene.
NOTA: Si un REAL o LREAL se convierte a SINT, USINT, INT, UINT, DINT, UDINT, LINT o ULINT y el valor del número real está fuera del rango de valores de ese entero, el resultado no estará indefinido y dependerá del sistema de destino. En este caso, incluso una excepción sería posible. Para obtener un código de destino/independiente, gestione cualquier exceso del rango mediante la aplicación. Si el número REAL/LREAL está dentro del rango de valores de entero, la conversión funcionará del mismo modo en todos los sistemas.

Al asignar i1 := r1;, se detecta un error. Por consiguiente, la nota anterior se aplica cuando se utilizan operadores de conversión como el siguiente:

i1 := REAL_TO_INT(r1);

Para obtener más información, consulte Constantes REAL/LREAL (operandos).

NOTA: Puede usar las comprobaciones implícitas para validar la conversión de los tipos de variable (consulte el capítulo POU para comprobaciones implícitas).

STRING

Con EcoStruxure Machine Expert V2.2 y versiones posteriores, el tipo de datos STRING se puede codificar en formato Latin 1 o UTF-8. Para la interpretación de todo el proyecto en UTF-8, habilite el parámetro Codificación UTF8 para STRING en el cuadro de diálogo Configuración del proyecto > Opciones de compilación. Para obtener más información, consulte Codificación UTF-8 en todo el proyecto.

NOTA: Antes de establecer el formato de codificación en UTF-8, ejecute la regla de análisis estático SA0175 en el código para detectar construcciones que podrían provocar problemas con la codificación UTF-8.
NOTA: Si utiliza la codificación UTF-8, añada el pragma de {attribute 'monitoring_encoding' := 'UTF-8'} a la declaración de una variable. Permite supervisar el contenido de la variable en la codificación UTF-8.

Una variable de tipo de datos STRING puede contener cualquier cadena de caracteres. La entrada del tamaño en la declaración determina el espacio en memoria que se reserva para la variable. Hace referencia al número de bytes de la cadena y se puede poner entre paréntesis o corchetes. Si no se especifica nada con respecto al tamaño, se usará el tamaño predeterminado de 80 bytes. Si se inicializa una variable con una cadena demasiado larga para el tipo de datos de la variable, la cadena se acortará como corresponda de derecha a izquierda.

Longitud de cadena:

  • Para la codificación Latin 1, el espacio en memoria necesario para una variable de tipo STRING es de 1 byte por carácter más 1 byte adicional. Es decir, la declaración "STRING[80]" requiere 81 bytes.

  • Con la codificación UTF-8, un carácter puede tener una longitud de hasta cuatro bytes. La longitud de la cadena indica el número de bytes reservados para el STRING. Por tanto, ya no existe una relación 1:1 entre el número de caracteres y la longitud de la cadena en bytes.

Ejemplo de una declaración de cadena con 35 bytes:

str:STRING(35):='This is a String';

En general, la longitud de una cadena no está limitada. Cuando se ejecutan manipulaciones de cadenas con las funciones de la biblioteca Standard, se permiten cadenas de hasta una longitud de 255. Cuando se ejecutan manipulaciones de cadenas con las funciones de la biblioteca StringUtils, también se permiten cadenas más largas (>255 caracteres).

Cuando se reinicializa una variable del tipo de datos STRING al restablecer la aplicación, no se sobrescribe el contenido de la cadena antigua que existe después del carácter nulo de terminación del valor inicial. Esto se aplica tanto a la inicialización con el valor de inicialización como a la inicialización con el valor de inicialización predeterminado de 0.

Para obtener más información, consulte WSTRING y las constantes de STRING (operandos).

NOTA: Puede usar las comprobaciones implícitas para validar la conversión de los tipos de variable (consulte el capítulo POU para comprobaciones implícitas).

WSTRING

El tipo de datos WSTRING se diferencia del tipo STRING (ASCII) en la interpretación del formato Unicode y la necesidad de dos bytes para cada carácter y dos bytes de espacio adicional en memoria (frente a uno en ambos casos con STRING).

Los tipos de datos WSTRING se codifican como Unicode en formato UTF-16.

La biblioteca standard64.lib incluye funciones para cadenas WSTRING.

El número de caracteres de WSTRING dependerá de los caracteres incluidos. Un tamaño de WSTRING de 10 significa que la longitud de WSTRING puede admitir como máximo 10 WORDS. Para determinados caracteres en Unicode, se necesitan varias WORDS para codificar un carácter, por lo que el número de caracteres no tiene que corresponderse con la longitud de la WSTRING (10 en este caso). El tipo de datos requiere una WORD de memoria adicional, ya que termina con un 0.

Si no se define un tamaño, se asignarán 80 WORDS más una para el carácter de terminación 0.

Ejemplos:

wstr:WSTRING:="This is a WString";
wstr10 : WSTRING(10) := "1234567890";

Para obtener más información, consulte las siguientes descripciones:

Tipos de datos de fecha y hora

Los tipos de datos TIME, TIME_OF_DAY (abreviado TOD), DATE y DATE_AND_TIME (abreviado DT) se gestionan internamente como DWORD. Los tipos de datos LDATE, LDATE_AND_TIME (LDT) y LTIME_OF_DAY (LTOD) se gestionan internamente como LWORD. El tiempo se indica en milisegundos en TIME y TOD. El tiempo en TOD comienza a las 0:00. El tiempo se indica en segundos en DATE y DT desde el 1 de enero de 1970 a las 0:00.

LTIME se admite como base de tiempo para temporizadores de alta resolución. LTIME tiene un tamaño de 64 bits y una resolución de nanosegundos.

Sintaxis de LTIME:

LTIME#<declaración de tiempo>

La declaración de tiempo puede incluir las unidades de tiempo tal y como se utilizan con la constante TIME y en:

  • us: microsegundos

  • ns: nanosegundos

Ejemplo de LTIME:

LTIME1 := LTIME#1000d15h23m12s34ms2us44ns

Para obtener más información, consulte las siguientes descripciones:

NOTA: Puede usar las comprobaciones implícitas para validar la conversión de los tipos de variable (consulte el capítulo POU para comprobaciones implícitas).

ANY / ANY_<type>

Cuando implemente una función y una de las entradas de la función (VAR_INPUT) tenga un tipo de datos IEC genérico (ANY o ANY_<type>), el tipo de datos del parámetro de llamada no se definirá como exclusivo. Es posible transmitir las variables de diferentes tipos de datos a esta función. El valor transmitido y su tipo pueden solicitarse en la función a través de una estructura predefinida.

Tipos de datos IEC genéricos que permiten el uso de tipos de datos elementales para las entradas de funciones:

Jerarquía de tipos de datos genéricos

Tipos de datos elementales

ANY

ANY_BIT

BYTE, WORD, DWORD, LWORD

ANY_DATE

DATE_AND_TIME, DATE, TIME_OF_DAY, LDATE_AND_TIME, LDATE, LTIME_OF_DAY,

ANY_NUM

ANY_REAL

REAL, LREAL

ANY_INT

USINT, UINT, UDINT, ULINT

SINT, INT, DINT, LINT

ANY_STRING

STRING, WSTRING

Ejemplo:

FUNCTION ANYBIT_TO_BCD : DWORD
   VAR_INPUT
      value : ANY_BIT;
   END_VAR

Si se llama la función ANYBIT_TO_BCD, podrá transmitirse a la función una variable de tipo de datos BYTE, WORD, DWORD o LWORD en forma de parámetro.

Estructura predefinida:

Al compilar el código, se sustituirá internamente un tipo de datos ANY por la siguiente estructura:

TYPE AnyType :
STRUCT
        // the type of the actual parameter
    typeclass : __SYSTEM.TYPE_CLASS ;
        // the pointer to the actual parameter
    pvalue : POINTER TO BYTE;
        // the size of the data, to which the pointer points
    diSize : DINT;
END_STRUCT
END_TYPE

El parámetro de llamada en cuestión asigna los elementos de la estructura en el tiempo de ejecución.

Ejemplo:

En este ejemplo de código se compara si las dos variables transmitidas tienen el mismo tipo y el mismo valor.

FUNCTION Generic_Compare : BOOL
VAR_INPUT
    any1 : ANY;
    any2 : ANY;
END_VAR
VAR
    icount: DINT;
END_VAR

Generic_Compare := FALSE;
IF any1.typeclass <> any2.typeclass THEN
    RETURN;
END_IF
IF any1.diSize <> any2.diSize THEN
    RETURN;
END_IF
// Byte comparison
FOR icount := 0 TO any1.diSize-1 DO
    IF any1.pvalue[iCount] <> any2.pvalue[iCount] THEN
        RETURN;
    END_IF
END_FOR
Generic_Compare := TRUE;
RETURN;
// END_FUNCTION

Consulte también la descripción del operador __VARINFO.