Skip to main content

POU: CheckBounds

Il compito di questa funzione di monitoraggio è gestire in modo appropriato le violazioni associate. Esempi di reazioni alle violazioni includono l'impostazione di flag di errore e la modifica del valore dell'indice dell'array. Il controllo viene eseguito solo per un indice array variabile. Un indice di matrice costante errato provoca un errore del compilatore. CODESYS chiama la funzione in modo implicito quando i valori sono assegnati a an VETTORE variabile.

Per ulteriori informazioni, vedere: Utilizzare i blocchi predefiniti per i controlli impliciti, 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.

Dichiarazione parte

// Automatisch erzeugter Code : NICHT EDITIEREN
FUNCTION CheckBounds : DINT
VAR_INPUT
      index, lower, upper: DINT;
END_VAR

Implementazione

// 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
*)

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 527. Esempio: correzione dell'accesso a un array al di fuori dei limiti di 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

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 528. Esempio: output di un'eccezione quando vengono violati i limiti dell'array.

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.

Dichiarazione parte

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 attuativa

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

Programma A PRINCIPALE_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
        // 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;

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