POU: CheckBounds
La tarea de esta función de supervisión es gestionar adecuadamente las infracciones limitadas. Algunos ejemplos de reacciones a las infracciones son la configuración de indicadores de error y el cambio del valor del índice de la matriz. La comprobación se realiza solo para un índice de matriz variable. Un índice de matriz constante incorrecto provoca un error en el compilador. La función se invoca implícitamente tan pronto como los valores se asignan al MATRIZ variables.
Para obtener más información, consulte lo siguiente: Use bloques de construcción para controles implícitos y Use bloques de construcción para controles implícitos
Después de insertar la función, recibe un código generado automáticamente en las partes de declaración e implementación. Vea abajo.
Atención
Para obtener la función de supervisión de funciones, no edite la parte de la declaración. Sin embargo, se le permite agregar variables locales.
Parte de la declaración:
Código generado automáticamente: ¡No edite!
FUNCTION CheckBounds : DINT
VAR_INPUT
index, lower, upper: DINT;
END_VARImplementación:
Código generado automáticamente: se trata de una implementación sugerida.
IF index < lower THEN
CheckBounds := lower;
ELSIF index > upper THEN
CheckBounds := upper;
ELSE
CheckBounds := index;
END_IFDeclaración:
También puede establecer un punto de interrupción, registrar mensajes o detener una excepción, por ejemplo. Agregar CmpApp.Library, SysExcept.Library, y SysTypes2_Itf.
(* It is also possible to set a breakpoint, log messages or e.g. to halt on an exception:
Add CmpApp.library, SysExcept.library and SysTypes2_Itf as newest.*)
VAR
_pApp : POINTER TO CmpApp.APPLICATION;
_result : SysTypes.RTS_IEC_RESULT;
END_VARImplementación:
_pApp := AppGetCurrent(pResult:=_result);
IF index < lower THEN
CheckBounds := lower;
IF _pApp <> 0 THEN
AppGenerateException(pApp:=_pApp, ulException:=RtsExceptions.RTSEXCPT_ARRAYBOUNDS);
END_IF
ELSIF index > upper THEN
CheckBounds := upper;
IF _pApp <> 0 THEN
AppGenerateException(pApp:=_pApp, ulException:=RtsExceptions.RTSEXCPT_ARRAYBOUNDS);
END_IF
ELSE
CheckBounds := index;
END_IF
Cuando el Verificar límites se llama a la función, recibe los siguientes parámetros de entrada:
index: índice del elemento de la matrizlower: límite inferior del rango de la matrizupper: límite superior del rango de la matriz
El valor devuelto es el índice del elemento de la matriz, siempre que esté dentro de un rango válido. Si no, entonces el CODESYS devuelve el límite superior o inferior, según el umbral que se violó.
Ejemplo: acceso a la matriz fuera de los límites de la matriz
En el programa de muestra a continuación, el índice no alcanza el límite inferior definido del a formación.
PROGRAM PLC_PRG
VAR
a: ARRAY[0..7] OF BOOL;
b : INT := 10;
END_VAR
Implementación
a[b]:=TRUE;
En este ejemplo, el CheckBounds Causas de la función a para cambiar el límite superior del índice de rango de matriz a 10. El valor TRUE se asigna entonces al elemento a[7]. De esta forma, la función corrige el acceso a la matriz fuera del rango de matriz válido.
Ejemplo: violación de los límites de la matriz
Agregue las siguientes bibliotecas en el Administrador de bibliotecas de la aplicación:
CmpApp.libraryySysExcept.librarycomo bibliotecas de marcadores de posiciónSysTypes2_Itfs.librarycon Versión más reciente siempre
Agrega un Verificar límites objeto debajo de la aplicación y modifique el código especificado como se muestra a continuación.
Parte de la declaración:
FUNCTION CheckBounds : DINT
VAR_INPUT
index, lower, upper: DINT;
END_VAR
VAR
_pApp : POINTER TO CmpApp.APPLICATION;
_Result : ISystypes2.RTS_IEC_RESULT;
END_VARParte de implementación:
// Automatically generated code: This is an implementation suggestion.
_pApp := AppGetCurrent(pResult := _Result);
IF index < lower THEN
CheckBounds := lower;
IF _pApp <> 0 THEN
AppGenerateException(pApp := _pApp, ulException := RtsExceptions.RTSEXCPT_ARRAYBOUNDS);
END_IF
ELSIF index > upper THEN
CheckBounds := upper;
IF _pApp <> 0 THEN
AppGenerateException(pApp:=_pApp, ulException:=RtsExceptions.RTSEXCPT_ARRAYBOUNDS);
END_IF
ELSE
CheckBounds := index;
END_IFPrograma un PRINCIPAL_PRG objeto debajo de la aplicación con los contenidos que se muestran a continuación.
PROGRAM MAIN_PRG
VAR
xInit : BOOL;
arData : ARRAY[0..7] OF BYTE;
i : INT;
dwAdr : DWORD;
END_VAR
IF NOT xInit THEN
// Required for CheckBounds
xInit := TRUE;
END_IF
// Set i to a value > 7 or < 0
// Generates an exception in CheckBounds, user-defined
arData[i] := 11;Al cargar e iniciar esta aplicación, se producirá una excepción cuando se infrinjan los límites de la matriz. El procesamiento se detiene CheckBounds para poder detectar el tipo de error.