Bedingte Pragmas dienen dazu, die Codegenerierung im Vorübersetzungsprozess oder Übersetzungsprozess zu beeinflussen. Die Implementierungssprache ST unterstützt diese Pragmas.




HINWEIS

Sie verwenden bedingte Pragmas in den Implementierungen von POUs. Wenn Sie die bedingten Pragmas im Deklarationsteil verwenden, wertet CODESYS diese Pragmas nicht aus!
Mit bedingten Pragmas beeinflussen Sie, ob Implementierungscode für die Übersetzung berücksichtigt wird. Dies können Sie beispielsweise davon abhängig machen ob eine bestimmte Variable deklariert ist, ob ein bestimmter Baustein vorhanden ist etc.
|
Pragma |
Beschreibung |
|---|---|
|
|
Der Wert kann später mit |
|
|
Die |
|
|
Dies sind Pragmas für die bedingte Kompilierung. Die angegebenen Ausdrücke |
|
|
Innerhalb des konstanten Ausdrucks |
Sie können Ausdrücke und define-Definitionen als „ Compilerdefinitionen“ in der Registerkarte „Übersetzen“ im Eigenschaftendialog von POUs eintragen. Wenn Sie define-Definitionen im Eigenschaftendialog eintragen, müssen Sie den Begriff {define} weglassen, im Gegensatz zur Definition im Implementierungscode. Außerdem können Sie
im Eigenschaftendialog mehrere define-Definitionen durch Kommas getrennt angeben.
Operator defined (<identifier>)
Der Operator bewirkt, dass der Ausdruck den Wert TRUE erhält. Voraussetzung ist, dass der Bezeichner <identifier> mit Hilfe einer {define}-Anweisung definiert wurde und danach nicht mit einer {undefine}-Anweisung wieder undefiniert wurde; ansonsten wird FALSE geliefert.
Beispiel
Voraussetzung: Es gibt die Applikationen App1 und App2. Die Variable pdef1 ist durch eine {define}-Anweisung in App1 definiert, nicht aber in App2.
{IF defined (pdef1)}
(* This code is processed in App1 *)
{info 'pdef1 defined'}
hugo := hugo + SINT#1;
{ELSE}
(* the following code is only processed in App2 *)
{info 'pdef1 not defined'}
hugo := hugo - SINT#1;
{END_IF}
Hier ist zusätzlich ein Beispiel eines Meldungspragmas enthalten: Nur die Meldung
pdef1 defined wird im Meldungsfenster angezeigt, wenn die Applikation kompiliert wird, weil pdef1 tatsächlich definiert ist. Die Meldung pdef1 not defined wird ausgegeben, wenn pdef1 nicht definiert ist
Operator defined (variable: <variable>)
Der Operator bewirkt, dass der Ausdruck den Wert TRUE erhält, wenn die Variable <variable> innerhalb des aktuellen Gültigkeitsbereichs deklariert ist; ansonsten wird FALSE geliefert.
Beispiel
Voraussetzung: Es gibt zwei Applikationen App1 und App2. Die Variable g_bTest ist in App1 deklariert, nicht aber in App2.
{IF defined (variable: g_bTest)}
(* the following code is only processed in App2*)
g_bTest := x > 300;
{END_IF}
Operator defined (type: <identifier>)
Der Operator bewirkt, dass der Ausdruck den Wert TRUE erhält, wenn ein Datentyp mit dem Bezeichner <identifier> deklariert ist; ansonsten wird FALSE geliefert.
Beispiel
Voraussetzung: Es gibt zwei Applikationen App1 und App2. Datentyp DUT ist in App1 deklariert, nicht aber in App2.
{IF defined (type: DUT)}
(* the following code is only processed in App1*)
bDutDefined := TRUE;
{END_IF}
Operator defined (pou: <pou name>)
Der Operator bewirkt, dass der Ausdruck den Wert TRUE erhält, wenn ein Baustein oder eine Aktion mit dem Namen <pou-name> vorhanden ist; ansonsten wird FALSE geliefert.
Beispiel
Voraussetzung: Es gibt zwei Applikationen App1 und App2. Der Baustein CheckBounds ist in App1 vorhanden, nicht aber in App2.
{IF defined (pou: CheckBounds)}
(* the following code is only processed in App1 *)
arrTest[CheckBounds(0,i,10)] := arrTest[CheckBounds(0,i,10)] + 1;
{ELSE}
(* the following code is only processed in App2 *)
arrTest[i] := arrTest[i]+1;
{END_IF}
Operator defined (task: <identifier>)
Noch nicht implementiert!
Der Operator bewirkt, dass der Ausdruck den Wert TRUE erhält, wenn eine Task mit dem Namen <identifier> definiert ist; ansonsten wird FALSE geliefert.
Beispiel
Voraussetzung: Es gibt zwei Applikationen App1 und App2. Task PLC_PRG_Task ist in App1 definiert, nicht aber in App2.
IF defined (task: PLC_PRG_Task)}
(* the following code is only processed in App1 *)
erg := plc_prg.x;
{ELSE}
(* the following code is only processed in App2 *)
erg := prog.x;
{END_IF}
Operator defined (resource: <identifier>)
Noch nicht implementiert!
Der Operator bewirkt, dass der Ausdruck den Wert TRUE erhält, wenn ein Ressourcen-Objekt mit dem Namen <identifier> für die Applikation vorhanden ist; ansonsten wird FALSE geliefert.
Beispiel
Voraussetzung: Es gibt zwei Applikationen App1 und App2. Ein Ressourcen-Objekt glob_var1 der Globalen Variablenliste ist für App1 vorhanden, nicht aber für App2.
{IF defined (resource:glob_var1)}
(* the following code is only processed in App1 *)
gvar_x := gvar_x + ivar;
{ELSE}
(* the following code is only processed in App2 *)
x := x + ivar;
{END_IF}
Operator defined (IsSimulationMode)
Der Operator bewirkt, dass der Ausdruck den Wert TRUE erhält, wenn die Applikation auf einem simulierten Gerät läuft, also im Simulationsbetrieb
ist.
Siehe auch
Operator defined (IsLittleEndian)
Der Operator bewirkt, dass der Ausdruck den Wert FALSE erhält, wenn der Speicher der CPU in Big-Endian (Motorola Byte Order) organisiert
ist.
Operator defined (IsFPUSupported)
Wenn der Ausdruck den Wert TRUE liefert, erzeugt der Codegenerator bei der Berechnungen mit REAL-Werten einen FPU-Code (für den Floating Point Unit-Porzessor). Ansonsten emuliert
CODESYS die FPU-Operationen, was jedoch bedeutend langsamer ist.
Operator hasvalue (RegisterSize, '<register size>')
<register size>: Größe eines CPU-Registers in Bit
Der Operator bewirkt, dass der Ausdruck den Wert TRUE liefert, wenn die Größe eines CPU-Registers gleich <register size> ist.
Mögliche Werte für <register size>
-
16für C16x, -
64für X86-64 Bit -
32für X86-32 Bit
Operator hasvalue (PackMode, '<pack mode value>')
Der abgeprüfte PackMode hängt von der Gerätebeschreibung ab, nicht vom Pragma, das für einzelne DUTs angegeben werden kann.
Operator hasattribute (pou: <pou name>, '<attribute>')
Der Operator bewirkt, dass der Ausdruck den Wert TRUE erhält, wenn das Attribut <attribute> in der ersten Zeile des Deklarationsteils des Bausteins <pou name> angegeben ist; ansonsten wird FALSE zurückgeliefert.
Beispiel
Voraussetzung: Es gibt zwei Applikationen App1 und App2. Die Funktion fun1 ist in App1 und App2 deklariert, aber in App1 ist sie zusätzlich mit dem Pragma {attribute 'vision'} versehen.
In App1:
{attribute 'vision'}
FUNCTION fun1 : INT
VAR_INPUT
i : INT;
END_VAR
VAR
END_VAR
In App2:
FUNCTION fun1 : INT VAR_INPUT i : INT; END_VAR VAR END_VAR
Pragmaanweisung:
{IF hasattribute (pou: fun1, 'vision')}
(* the following code is only processed in App1 *)
ergvar := fun1(ivar);
{END_IF}
Siehe auch
Operator hasattribute (variable: <variable>, '<attribute>')
Der Operator bewirkt, dass der Ausdruck den Wert TRUE erhält, wenn der Variablen das Pragma {attribute '<attribute>'} in der Zeile vor der Variablendeklaration zugewiesen ist; ansonsten wird FALSE zurückgeliefert.
Beispiel
Voraussetzung: Es gibt zwei Applikationen App1 und App2. Die Variable g_globalInt wird in App1 und App2 verwendet, aber in App1 ist ihr zusätzlich das Attribut 'DoCount' zugewiesen.
Deklaration g_GlobalInt in App1
VAR_GLOBAL
{attribute 'DoCount'}
g_globalInt : INT;
g_multiType : STRING;
END_VAR
Deklaration g_GlobalInt in App2:
VAR_GLOBAL g_globalInt : INT; g_multiType : STRING; END_VAR
Pragmaanweisung:
{IF hasattribute (variable: g_globalInt, 'DoCount')}
(* the following code is only processed in App1 *)
g_globalInt := g_globalInt + 1;
{END_IF}
Siehe auch
Operator hastype (variable: <variable>, <type-spec>)
Der Operator bewirkt, dass der Ausdruck den Wert TRUE erhält, wenn die Variable <variable> vom Datentyp <type-spec> ist; ansonsten wird FALSE zurückgeliefert.
Mögliche Datentypen für <type-spec>:
-
BOOL -
BYTE -
DATE -
DATE_AND_TIME (DT) -
DINT -
DWORD -
INT -
LDATE -
LDATE_AND_TIME (LDT) -
LINT -
LREAL -
LTIME -
LTIME_OF_DAY (LTOD) -
LWORD -
REAL -
SINT -
STRING -
TIME -
TIME_OF_DAY (TOD) -
ULINT -
UDINT -
UINT -
USINT -
WORD -
WSTRING
Beispiel
Voraussetzung: Es gibt zwei Applikationen App1 und App2. Die Variable g_multitype ist in App1 mit Datentyp LREAL deklariert, in App2 mit Datentyp STRING.
{IF (hastype (variable: g_multitype, LREAL))}
(* the following code is only processed in App1 *)
g_multitype := (0.9 + g_multitype) * 1.1;
{ELSIF (hastype (variable: g_multitype, STRING))}
(* the following code is only processed in App2 *)
g_multitype := 'this is a multitalent';
{END_IF}
Operator hasvalue (<define-ident>, '<char-string>')
Der Operator bewirkt, dass der Ausdruck den Wert TRUE erhält, wenn eine Variable mit Bezeichner <define-ident> definiert ist und den Wert <char-string> hat; ansonsten wird FALSE zurückgeliefert.
Beispiel
Voraussetzung: Es gibt zwei Applikationen App1 und App2. Variable test wird in den Applikationen App1 und App2 verwendet; in App1 erhält sie den Wert 1, in App2 den Wert 2.
{IF hasvalue(test,'1')}
(* the following code is only processed in App1 *)
x := x + 1;
{ELSIF hasvalue(test,'2')}
(* the following code is only processed in App2 *)
x := x + 2;
{END_IF}
Operator hasconstantvalue(<variable>, <literal expression>)
Mit diesem Operator kann man den deklarierten Wert einer Konstanten abfragen.
Beispiel
Voraussetzung:
{IF hasconstantvalue(test,'1')}
(* the following code is only processed in App1 *)
x := x + 1;
{ELSIF hasconstantvalue(test,'2')}
(* the following code is only processed in App2 *)
x := x + 2;
{END_IF}
Operator NOT <operator>
Der Ausdruck erhält den Wert TRUE, wenn der Umkehrwert von <operator> den Wert TRUE liefert. <operator> kann einer der in diesem Kapitel beschriebenen Operatoren sein.
Beispiel
Voraussetzung: Es gibt zwei Applikationen App1 und App2. PLC_PRG1 ist in App1 und App2 vorhanden, die POU CheckBounds gibt es nur in App1.
{IF defined (pou: PLC_PRG1) AND NOT (defined (pou: CheckBounds))}
(* the following code is only processed in App2 *)
bANDNotTest := TRUE;
{END_IF}
Operator <operator> AND <operator>
Der Ausdruck erhält den Wert TRUE, wenn die beiden angegebenen Operatoren TRUE liefern. <operator> kann einer der in diesem Kapitel beschriebenen Operatoren sein.
Beispiel
Voraussetzung: Es gibt die Applikationen App1 und App2. PLC_PRG1 ist in App1 und App2 vorhanden, die POU CheckBounds nur in App1.
{IF defined (pou: PLC_PRG1) AND (defined (pou: CheckBounds))}
(* the following code is only processed in App1 *)
bANDTest := TRUE;
{END_IF}
Operator <operator> OR <operator>
Der Ausdruck liefert TRUE, wenn einer der beiden angegebenen Operatoren TRUE liefert. <operator> kann einer der hier beschriebenen Operatoren sein.
Beispiel
Voraussetzung: Es gibt zwei Applikationen App1 und App2. Die POU PLC_PRG1 ist in App1 und App2 vorhanden, die POU CheckBounds nur in App1.
{IF defined (pou: PLC_PRG1) OR (defined (pou: CheckBounds))}
(* the following code is only processed in App1 and in App2 *)
bORTest := TRUE;
{END_IF}
Operator (<operator>)
() klammert die Operatoren.