条件编译的目的是影响预编译过程或编译过程中代码的生成。ST实现语言支持这些编译附注。
| 提示!
他们在POU的实现中使用条件语用。如果在声明部分中使用它们,则CODESYS不会评估这些条件的用法。 |
通过条件编译,您会影响是否在编译时考虑了实现代码。例如,您可以依赖于是否声明了某个变量,是否存在某个功能块等。
编译附注 | 描述 |
---|
{define <identifier> <string>} | 可以查询该值,以后再将其与hasvalue进行比较。 |
{undefine <identifier>} | 标识符的{define}语句被取消,并且标识符从现在开始再次为<undefined>。如果根本没有定义指定的标识符,则忽略编译附注。 |
{IF <expr>}... {ELSIF <expr>}... {ELSE}... END_IF} | 这些是条件编译的实用性。 指定的表达式<expr>在编译时必须是常量;将按照它们在此处出现的顺序对其进行求值,直到其中一个表达式表示非零值为止。链接到指令的文本被编译;其他行将被忽略。这些部分的顺序是固定的。ELSIF和ELSE部分是可选的。ELSIF段可能出现任何次数。您可以在常量<expr>中使用多个条件编译运算符。 |
<expr> | 您可以在条件编译用法{IF}或{ELSIF}的常量表达式<expr>中使用一个或多个运算符。 |
|
您可以在POU的属性对话框的编译选项卡中输入表达式并将define定义为编译器定义。如果在属性对话框中输入define定义,则必须省略术语{define},这与实现代码中的定义相反。此外,您可以在属性对话框中指定多个define定义,以逗号分隔。 |
运算符
define(<identifier>)此运算符使表达式的值为TRUE。要求是标识符<identifier>是在{define}指令的帮助下定义的,此后不再通过{undefine}指令重新定义;否则返回FALSE。
.示例:
要求:应用程序App1和App2存在。变量pdef1是由App1中的{define}语句定义的,而不是由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}
这也包含一个编译附注示例:编译应用程序时,仅在消息视图中显示pdef1 defined,因为实际上已定义了pdef1。如果未定义pdef1,则显示pdef1 not defined。
运算符
defined (variable: <variable>)如果在当前作用域内声明了变量<variable>,则该运算符使表达式的值为TRUE;否则返回FALSE。
.示例
要求:存在两个应用程序App1和App2。变量g_bTest在App1中声明,但不在App2中声明。
{IF defined (variable: g_bTest)}
(* the following code is only processed in App2*)
g_bTest := x > 300;
{END_IF}
运算符
defined (type: <identifier>)如果使用标识符<identifier>声明了数据类型,则运算符使表达式的值为TRUE;否则返回FALSE。
.示例
要求:存在两个应用程序App1和App2。DUT数据类型在App1中声明,但是不在App2中声明。
{IF defined (type: DUT)}
(* the following code is only processed in App1*)
bDutDefined := TRUE;
{END_IF}
运算符
defined (pou: <pou name>) 如果存在名称为<pou-name>的功能块或动作,则运算符使表达式的值为TRUE;否则返回FALSE。
.示例
要求:存在两个应用程序App1和App2。功能块CheckBounds在App1中存在,但在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}
运算符
defined (task: <identifier>)尚未实现!
如果定义了名称为<identifier>的任务,则运算符使表达式的值为TRUE。否则返回FALSE。
.示例
要求:存在两个应用程序App1和App2。任务PLC_PRG_Task在App1中定义,但未在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}
运算符
defined (resource: <identifier>)尚未实现!
如果存在用于应用程序的名称为<identifier>的资源对象,则运算符使表达式的值为TRUE。否则返回FALSE。
.示例
要求:存在两个应用程序App1和App2。全局变量列表的资源对象glob_var1对于App1存在,但对于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}
运算符
defined (IsSimulationMode)如果应用程序在模拟设备上运行(即在模拟模式下),则运算符使表达式的值为TRUE。
运算符
defined (IsLittleEndian)如果CPU内存按Big Endian(Motorola字节顺序)组织,则运算符使表达式的值为FALSE。
运算符
defined (IsFPUSupported)如果表达式返回值TRUE,则代码生成器在使用REAL值进行计算时会生成FPU代码(用于浮点单元处理器)。否则,CODESYS将模拟FPU操作,这要慢得多。
运算符
hasvalue (RegisterSize, '<register size>')<register size>: CPU寄存器的大小(以位为单位)
如果CPU寄存器的大小等于<register size>,则此运算符使表达式返回值TRUE。
<register size>的可能值
16 for 186 and C16x,
64 for X86-64 bit
32 for X86-32 Bit
运算符
hasvalue (PackMode, '<pack mode value>')选中的打包模式取决于设备说明,而不取决于可以为单个DUT指定的编译附注。
运算符
hasattribute (pou: <pou name>, '<attribute>')如果在功能块<pou name>的声明部分的第一行中指定了属性<attribute>,则该运算符使表达式的值为TRUE。否则返回FALSE。
.示例
要求:存在两个应用程序App1和App2。函数fun1在App1和App2中声明。但是,在App1中,它也提供了编译附注{attribute'vision'}。
.在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
.编译附注指示:
{IF hasattribute (pou: fun1, 'vision')}
(* the following code is only processed in App1 *)
ergvar := fun1(ivar);
{END_IF}
运算符
e (variable: <variable>, '<attribute>')如果将编译附注{attribute'<attribute>'}分配给变量声明前一行中的变量,则此运算符使表达式的值为TRUE。否则返回FALSE。
.示例
要求:存在两个应用程序App1和App2。在App1和App2中使用了变量g_globalInt,但在App1中还为其分配了属性'DoCount'。
.在App1中声明g_GlobalInt
VAR_GLOBAL
{attribute 'DoCount'}
g_globalInt : INT;
g_multiType : STRING;
END_VAR
.在App2中声明g_GlobalInt
VAR_GLOBAL
g_globalInt : INT;
g_multiType : STRING;
END_VAR
.编译附注指示:
{IF hasattribute (variable: g_globalInt, 'DoCount')}
(* the following code is only processed in App1 *)
g_globalInt := g_globalInt + 1;
{END_IF}
运算符
hastype (variable: <variable>, <type-spec>) 如果变量<variable>的数据类型为<type-spec>,则此运算符使表达式的值为TRUE。否则返回FALSE。
.<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
.示例
要求:存在两个应用程序App1和App2。变量g_multitype在App1中声明为数据类型LREAL,在App2中声明为数据类型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}
运算符
hasvalue (<define-ident>, '<char-string>')如果使用标识符<define-ident>定义变量并且具有值<char-string>,则此运算符使表达式的值为TRUE。否则返回FALSE。
.示例
要求:存在两个应用程序App1和App2。变量test用在应用程序App1和App2中;在App1中,值为1;在App2中,值为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}
运算符
hasconstantvalue(<variable>, <literal expression>)您可以使用此运算符查询常量的声明值。
.示例
.要求:
{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}
运算符
NOT <operator>如果<operator>的反向值返回值TRUE,则该表达式的值为TRUE。<operator>可以是本章中描述的运算符之一。
.示例
要求:存在两个应用程序App1和App2。PLC_PRG1存在于App1和App2中,而POU CheckBounds仅存在于App1中。
{IF defined (pou: PLC_PRG1) AND NOT (defined (pou: CheckBounds))}
(* the following code is only processed in App2 *)
bANDNotTest := TRUE;
{END_IF}
运算符
<operator> AND <operator>如果两个指定的运算符返回TRUE,则表达式的值为TRUE。<operator>可以是本章中描述的运算符之一。
.示例
要求:存在应用程序App1和App2。PLC_PRG1存在于App1和App2中,而POU CheckBounds仅存在于App1中。
{IF defined (pou: PLC_PRG1) AND (defined (pou: CheckBounds))}
(* the following code is only processed in App1 *)
bANDTest := TRUE;
{END_IF}
运算符
<operator> OR <operator>如果两个指定的运算符之一返回TRUE,则表达式返回TRUE。<operator>可以是本章中描述的运算符之一。
.示例
要求:存在两个应用程序App1和App2。PLC_PRG1存在于App1和App2中,POU CheckBounds仅存在于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>)