| 

.NET C# Java Javascript Exception

0
Bisher lag der Schwerpunkt bei den objektorientierten Erweiterungen. Es gibt aber noch einige, meist nicht so tiefgreifende, Neuerungen innerhalb von CoDeSys V3. Im Folgenden sollen diese kurz angesprochen werden. Initialisieren von Arrays Soll ein Array beim Anlegen initialisiert werden, so muss die Liste mit den Initialisierungswerten in eckige Klammern gesetzt werden. Bisher mussten die eckigen [...]

Bisher lag der Schwerpunkt bei den objektorientierten Erweiterungen. Es gibt aber noch einige, meist nicht so tiefgreifende, Neuerungen innerhalb von CoDeSys V3. Im Folgenden sollen diese kurz angesprochen werden.


Initialisieren von Arrays

Soll ein Array beim Anlegen initialisiert werden, so muss die Liste mit den Initialisierungswerten in eckige Klammern gesetzt werden.

VAR
	arrTest	: ARRAY[1..5] OF INT := [1, 2, 3, 4, 5];
END_VAR

Bisher mussten die eckigen Klammern nicht angegeben werden.

Einzeilige Kommentare

C, C++, Java und C# lassen grüßen: Jetzt kann (alternativ) ein Kommentar mit // begonnen werden. Der Kommentar endet mit dem Zeilenumbruch.

VAR
	xVar : BOOL; // einzeiliger Kommentar
	nVar1 : INT; (* mehrzeiliger 
 Kommentar *)
	nVar2 : INT;
END_VAR

Kommentare über mehrere Zeilen können weiterhin mit (* … *) angelegt werden.

CONTINUE in Schleifen

Bisher konnte innerhalb von FOR, WHILE und REPEAT-Schleifen mit der Anweisung EXIT die Schleife vorzeitig beendet werden. Jetzt ist es mit CONTINUE auch möglich, eine Schleife vorzeitig fortzusetzen.

PROGRAM PLC_PRG
VAR
 nVar : INT;
 nCounter : INT;
END_VAR
nCounter := 0;
FOR nVar := 1 TO 10 DO
 IF ((nVar MOD 2) = 0) THEN
 nCounter := nCounter + 1;
 CONTINUE;
 END_IF
 // weitere Befehle
 /// ...
END_FOR

Im obigen Beispiel wird die Variable nCounter nur dann erhöht, wenn nVar eine gerade Zahl ist. Alle Befehle, die unterhalb von CONTINUE stehen, werden nach dem Aufruf von CONTINUE nicht ausgeführt.

UNION in benutzerdefinierten Datentypen

Mit einer UNION (Verbund) ist es möglich, eigene Datentypen zu definieren, deren Elemente alle denselben Speicherplatz belegen.

TYPE UN_TEST : UNION
 wVar1 : WORD;
 byVar2 : BYTE;
END_UNION
END_TYPE

Eine UNION kann z.B. dazu genutzt werden, um auf verschiedene Art und Weise auf den gleichen Speicher zuzugreifen. Hier ein Beispiel, bei dem auf eine 16-Bit Variable auch einzeln auf das Low-Byte und auf das High-Byte zugegriffen werden kann. Dazu wird zuerst eine Struktur angelegt, die aus zwei Bytes besteht.

TYPE ST_BYTES : STRUCT
 byVar1 : BYTE;
 byVar2 : BYTE;	
END_STRUCT
END_TYPE

Diese Struktur, die eine Größe von 16-Bit belegt, wird in einer UNION mit einem WORD ‘verbunden’.

TYPE UN_TEST : UNION
 wVar1 : WORD;
 stVar2 : ST_BYTES;
END_UNION
END_TYPE

Der Zugriff auf die einzelnen Elemente einer UNION erfolgt genauso, wie bei einer Struktur. Mit dem Unterschied, dass in diesem Fall ein Zugriff auf die Variable unVar.wVar1 auch die Variable unVar.stVar2 beeinflusst.

PROGRAM PLC_PRG
VAR
 unVar : UN_TEST;
 byA, byB : BYTE;
END_VAR

unVar.wVar1 := 16#1234;
byA := unVar.stVar2.byVar1; // Wert: 16#34
byB := unVar.stVar2.byVar2; // Wert: 16#12

Nach dem Start des Programms ändert sich in der UNION auch die Struktur stVar2.

Datentyp LTIME

Der Datentyp TIME erlaubt eine Auflösung nur im Millisekunden Bereich. Da die Zykluszeiten von Steuerungen mittlerweile die 1 ms-Grenze unterschreiten, wurde es notwendig, einen genaueren Datentyp für Zeitangaben zu definieren. LTIME hat eine Größe von 64 Bit (statt 32 Bit) und erlaubt eine Auflösung im Nanosekunden Bereich.

