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 per la dichiarazione come oggetto DUT:
TYPE <name>: <Inttype> (<ug>..<og>) END_TYPE;
|
un identificativo IEC valido |
|
uno dei tipi di dati SINT, USINT, INT, UINT, DINT, UDINT, BYTE, WORD, DWORD (LINT, ULINT, LWORD) |
|
una costante compatibile con il tipo di base, impostando il limite inferiore dei tipi di intervallo Anche il limite inferiore è incluso in questo intervallo. |
|
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. |
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.
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 .
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 | |
---|---|
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
.