Ein Unterbereichstyp ist ein benutzerdefinierter Datentyp, dessen Wertebereich nur eine Untermenge eines Basisdatentyps umfasst. Beachten Sie die Möglichkeit einer impliziten Bereichsüberwachung.
Die Deklaration kann in einem DUT-Objekt (Data Type Unit) erfolgen, eine Variable kann aber auch direkt mit einem Unterbereichstypen deklariert werden.
Syntax für die Deklaration als DUT-Objekt:
TYPE <name>: <Inttype> (<ug>..<og>) END_TYPE;
|
eine gültige IEC-Kennung |
|
einer der Datentypen SINT, USINT, INT, UINT, DINT, UDINT, BYTE, WORD, DWORD (LINT, ULINT, LWORD) |
|
Konstante, die mit dem Basisdatentyp kompatibel sein muss und die Untergrenze des Bereichstypen festlegt. Die Untergrenze selbst gehört zu diesem Bereich. |
|
Konstante, die mit dem Basisdatentyp kompatibel sein muss und die die Obergrenze des Bereichstypen festlegt. Die Obergrenze selbst gehört zu diesem Basistypen. |
VAR
i : INT (-4095..4095);
ui : UINT (0..10000);
END_VAR
Wird einem Unterbereichstypen ein Wert zugewiesen (in der Deklaration oder in der Implementierung), der nicht in diesen Bereich fällt (z. B. i:=5000
im oben gezeigten Deklarationsbeispiel), wird eine Fehlermeldung ausgegeben.
Um die Bereichsüberwachung von Unterbereichstypen während der Laufzeit durchzuführen, müssen der Anwendung die Funktionen CheckRangeSigned
, CheckLRangeSigned
oder CheckRangeUnsigned
, CheckLRangeUnsigned
hinzugefügt werden. Für Informationen zum Einfügen der Funktion, siehe die Beschreibung der Funktion .
Aufgabe dieser Prüffunktionen ist eine angemessene Behandlung von Verletzungen der Bereichsgrenzen (z. B. durch Setzen eines Fehler-Flags oder durch Verändern eines Wertes). Der Aufruf der Funktion erfolgt implizit, sobald eine Variable vom Unterbereichstyp zugewiesen wird.
WARNUNG | |
---|---|
Wird einer Variablen eines vorzeichenbehafteten Unterbereichstyps ein Wert zugewiesen, so bedingt dies einen automatischen Aufruf der Funktion CheckRangeSigned
. Die Funktion, welche einen Zuweisungswert auf den zulässigen Bereich abstimmt, ist standardmäßig wie folgt implementiert.
Deklarationsteil:
// Implicitly generated code : DO NOT EDIT
FUNCTION CheckRangeSigned : DINT
VAR_INPUT
value, lower, upper: DINT;
END_VAR
Implementierungsteil:
// Implicitly generated code : Only an Implementation suggestion
IF (value < lower) THEN
CheckRangeSigned := lower;
ELSIF(value > upper) THEN
CheckRangeSigned := upper;
ELSE
CheckRangeSigned := value;
END_IF
Beim Aufruf erhält die Funktion folgende Eingangsparameter:
value
: Der Wert, der dem Bereichstyp zugewiesen werden soll
lower
: Bereichsuntergrenze
upper
: Bereichsobergrenze
Wenn der zugewiesene Wert innerhalb des gültigen Bereichs liegt, wird er als Rückgabewert der Funktion verwendet. Ansonsten wird je nach Verletzung des Grenzbereichs die Ober- oder Untergrenze des Feldbereichs zurückgegeben.
Die Zuweisung i:=10*y
wird nun implizit ersetzt durch
i := CheckRangeSigned(10*y, -4095, 4095);
Hat y
beispielsweise den Wert 1000
, so wird der Variablen i
nicht wie im ursprünglichem Code vorgesehen der Wert 10*1000=10000 zugewiesen, sondern der Wert der Bereichsobergrenze, also 4095.
Dasselbe gilt für die Funktion CheckRangeUnsigned
.