PROGRAM PLC_PRG
VAR
 ltTest : LTIME;
END_VAR
ltTest := LTIME#134D12H13M34S354MS2US74NS;

Datentyp WSTRING

Der Datentyp STRING kodiert die Zeichen nach ASCII. Jedes Zeichen wird durch ein Byte repräsentiert. Dadurch ist es zwar möglich, die meisten Buchstaben und Zeichen darzustellen, aber eben nicht alle. Um den Anforderungen anderer Sprachen gerecht zu werden, wurde der Datentyp WSTRING eingeführt. Dieser codiert die Zeichen nach Unicode. Unicode verwendet bis zu 4 Byte pro Zeichen. Bei CoDeSys V3 wird eine Unicode Variante benutzt, die immer 2 Byte pro Zeichen belegt. Über 65.000 verschiedene Zeichen können damit unterschieden werden. Damit können die meisten, von Menschen verwendeten Schriftzeichen, dargestellt werden, sofern sie in den Unicode-Standard aufgenommen wurden. Der Nachteil ist der höhere Speicherbedarf, wie folgendes Beispiel zeigt:

PROGRAM PLC_PRG
VAR
 wsTest : WSTRING(10) := "abcdefäüöß";
 sTest : STRING(10) := 'abcdefäüöß';
 nSizeWString, nSizeString : UDINT;
END_VAR

nSizeWString := SIZEOF(wsTest); // Wert: 22
nSizeString := SIZEOF(sTest); // Wert: 11

Unterschiede zwischen WSTRING und STRING gibt es auch bei der Initialisierung. Während eine STRING-Konstante mit dem Hochkomma definiert wird, wird bei einer WSTRING-Konstante das Anführungszeichen verwendet.

Datentyp REFERENCE

Bei diesem Datentyp handelt es sich um ein Alias für ein Objekt. Über den Alias kann sowohl gelesen als auch geschrieben werden. Im Gegensatz zu einem Zeiger wird der Wert, auf den gezeigt wird, direkt beeinflusst. Bei Reference-Variablen erfolgt die Zuweisung mit dem speziellen Zuweisungsoperator REF=.

Beispiel:

PROGRAM PLC_PRG
VAR
 refSample : REFERENCE TO INT;
 nA : INT;
 pSample : POINTER TO INT;
 nB : INT;
END_VAR

refSample REF= nA;
refSample := 12;
pSample := ADR(nB);
pSample^ := 12;

Sowohl die Variable nA als auch nB haben nach dem Starten des Programms den Wert 12.

Mit Hilfe des Operators __ISVALIDREF kann überprüft werden, ob eine Reference-Variable einen gültigen Wert enthält.

PROGRAM PLC_PRG
VAR
 refSampleA : REFERENCE TO INT;
 nA : INT;
 refSampleB : REFERENCE TO INT;
 nB : INT;
 a, b : BOOL;
END_VAR

refSampleA REF= nA;
// refSampleB REF= nB;

a := __ISVALIDREF(refSampleA); // TRUE
b := __ISVALIDREF(refSampleB); // FALSE

Eine Reference-Variable wird ungültig, wenn ihr der Wert 0 zugewiesen wird.

refSample REF= 0;
a := __ISVALIDREF(refSample); // FALSE

Zugriff auf Strings per [ ]

Auf die einzelnen Zeichen einer Variablen vom Typ STRING oder WSTRING kann mit dem Index-Operator zugegriffen werden. Bei einer Variablen vom Typ STRING liefert dieser den ASCII-Code als Byte zurück. Wird auf eine Variable vom Typ WSTRING zugegriffen, so wird der Unicode als WORD zurückgeliefert.
Es kann auch schreibend auf die Zeichen zugegriffen werden. Das Array beginnt bei 0, d.h. das 1. Zeichen hat den Index 0.

PROGRAM PLC_PRG
VAR
 sTest : STRING(10) := 'abcdefgh';
 byLetter : BYTE;
 swTest : WSTRING(10) := "abcdefgh";
 wLetter : WORD;
END_VAR

byLetter := sTest[3]; // ASCII-Code von 'd': 100
wLetter := swTest[5]; // Unicode von 'f': 102

sTest[5] := 102; // der 6. Buchstabe wird ein 'f'

bedingte Kompilierung

Bei der bedingten Kompilierung hat man die Möglichkeit, je nach Gegebenheiten bestimmte Quelltextblöcke von der Kompilierung auszuschließen oder einzubinden. Beim Debuggen des Programms kann dies von Vorteil sein. Mit {IF} und {END_IF} kann man einen Quelltextbereich eingrenzen, der nur kompiliert wird, wenn eine bestimmte Bedingung erfüllt ist. Ein {IF}/{END_IF} kann bei Bedarf einen {ELSE}-Zweig aufweisen. Dieser wird dann kompiliert, wenn die Bedingung FALSE ist.

