Unterbereichstypen

Überblick

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

Syntax für die Deklaration als DUT-Objekt:

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

<name>

eine gültige IEC-Kennung

<inttype>

einer der Datentypen SINT, USINT, INT, UINT, DINT, UDINT, BYTE, WORD, DWORD (LINT, ULINT, LWORD)

<ug>

Konstante, die mit dem Basisdatentyp kompatibel sein muss und die Untergrenze des Bereichstypen festlegt.

Die Untergrenze selbst gehört zu diesem Bereich.

<og>

Konstante, die mit dem Basisdatentyp kompatibel sein muss und die die Obergrenze des Bereichstypen festlegt.

Die Obergrenze selbst gehört zu diesem Basistypen.

Beispiel

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

Direkte Deklaration einer Variablen mit einem Unterbereichstypen

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.

Funktionen zur Bereichsüberwachung

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 POUs für implizite Checks.

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
UNBEABSICHTIGTER GERÄTEBETRIEB
Um die Funktionalität der Prüffunktion zu erhalten, darf der Deklarationsteil der Funktion nicht abgeändert werden.
Die Nichtbeachtung dieser Anweisungen kann Tod, schwere Verletzungen oder Sachschäden zur Folge haben.

Beispiel

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.

HINWEIS: Steht keine der Funktionen zur Verfügung, so erfolgt während der Laufzeit keine Überprüfung der Unterbereichstypen. In diesem Fall können Sie der Variablen des Unterbereichstyps DINT/UDINT einen beliebigen DINT/UDINT-Wert zuweisen. Einer Variablen eines Unterbereichstyps LINT/ULINT kann ein beliebiger LINT/ULINT-Wert zugewiesen werden.