Skip to main content

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 matriz

  • lower: límite inferior del rango de la matriz

  • upper: 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 527. Ejemplo: Corrección del acceso a una matriz fuera de los límites definidos 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

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 528. Ejemplo: salida de una excepción cuando se violan los límites de la matriz.

Agregue las siguientes bibliotecas en el Administrador de bibliotecas de la aplicación:

  • CmpApp.library y SysExcept.library como bibliotecas de marcadores de posición

  • SysTypes2_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.