Die bedingte Kompilierung ist sehr hilfreich, wenn ein Programm für unterschiedliche Ausprägungen entwickelt werden soll. Bereiche, die nicht immer nötigt sind, können somit vom Kompilieren ausgeschlossen werden. Dadurch wird nur der Code auf die Steuerung geladen, der tatsächlich benötigt wird.

Es können verschiedene Bedingungen abgefragt werden:

{IF defined (identifier)}

Die Abfrage ist TRUE, wenn identifier definiert wurde. Das Definieren kann mit der Anweisung {define identifier} erfolgen. Dieses bezieht sich aber nur auf den aktuellen Gültigkeitsbereich. Soll für den gesamten Gültigkeitsbereich der Applikation die Definition erfolgen, so kann dieses über den Eigenschaftsdialog der Applikation erfolgen.

CompilerDefines 

Beispiel:

PROGRAM PLC_PRG
VAR
{IF defined (identifier)}
 nA : INT;
 nB : INT;
{ELSE}
 lrA : LREAL;
 lrB : LREAL; 
{END_IF}
END_VAR

{IF defined (identifier)}
nA := 1;
nB := 2;
{ELSE}
lrA := 1.1;
lrB := 2.2;
{END_IF}

{IF defined (variable:variableName)}

Die Abfrage ist erfüllt, wenn die Variable variableName im aktuellen Gültigkeitsbereich definiert ist.

Beispiel:

PROGRAM PLC_PRG
VAR
 nA : INT;
 nB : INT;
END_VAR

{IF defined (variable:nA)}
nA := 1;
nB := nA + 1;
{ELSE}
nB := 1;
{END_IF}

Nach dem Starten des Programms, ist die Variable nA 1 und die Variable nB 2.

{IF defined (type:typeName)}

Die Abfrage ist TRUE, wenn eine Struktur, Aufzählung oder Verbund mit dem Namen typeName existiert.

Beispiel (in dem Projekt ist die Struktur ST_Sample definiert):

PROGRAM PLC_PRG
VAR
{IF defined (type:ST_Sample)}
 stSample : ST_Sample;
{END_IF}
 nB	 : INT;
END_VAR

{IF defined (type:ST_Sample)}
 stSample.nA := 100;
 nB := stSample.nA;
{ELSE}
 nB := 1;
{END_IF}

Die Variable nB ist nach dem Starten 100.

{IF defined (pou:pouName)}

Existiert ein Programmbaustein mit dem Namen pouName, so ist die Bedingung erfüllt.

{IF hastype (variable:variableName, dataType)}

Die Bedingung ist erfüllt, wenn die Variable variableName vom Type dataType ist.

Beispiel:

PROGRAM PLC_PRG
VAR
 varSample : LREAL;
END_VAR

{IF hastype (variable:varSample, LREAL)}
 varSample := 123.456;
{END_IF}
{IF hastype (variable:varSample, INT)}
 varSample := 123;
{END_IF}

Die Variable varSample bekommt nach dem Starten des Programms den Wert 123.456 zugewiesen.

{IF hasvalue (identifierName, identifierValue)}

Bei der Definition eines Identifiers kann diesem optional ein Wert vom Typ STRING zugewiesen werden. Dieser Wert kann abgefragt werden.

Beispiel:

PROGRAM PLC_PRG
VAR
 nSample : INT;
END_VAR

{define identifier '1'}
{IF hasvalue (identifier, '1')}
 nSample := 100;
{END_IF}
{IF hasvalue (identifier, '2')}
 nSample := 200;
{END_IF}

Nach dem Starten des Programms hat die Variable nSample den Wert 100.

Operatoren AND, OR, NOT und ()

Mehrere Abfragen können auch miteinander kombiniert werden.

Beispiel:

{IF hasvalue (identifier, '1') AND hastype (variable:nSample, WORD)}

iec-61131-3 codesys-v3 sps codesys-v3-allgemein continue ltime reference union wstring bedingte-kompilierung
1 Meinung
0
That the best sharing. here you have found a bests card games and enjoy to play online spider solitaire on your gadget, its really given most exiting place for all online players and make interesting moment for you.
Schreibe einen Kommentar:
Themen:
bedingte-kompilierung wstring union reference ltime continue codesys-v3-allgemein sps codesys-v3 iec-61131-3
Entweder einloggen... ...oder ohne Wartezeit registrieren
Benutzername
Passwort
Passwort wiederholen
E-Mail