CheckRangeSigned : DINT
Um die Einhaltung der Bereichsgrenzen der Unterbereichstypen zur Laufzeit überprüfen zu können, kann die Funktion CheckRangeSigned eingefügt werden. In der Funktion können Bereichsverletzungen in geeigneter Art und Weise abgefangen werden (z.B. kann der Wert abgeschnitten werden oder ein Fehlerflag gesetzt werden). Die Funktion wird implizit aufgerufen, sobald auf eine Variable geschrieben wird, die von einem Unterbereichstyp ist, der aus einem vorzeichenbehafteten Typ gebildet wurde. Um eine Überprüfung vorzeichenloser Unterbereichstypen durchführen zu können muss die Funktion CheckRangeUnsigned benutzt werden.
VAR_INPUT
value, lower, upper: DINT;
END_VAR
Beispiel:
Im Falle einer Variable eines vorzeichenbehafteten Unterbereichstyps (also wie i von oben) wird die Funktion CheckRangeSigned aufgerufen, die folgendermaßen programmiert sein könnte, um einen Wert auf den erlaubten Bereich zurückzuschneiden:
FUNCTION CheckRangeSigned : DINT
VAR_INPUT
value, lower, upper: DINT;
END_VAR
IF (value < lower) THEN
CheckRangeSigned := lower;
ELSIF(value > upper) THEN
CheckRangeSigned := upper;
ELSE
CheckRangeSigned := value;
END_IF
Zwingend für einen automatischen Aufruf ist der Funktionsname CheckRangeSigned und die Gestaltung der Schnittstelle: Rückgabewert und drei Parameter vom Typ DINT.
Die Funktion wird beim Aufruf folgendermaßen parametriert:
value | bekommt den Wert, der dem Bereichstypen zugewiesen werden soll |
---|---|
lower | die Untergrenze des Bereichs |
upper | die Obergrenze des Bereichs |
Rückgabewert | der Wert, der tatsächlich dem Bereichstypen zugewiesen wird |
Aus einer Zuweisung i := 10*y;
wird in diesem Beispiel implizit folgende erzeugt:i := CheckRangeSigned(10*y, -4095, 4095);
Wenn y beispielsweise den Wert 1000 hat, dann hat i nach dieser Zuweisung trotzdem nur den Wert 4095.
Hinweis | |
Wert der Variablen/Endlosschleife Sind die beiden Funktionen CheckRangeSigned und CheckRangeUnsigned nicht vorhanden, findet zur Laufzeit keine Typüberprüfung der Unterbereichstypen statt! Die Variable i könnte dann also beliebige Werte zwischen -32768 und 32767 annehmen! |
Beispiel:
VAR
ui : UINT (0..10000);
END_VAR
FOR ui:=0 TO 10000 DO
...
END_FOR
Die FOR-Schleife wird nicht verlassen, da ui nicht größer als 10000 werden kann.
Ebenso ist der Inhalt der CheckRange-Funktionen bei der Verwendung von Inkrementationswerten in der FOR-Schleife zu beachten !