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_VARImplementazione
// 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'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.
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.
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.
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_VARParte 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_IFProgramma 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.