条件指令
条件指令的限制
仅在 POU 的实现中使用编译指示进行条件编译。在声明中,这些编译指示会被忽略,而不会被求值。
请注意以下例外:带有project_defined运算符可以插入到声明中。有关更多信息,请参阅以下内容:IF pragma with project_defined (<global define>)
编译器会在预编译操作和编译操作期间评估这些指令。此操作称为条件编译。ST 实现语言支持这些指令。
这{IF<expression> }语句与{ELSIF<expression> },{ELSE}以及结论{END_IF}指示实现中根据指定条件保留或忽略的代码。<expression>是由不同的操作数和运算符组成的整数常量表达式。
编译时,<{IF <expression>}被求值。如果其返回值为FALSE,那么分支将发生在下一个{ELSIF <expression>}段和表达式在那里计算,直到一个段返回一个表达式TRUE。表达式将依次求值,直到其中一个返回非 0 的值。只有与正表达式关联的这一个代码段才会被编译。其他代码段将被忽略。如果所有表达式都返回 0,则分支发生在{ELSE} . 如果{ELSE}如果缺少 pragma,则可能会发生没有代码段被编译的情况。
句法 | 代码片段示例 | 描述 |
|---|---|---|
| {IF defined (DEF0815)}
{info 'DEF0815 has been defined'}
Cnt0815 := iCnt0815 + 1; | 标记在有效的情况下编译的代码段的开头 |
| {ELSIF defined (DEF0816)}
{info 'DEF0815 has been defined'}
iCnt0816 := iCnt0816 + 1; | 无、一个或多个) 如果存在有效代码段,则分支标记替代代码段 |
| {ELSE}
{info 'DEF0815 not defined'}
iCnt0 := iCnt0 - 1; | 选修的 分支标记了在先前条件不满足时编译的代码段 |
| {END_IF} | 标记条件代码段的结束 |
| defined (DEF0815) | 健康)状况 整数表达式在编译时为常量,可以由运算符和操作数组成,例如编译器定义、变量或文字 |
编译器定义
编译器定义用作代码中特定状态的标签。可以使用定义的运算符来设置、删除或检查编译器定义。
句法 | 例子 | 描述 |
|---|---|---|
| {define DEF0815} | 定义编译器定义 注意编译器定义 |
| {define DEF0123 '123'} | 定义编译器定义 |
| {undefine DEF0815} | 删除编译器定义 因此,该标识符未定义。编译器未定义的编译指示将被忽略。 |
提示
或者,您也可以在 POU 的属性中本地定义表达式和编译器定义,或者在上级应用程序的属性中在应用程序范围内定义表达式和编译器定义。
为此,请在设备树中选择 POU 或上级应用程序。在上下文菜单中,点击特性然后选择建造选项卡中编译器定义输入字段,您可以定义一个文字或表达式(例如:DEF0815)。输入字段不需要像{define },而只是一个名字。
您可以指定多个编译器定义,以逗号分隔。
运营商
defined (variable: <variable name> )
运算符使表达式被赋予值 TRUE 当变量 <variable name> 在当前范围内声明。否则 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 (<identifier>)
运算符使表达式被赋予值 TRUE.要求是标识符 <identifier> 已经通过定义 {define} 声明并且之后没有未定义 {undefine} 陈述。否则 FALSE 被退回。
要求:应用程序 App1 和 App2 存在。这 pdef1 变量由 a 定义 {define} 中的声明 App1,但不在 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 not defined 时显示 pdef1 没有定义。
defined (type: <identifier> )
运算符使表达式被赋予值 TRUE 当使用标识符声明数据类型时 <identifier>.否则 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>)
运算符使表达式被赋予值 TRUE 当以下具有名称的对象之一 <pou-name> 存在:
功能块
功能
程序
行动
方法
界面
否则 FALSE 被退回。
要求:两个应用程序 App1 和 App2 存在。 POU 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 (resource: <identifier>)
重要
尚未实施
运算符使表达式被赋予值 TRUE 如果一个资源对象名为 <identifier> 为申请而存在;否则 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 (task: <task name> )
运算符使表达式被赋予值 TRUE 当使用名称定义任务时 <task name>.否则 FALSE 被退回。
句法
{ IF defined (task: <task name> }
{ ELSIF defined (task: <task name> }{IF defined (task: Task_D)}要求:两个应用程序 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 (IsLittleEndian)
运算符使表达式被赋予值 FALSE 当 CPU 内存以 Big Endian(摩托罗拉字节顺序)组织时。
defined (IsSimulationMode)
运算符使表达式被赋予值 TRUE 当应用程序在模拟设备上运行时(在模拟模式下)。
有关更多信息,请参阅: 在模拟模式下测试
defined (IsFPUSupported)
如果表达式返回值 TRUE,然后代码生成器在计算时生成一个 FPU 代码(用于浮点单元处理器) REAL 价值观。否则会模拟 FPU 操作,这要慢得多。
hasattribute (pou: <pou name>, ' <attribute name> ')
运算符使表达式被赋予值 TRUE 当属性 <attribute> 在功能块声明部分的第一行指定 <pou name>.否则 FALSE 被退回。
要求:两个应用程序 App1 和 App2 存在。功能 fun1 被声明在 App1 和 App2.然而,在 App1 它还提供了 pragma {attribute 'vision'}.
在 App1:
{attribute 'vision'}
FUNCTION fun1 : INT
VAR_INPUT
i : INT;
END_VAR
VAR
END_VAR在 App2:
FUNCTION fun1 : INT
VAR_INPUT
i : INT;
END_VAR
VAR
END_VARPragma 声明:
{IF hasattribute (pou: fun1, 'vision')}
(* the following code is only processed in App1 *)
ergvar := fun1(ivar);
{END_IF}hasattribute (variable: <variable name> , ' <attribute name> ')
运算符使表达式被赋予值 TRUE 当编译指示 {attribute '<attribute>'} 在变量声明之前的行中分配给变量。否则 FALSE 被退回。
要求:两个应用程序 App1 和 App2 存在。变量 g_globalInt 用于 App1 和 App2, 但在 App1 属性 'DoCount' 也分配给它。
宣言 g_GlobalInt 在 App1
VAR_GLOBAL
{attribute 'DoCount'}
g_globalInt : INT;
g_multiType : STRING;
END_VAR宣言 g_GlobalInt 在 App2:
VAR_GLOBAL
g_globalInt : INT;
g_multiType : STRING;
END_VARPragma 声明:
{IF hasattribute (variable: g_globalInt, 'DoCount')}
(* the following code is only processed in App1 *)
g_globalInt := g_globalInt + 1;
{END_IF}hasconstanttype( <constant name> , <boolean literal> )
操作员检查常量是否用 <constant name>, 已被替换。第二个参数(布尔值)控制检查的内容:
TRUE: 检查常量是否被替换FALSE: 检查常量是否未被替换
当相应的情况发生时,运算符返回 TRUE.
句法
{ IF hasconstanttype( <constant namne> , <boolean literal> ) }
{ ELSIF hasconstanttype( <constant namne> , <boolean literal> ) }
{IF hasconstanttype(PLC_PRG.aConst, TRUE)}编译选项 替换常量
常量类型(例如,
STRING类型永远不会被替换。)属性的使用
{attribute 'const_non_replaced'}属性的使用
{attribute 'const_replaced'}
VAR
iCntMAXIsReplaced: INT;
xErrorOccured : BOOL;
END_VAR
VAR CONSTANT
c_iMAX: INT := 99;
END_VAR
{IF hasconstanttype(c_iMAX, TRUE)}
iCntMAXIsReplaced := iCntMAXIsReplaced + 1;
{ELSE}
xErrorOccured := FALSE;
{END_IF}hasconstantvalue( <constant name> , <variable name> , <comparison operator> )
运算符比较常量的值,该常量用 <constant name>,与第二个参数的值。第二个参数可以指定为文字 <literal> 或作为变量 <variable name>.
<comparison operator>:比...更棒 (
>)大于或等于 (
>=)等于 (
=)不等于 (
<>)小于或等于 (
<=)少于 (
<)
句法
{ IF hasconstantvalue( <constant name> , <variable name> , <comparison operator> )
{ IF hasconstantvalue( <constant name> , <literal> , <comparison operator> )
{ ELSIF hasconstantvalue( <constant name> , <variable name> , <comparison operator> )
{ ELSIF hasconstantvalue( <constant name> , <literal> , <comparison operator> )
{IF hasconstantvalue(PLC_PRG.aConst, 99, >)}{ELSIF hasconstantvalue(PLC_PRG.aConst, GVL.intconst99, =)}PROGRAM PRG_ConditionConstantValue
VAR
iCntMAX: INT;
iCntGlobalMAX : INT;
iCntABC: INT;
iCntGlobalABC : INT;
xErrorOccured : BOOL;
END_VAR
VAR CONSTANT
c_iMAX: INT := 999;
c_sABC: STRING := 'ABC';
{attribute 'const_non_replaced'}
c_iNonReplaceable: INT := 888;
END_VAR
{IF hasconstantvalue(c_iMAX, 999, =)}
iCntMAX := iCntMAX + 1;
{ELSE}
xErrorOccured := FALSE;
{END_IF}
{IF hasconstantvalue(c_iMAX, GVL.gc_iMAX, =)}
iCntGlobalMAX := iCntGlobalMAX + 1;
{ELSE}
xErrorOccured := FALSE;
{END_IF}
{IF hasconstantvalue(c_sABC, 'ABC', =)}
iCntABC := iCntMAX + 1;
{ELSE}
xErrorOccured := FALSE;
{END_IF}
{IF hasconstantvalue(c_sABC, GVL.gc_sABC, =)}
iCntGlobalABC := iCntMAX + 1;
{ELSE}
xErrorOccured := FALSE;
{END_IF}hastype (variable: <variable name>, <data type> )
运算符使表达式被赋予值 TRUE 当变量 <variable> 属于数据类型 <type-spec>.否则 FALSE 被退回。
可能的数据类型:
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 (PackMode, ' <pack mode value> ')
检查的包模式取决于设备描述,而不是可以为单个 DUT 指定的编译指示。
hasvalue (RegisterSize, ' <register size> ')
<register size>: CPU 寄存器的大小(以位为单位)
运算符使表达式返回值 TRUE 当 CPU 寄存器的大小等于 <register size>.
可能的值 <register size>
16对于 C16x,64适用于 X86-64 位32适用于 X86-32 位
hasvalue (<define-ident>, ' <character string> ')
运算符使表达式被赋予值 TRUE 当使用标识符定义变量时 <define-ident> 并且有价值 <char-string>.否则 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}project_defined (<global define>)
此运算符自起可用 CODESYS V3.5 SP20。
运算符使表达式接收值 TRUE 如果全局定义 <global define> 包含在全局定义列表中 编译选项 项目设置。
运算符被指定为条件 IF 语句,可用于 ST POU 和库的实现部分和声明部分。它们可以通过以下方式与其他定义组合 AND 和 OR 运算符(如果相应位置允许)。
在 POU 的声明部分, IF 与操作员的声明 project_defined (<global define>) 可以包含以下结构:
变量声明
例子:
{If project_defined(define1)} x : DINT; {END_IF}评论
属性声明
杂注语句
以下构造是 不是 可能的:
完整的变量声明
例子
{If project_defined(define1)} VAR x : DINT; END_VAR {END_IF}POU 的完整声明
例子:
{If project_defined(define1)} FUNCTION POU : BOOL VAR_INPUT x : INT; END_VAR {END_IF}适用范围:
VAR_INPUT,VAR_OUTPUT,VAR_IN_OUT
NOT <operator>
表达式被赋予值 TRUE 当反向值 <operator> 返回值 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 存在。 POU 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>)
() 括号中的运算符。