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'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.library
eSysExcept.library
come librerie segnapostoSysTypes2_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.