POU: CheckBounds
La tarea de esta función de monitoreo es manejar apropiadamente las violaciones de límites. Los ejemplos de reacciones a las violaciones incluyen la configuración de indicadores de error y el cambio del valor del índice de matriz. La verificación se realiza solo para un índice de matriz variable. Un índice de matriz constante incorrecto provoca un error de compilación. CODESYS llama a la función implícitamente cuando se asignan valores a un FORMACIÓN variable.
Para más información, ver: Use bloques de construcción para controles implícitos, 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
// Automatisch erzeugter Code : NICHT EDITIEREN
FUNCTION CheckBounds : DINT
VAR_INPUT
index, lower, upper: DINT;
END_VARImplementación
// Automatisch erzeugter Code: Es handelt sich hierbei um einen Implementierungsvorschlag.
IF index < lower THEN
CheckBounds := lower;
ELSIF index > upper THEN
CheckBounds := upper;
ELSE
CheckBounds := index;
END_IF
(* 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.
Declaration:
VAR
_pApp : POINTER TO CmpApp.APPLICATION;
_result : SysTypes.RTS_IEC_RESULT;
END_VAR
Implementation:
_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ó.
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
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.
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
// Automatisch erzeugter Code: Es handelt sich hierbei um einen Implementierungsvorschlag.
_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
// Erforderlich für CheckBounds
xInit := TRUE;
END_IF
// Setze i auf einen Wert > 7 oder < 0
// Generiert eine Exception in CheckBounds, Benutzerdefiniert
arData[i] := 11;Cuando cargue e inicie esta aplicación, se lanzará una "excepción" cuando se violen los límites de la matriz. El procesamiento se detiene en Verificar límites para que se pueda detectar el tipo de error.