Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
19
Добавлен:
11.10.2020
Размер:
3.68 Mб
Скачать

Die Datentypen 297

Definierte Datentypen

11.3.2Pointer

In Pointern speichert man die Adresse von Variablen oder Funktionsblöcken zur Laufzeit eines Programms.

Pointerdeklarationen haben folgende Syntax:

<Bezeichner>: POINTER TO <Datentyp/Funktionsblock>;

Ein Pointer kann auf jeden beliebigen Datentyp und Funktionsblock zeigen, auch selbstdefinierte.

Mit dem Adreßoperator ADR wird dem Pointer die Adresse einer Variablen oder Funktionsblocks zugewiesen.

Die Dereferenzierung eines Pointers erfolgt über den Inhaltsoperator "^" nach dem Pointerbezeichner.

Beispiel:

pt:POINTER TO INT;

var_int1:INT := 5;

var_int2:INT;

WAGO-I/O-SYSTEM 759 WAGO-I/O-PRO 32

298 Die Datentypen

Definierte Datentypen

pt := ADR(var_int1);

var_int2:= pt^; (* var_int2 ist nun 5 *)

11.3.3Aufzählungstyp

Ein Aufzählungstyp ist ein selbstdefinierter Datentyp, der aus einer Menge von Stringkonstanten besteht. Diese Konstanten bezeichnet man als Enumerationswerte.

Die Enumerationswerte sind im ganzen Projekt bekannt, auch wenn Sie lokal in einem Baustein deklariert wurden. Legen Sie ihre Aufzählungstypen am besten als Objekte im Object Organizer unter der Registerkarte Datentypen an. Sie beginnen mit dem Schlüsselwort TYPE und enden mit END_TYPE.

Syntax:

TYPE <Bezeichner>:(<Enum_0> ,<Enum_1>, ...,<Enum_n>);

END_TYPE

Eine Variable vom Typ <Bezeichner> kann einen der Enumerationswerte annehmen und wird mit dem ersten initialisiert. Die Werte sind zu ganzen Zahlen kompatibel, d.h. man kann damit Operationen wie mit INT durchführen. Der Variablen kann eine Zahl x zugewiesen werden. Sind die Enumerationswerte nicht initialisiert, beginnt die Zählung bei 0. Achten Sie beim Initialisieren darauf, daß die Initialwerte aufsteigend sind. Die Gültigkeit der Zahl wird zur Laufzeit überprüft.

Beispiel:

TYPE AMPEL: (Rot, Gelb, Gruen:=10); (*Rot hat den

Initalwert 0, Gelb 1, Gruen 10 *)

END_TYPE

AMPEL1 : AMPEL ;

AMPEL1:=0; (* Ampel hat den Wert Rot*)

FOR i:= Rot TO Gruen DO

i := i + 1;

END_FOR;

Der gleiche Enumerationswert darf sowohl innerhalb einer Enumeration wie auch bei der Verwendung verschiedener Enumerationen innerhalb desselben Bausteins nicht zweimal verwendet werden. Beispiel:

AMPEL: (rot, gelb, gruen);

FARBE: (blau, weiss, rot);

WAGO-I/O-SYSTEM 759 WAGO-I/O-PRO 32

Die Datentypen 299

Definierte Datentypen

Fehler: rot darf nicht für AMPEL und FARBE verwendet werden, wenn diese im gleichen Baustein benützt werden.

11.3.4Strukturen

Strukturen werden als Objekte im Object Organizer unter der Registerkarte Datentypen abgelegt. Sie beginnen mit den Schlüsselwörtern TYPE und STRUCT und enden mit END_STRUCT und END_TYPE.

Strukturdeklarationen haben folgende Syntax:

TYPE <Strukturname>:

STRUCT

<Variablendeklaration 1>

.

.

<Variablendeklaration n>

END_STRUCT

END_TYPE

<Strukturname> ist nun ein Typ, der im gesamten Projekt bekannt ist, und der wie ein Standard Datentyp benutzt werden kann.

Verschachtelte Strukturen sind erlaubt. Die einzige Einschränkung ist, daß Variablen nicht auf Adressen gesetzt werden können (AT-Deklaration ist nicht erlaubt!).

x Beispiel für eine Strukturdefinition Polygonzug

Beispiel für die Initialisierung einer Struktur vom Typ Polygonzug:

Poly_1: Polygonzug := ( Start:=3,3, Punkt1 =5,2, Punkt2:=7,3, Punkt3:=8,5, Punkt4:=5,7, Ende := 3,5);

