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_VAR
Implementació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.library
ySysExcept.library
como bibliotecas de marcadores de posiciónSysTypes2_Itfs.library
con 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_VAR
Parte 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_IF
Programa 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.