Tipi sottocampo

Panoramica

Un tipo sottocampo è un tipo definito dell'utente il cui campo di valori è solo un set subordinato a quello del tipo di dati di base. È possibile anche utilizzare i controlli del limiti di intervallo impliciti.

È possibile eseguire la dichiarazione in un oggetto DUT, ma anche dichiarare una variabile direttamente in un tipo di sottocampo.

Sintassi

Sintassi per la dichiarazione come oggetto DUT:

TYPE <name>: <Inttype> (<ug>..<og>) END_TYPE;

<name>

un identificativo IEC valido

<inttype>

uno dei tipi di dati SINT, USINT, INT, UINT, DINT, UDINT, BYTE, WORD, DWORD (LINT, ULINT, LWORD)

<ug>

una costante compatibile con il tipo di base, impostando il limite inferiore dei tipi di intervallo

Anche il limite inferiore è incluso in questo intervallo.

<og>

una costante compatibile con il tipo di base, che imposta il limite superiore dei tipi di intervallo.

Anche il limite superiore è incluso in questo tipo di base.

Esempio

TYPE
 SubInt : INT (-4095..4095);
END_TYPE

Dichiarazione diretta di una variabile con un tipo di sottocampo

VAR
 i : INT (-4095..4095);
 ui : UINT (0..10000);
END_VAR

Se un valore è assegnato a un tipo di sottocampo (nella dichiarazione o nell'implementazione) ma non corrisponde a questo intervallo (ad esempio, i:=5000 nell'esempio di dichiarazione mostrato sopra), viene emesso un messaggio.

Funzioni di controllo dei limiti dell'intervallo

Per osservare i limiti di intervallo dei tipi di sottocampo durante il runtime, le funzioni CheckRangeSigned, CheckLRangeSigned o CheckRangeUnsigned, CheckLRangeUnsigned devono essere aggiunte all'applicazione. Per informazioni sull'inserimento della funzione, consultare la descrizione della funzione POU per controlli impliciti.

Lo scopo di questa funzione di controllo è la gestione corretta delle violazioni del sottocampo (ad esempio, impostando un flag di errore o modificando il valore). La funzione verrà chiamata implicitamente non appena verrà assegnata una variabile del tipo del sottocampo.

 AVVERTIMENTO
FUNZIONAMENTO ANOMALO DELL'APPARECCHIATURA
Non modificare la parte dichiarazione di una funzione di controllo implicito.
Il mancato rispetto di queste istruzioni può provocare morte, gravi infortuni o danni alle apparecchiature.

Esempio

L'assegnazione di una variabile che fa parte di un tipo sottocampo con segno comporta una chiamata implicita a CheckRangeSigned. L'implementazione predefinita di tale funzione che riduce un valore al campo di valori ammessi è la seguente:

Parte dichiarazione:

// Implicitly generated code : DO NOT EDIT
FUNCTION CheckRangeSigned : DINT
VAR_INPUT
value, lower, upper: DINT;
END_VAR

Parte implementazione:

// Implicitly generated code : Only an Implementation suggestion
IF (value < lower) THEN
CheckRangeSigned := lower;
ELSIF(value > upper) THEN
CheckRangeSigned := upper;
ELSE
CheckRangeSigned := value;
END_IF

Quando viene richiamata, la funzione assume i seguenti parametri di ingresso:

  • value: il valore da assegnare al tipo di intervallo

  • lower: il limite inferiore dell'intervallo

  • upper: il limite superiore dell'intervallo

Se il valore assegnato si trova nell'intervallo di valori validi, verrà utilizzato come valore restituito della funzione. Altrimenti, in corrispondenza della violazione dell'intervallo verrà restituito il valore superiore o il valore inferiore.

L'assegnazione i:=10*y verrà a questo punto sostituita implicitamente da

i := CheckRangeSigned(10*y, -4095, 4095);

Se y, ad esempio, ha il valore 1000, la variabile i non verrà assegnata a 10*1000=10000 (come nell'implementazione originale), ma al limite superiore dell'intervallo, ovvero 4095.

Lo stesso vale per la funzione CheckRangeUnsigned.

NOTA: Se nessuna delle funzioni è presente, durante il runtime non può avvenire il controllo del tipo di sottocampo. In questo caso, è possibile assegnare qualsiasi valore DINT/UDINT a una variabile di tipo sottocampo DINT/UDINT. È possibile assegnare qualsiasi valore LINT/ULINT a una variabile di tipo sottocampo LINT/ULINT.