Initialisierungen mit Variablen sind nicht möglich. Ein Beispiel für die

Initialisierung eines Arrays einer Struktur siehe unter 'Arrays'.

Auf Komponenten von Strukturen greift man mit folgender Syntax zu:

<Struktur_Name>.<Komponentenname>

Für das oben genannte Beispiel der Struktur Polygonzug erfolgt der Zugriff auf die Komponente Start dementsprechend über Poly_1.Start

WAGO-I/O-SYSTEM 759 WAGO-I/O-PRO 32

300 Die Datentypen

Definierte Datentypen

TYPE Polygonzug:

STRUCT

Start:ARRAY [1..2] OF INT;

Punkt1:ARRAY [1..2] OF INT;

Punkt2:ARRAY [1..2] OF INT;

Punkt3:ARRAY [1..2] OF INT;

Punkt4:ARRAY [1..2] OF INT;

Ende:ARRAY [1..2] OF INT;

END_STRUCT

END_TYPE

11.3.5Referenzen

Der selbstdefinierte Datentyp Referenz dient dazu, um einen alternativen Namen (alias) für einen Datentypen oder einen Funktionsblock zu erzeugen.

Legen Sie ihre Referenzen als Objekte im Object Organizer unter der Registerkarte Datentypen an. Sie beginnen mit dem Schlüsselwort TYPE und enden mit END_TYPE.

Syntax:

TYPE <Bezeichner>: <Zuweisungsausdruck>;

END_TYPE

Beispiel:

TYPE message:STRING[50];

END_TYPE;

11.3.6Unterbereichstypen

Ein Unterbereichstyp ist ein Typ, dessen Wertebereich nur eine Untermenge eines Basistypen umfaßt. Die Deklaration kann im Register Datentypen erfolgen, eine Variablen kann aber auch direkt mit einem Unterbereichstypen deklariert werden:

Syntax für die Deklaration im Register 'Datentypen':

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

<Name>

muß ein gültiger IEC-Bezeichner sein,

WAGO-I/O-SYSTEM 759

WAGO-I/O-PRO 32

 

Die Datentypen 301

 

Definierte Datentypen

 

 

<Inttype>

ist einer der Datentypen SINT, USINT, INT, UINT, DINT, UDINT, BYTE,

 

WORD, DWORD (LINT, ULINT, LWORD).

<ug>

ist eine Konstante, die kompatibel sein muß zum Basistypen, und die die

 

Untergrenze des Bereichstypen festlegt. Die Untergrenze selbst gehört zu

 

diesem Bereich.

<og>

ist eine Konstante, die kompatibel sein muß zum Basistypen, 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 (Beachten Sie die korrekte Angabe eines Initialwerts, wenn der Unterbereich nicht die '0' enthält):

VAR

i1 : INT (-4095..4095);

i2: INT (5..10):=5;

ui : UINT (0..10000);

END_VAR

Wird einem Unterbereichstypen eine Konstante zugewiesen (in der Deklaration oder in der Implementation), die nicht in diesen Bereich fällt (z.B. i:=5000), wird eine Fehlermeldung ausgegeben.

Um die Einhaltung der Bereichsgrenzen zur Laufzeit zu überprüfen, müssen die Funktionen CheckRangeSigned bzw. CheckRangeUnsigned eingefügt werden. In diesen können Bereichsverletzungen in geeigneter Art und Weise abgefangen werden (z.B kann der Wert abgeschnitten werden oder ein Fehlerflag gesetzt werden). Sie werden implizit aufgerufen, sobald auf eine Variable geschrieben wird, die von einem Unterbereichstyp ist, der aus einem vorzeichenbehafteten bzw. vorzeichenlosen Typ gebildet wurde.

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;

WAGO-I/O-SYSTEM 759 WAGO-I/O-PRO 32

302 Die Datentypen

Definierte Datentypen

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.

Entsprechend gilt für die Funktion CheckRangeUnsigned: Funktionsname und Schnittstelle müssen korrekt sein:

FUNCTION CheckRangeUnsigned : UDINT

VAR_INPUT

value, lower, upper: UDINT; END_VAR

Warnung:

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 durchaus beliebige Werte zwischen –32768 und 32767 annehmen!

WAGO-I/O-SYSTEM 759 WAGO-I/O-PRO 32

Die Datentypen 303

Definierte Datentypen

Warnung:

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 !

WAGO-I/O-SYSTEM 759 WAGO-I/O-PRO 32

Соседние файлы в папке 759-332