CheckRangeSigned : DINT

CheckRangeSigned : DINT 1:

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!

Wenn eine Funktion CheckRangeSigned bzw. CheckRangeUnsigned wie oben gezeigt implementiert ist, kann bei der Verwendung des Unterbereichstypen in einer FOR-Schleife eine Endlosschleife entstehen. Dies geschieht genau dann, wenn der für die FOR-Schleife angegebenen Bereich genauso groß oder größer ist als der des Unterbereichstypen!

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 !