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_VARImplementazione:
Codice generato automaticamente: questa è un'implementazione suggerita.
IF index < lower THEN
CheckBounds := lower;
ELSIF index > upper THEN
CheckBounds := upper;
ELSE
CheckBounds := index;
END_IFDichiarazione:
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_VARImplementazione:
_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'arraylower: Limite inferiore dell'intervallo dell'arrayupper: 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
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
Aggiungi le seguenti librerie nel Gestore librerie dell'applicazione:
CmpApp.libraryeSysExcept.librarycome librerie segnapostoSysTypes2_Itfs.libraryinsieme 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_VARParte 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_IFProgramma 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.