Un tipo de subárea es un tipo definido por el usuario cuyo rango de valores es solo un subconjunto del tipo de rangos básico. También puede utilizar comprobaciones de límites implícitas.
Puede realizar la declaración en un objeto DUT pero también puede declarar la variable directamente con un tipo de subárea.
Sintaxis para la declaración como un objeto DUT:
TYPE <name>: <Inttype> (<ug>..<og>) END_TYPE;
<name> |
un identificador IEC válido |
<inttype> |
uno de los tipos de datos SINT, USINT, INT, UINT, DINT, UDINT, BYTE, WORD, DWORD (LINT, ULINT, LWORD) |
<ug> |
una constante compatible con el tipo básico, estableciendo el límite inferior de los tipos de rango El propio límite inferior está incluido en este rango. |
<og> |
una constante compatible con el tipo básico, estableciendo el límite superior de los tipos de rango El propio límite inferior está incluido en este tipo básico. |
TYPE
SubInt : INT (-4095..4095);
END_TYPE
Declaración directa de una variable con un tipo de subárea
VAR
i : INT (-4095..4095);
ui : UINT (0..10000);
END_VAR
Si se asigna un valor a un tipo de subrango (en la declaración o en la implementación) pero no se corresponde con este rango (por ejemplo, i:=5000 en el ejemplo de declaración anterior), se mostrará un mensaje.
Funciones de verificación para límites de rango
Para observar los límites de rango de los tipos de subrango durante el tiempo de ejecución, deberán añadirse a la aplicación las funciones CheckRangeSigned, CheckLRangeSigned o CheckRangeUnsigned, CheckLRangeUnsigned. Para obtener información sobre cómo insertar la función, consulte la descripción de la función POUs para comprobaciones implícitas.
El propósito de esta función de verificación es el tratamiento correcto de las infracciones de la subárea (por ejemplo, estableciendo un indicador de error o modificando el valor). Se llama implícitamente a la función en cuanto se asigna una variable de tipo de subárea.
|
FUNCIONAMIENTO IMPREVISTO DEL EQUIPO |
No modifique la parte de declaraciones de una función de verificación implícita. |
El incumplimiento de estas instrucciones puede causar la muerte, lesiones serias o daño al equipo. |
La asignación de una variable perteneciente a un tipo de subrango con signo implica una llamada implícita a CheckRangeSigned. La implementación por defecto de esa función reduciendo un valor al rango permitido es la siguiente:
Parte de la declaración:
// Implicitly generated code : DO NOT EDIT
FUNCTION CheckRangeSigned : DINT
VAR_INPUT
value, lower, upper: DINT;
END_VAR
Parte de implementación:
// Implicitly generated code : Only an Implementation suggestion
IF (value < lower) THEN
CheckRangeSigned := lower;
ELSIF(value > upper) THEN
CheckRangeSigned := upper;
ELSE
CheckRangeSigned := value;
END_IF
Una vez llamada, la función obtiene los siguientes parámetros de entrada:
ovalue: el valor que se va a asignar al tipo de rango
olower: el límite inferior del rango
oupper: el límite superior del rango
Mientras el valor asignado permanezca dentro del rango válido, se utilizará como valor de retorno de la función. De lo contrario, como consecuencia de la infracción de rango, se devolverá el límite superior o inferior del rango de campo.
La asignación i:=10*y ahora se sustituirá implícitamente por
i := CheckRangeSigned(10*y, -4095, 4095);
Si y, por ejemplo, tiene el valor 1000, la variable i no se asignará a 10 * 1000 = 10 000 (como en la implementación original), sino al límite superior del rango, que es 4095.
Lo mismo se aplica a la función CheckRangeUnsigned.
NOTA: Si ninguna de las funciones está presente, no tendrá lugar ninguna verificación de tipo de subrango durante el tiempo de ejecución. En ese caso, puede asignar cualquier valor de DINT/UDINT a una variable de tipo de subrango DINT/UDINT. Puede asignar cualquier valor de LINT/ULINT a una variable de tipo de subrango LINT/ULINT.