Skip to main content

POU: CheckBounds

Il compito di questa funzione di monitoraggio è gestire le violazioni limitate in modo appropriato. Esempi di reazioni alle violazioni includono l'impostazione di contrassegni di errore e la modifica del valore dell'indice dell'array. Il controllo viene eseguito solo per un indice di matrice variabile. Un indice di matrice costante errato causa un errore del compilatore. La funzione viene richiamata implicitamente non appena i valori vengono assegnati ARRAY variabili.

Per ulteriori informazioni, vedere quanto segue: Utilizzare i blocchi predefiniti per i controlli impliciti e Utilizzare i blocchi predefiniti per i controlli impliciti

Dopo aver inserito la funzione, si riceve il codice generato automaticamente nelle parti di dichiarazione e implementazione. Vedi sotto.

Attenzione

Per ottenere la funzionalità per le funzioni di monitoraggio, non modificare la parte della dichiarazione. Tuttavia, è consentito aggiungere variabili locali.

Parte della dichiarazione:

Codice generato automaticamente: Non modificare!

FUNCTION CheckBounds : DINT
VAR_INPUT
      index, lower, upper: DINT;
END_VAR

Implementazione:

Codice generato automaticamente: questa è un'implementazione suggerita.

IF  index < lower THEN
      CheckBounds := lower;
ELSIF  index > upper THEN
      CheckBounds := upper;
ELSE
      CheckBounds := index;
END_IF

Dichiarazione:

puoi anche impostare un punto di interruzione, registrare i messaggi o interrompere un'eccezione. Aggiungi CmpApp.Library, SysExcept.Librarye 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_VAR

Implementazione:

_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

Quando il CheckBounds viene chiamata la funzione, riceve i seguenti parametri di input:

  • index: Indice dell'elemento dell'array

  • lower: Limite inferiore dell'intervallo dell'array

  • upper: limite superiore dell'intervallo dell'array

Il valore restituito è l'indice dell'elemento dell'array, purché si trovi all'interno di un intervallo valido. In caso contrario, allora il CODESYS restituisce il limite superiore o inferiore, a seconda della soglia violata.

Esempio: accesso all'array al di fuori dei limiti dell'array

Esempio 541. Correzione dell'accesso a un array al di fuori dei limiti dell'array definiti

Nel programma di esempio riportato di seguito, l'indice è inferiore al limite inferiore definito di a Vettore.

PROGRAM PLC_PRG
VAR
    a: ARRAY[0..7] OF BOOL;
    b : INT := 10;
END_VAR

Attuazione

a[b]:=TRUE;

In questo esempio, il CheckBounds cause della funzione a per modificare il limite superiore dell'indice dell'intervallo di array in 10. Il valore TRUE viene quindi assegnato all'elemento a[7]. In questo modo, la funzione corregge l'accesso all'array al di fuori dell'intervallo di array valido.



Esempio: violazione dei limiti dell'array

Esempio 542. Output di un'eccezione quando i limiti dell'array vengono violati.

Aggiungi le seguenti librerie nel Gestore librerie dell'applicazione:

  • CmpApp.library e SysExcept.library come librerie segnaposto

  • SysTypes2_Itfs.library insieme a Sempre la versione più recente

Aggiungere un CheckBounds oggetto sotto l'applicazione e modificare il codice specificato come mostrato di seguito.

Parte della dichiarazione:

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 di implementazione:

// 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_IF

Programma a MAIN_PRG oggetto sotto l'applicazione con i contenuti mostrati di seguito.

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;

Quando carichi e avvii questa applicazione, verrà generata un'eccezione quando i limiti dell'array vengono violati. L'elaborazione si interrompe CheckBounds in modo da poter rilevare il tipo di errore.