正文12.docx
《正文12.docx》由会员分享,可在线阅读,更多相关《正文12.docx(34页珍藏版)》请在冰点文库上搜索。
正文12
12IEC操作符
12.1IEC操作符(TheIECOperators)
WAGO-I/O-PRO32支持所有IEC操作符。
与标准库相比(参看附录D,标准库),这些操作符在项目中被隐含识别。
在POU中操作符像函数一样使用。
以下类别的操作符是支持的:
12.2算术操作符(ArithmeticOperators)
12.2.1加法(ADD)
加法的变量类型:
BYTE,WORD,DWORD,SINT,USINT,INT,UINT,DINT,UDINT和REAL。
两个TIME变量也可以相加,结果放在另一个TIME变量中(例如,t#45s+t#50s=t#1m35s)。
IL中的实例:
LD7
ADD2,4,7
STVar1
ST中的实例:
var1:
=7+2+4+7;
FBD中的实例:
12.2.2乘法(MUL)
乘法的变量类型:
BYTE,WORD,DWORD,SINT,USINT,INT,UINT,DINT,UDINT和REAL。
IL中的实例:
LD7
MUL2,4,7
STVar1
ST中的实例:
var1:
=7*2*4*7;
FBD中的实例:
12.2.3减法(SUB)
减法的变量类型:
BYTE,WORD,DWORD,SINT,USINT,INT,UINT,DINT,UDINT和REAL。
两个TIME变量也可以相减,结果放在第三个TIME变量中。
注意负的TIME值是不允许。
IL中的实例:
LD7
SUB8
STVar1
ST中的实例:
var1:
=7-2;
FBD中的实例:
12.2.4除法(DIV)
除法的变量类型:
BYTE,WORD,DWORD,SINT,USINT,INT,UINT,DINT,UDINT和REAL。
IL中的实例:
LD8
DIV2
STVar1(*Resultis4*)
ST中的实例:
var1:
=8/2;
FBD中的实例:
提示:
如果在项目中使用名字CheckDivByte、CheckDivWord、CheckDivDWord和CheckDivReal定义功能,则你可使用它们来检测除数的值(使用DIV操作符)。
例如,为避免被0除,必须有上面所列的功能名。
参看下图中CheckDivReal功能执行的实例:
操作符DIV使用功能CheckDivReal的输出作为除数。
在下面的程序中,避免了除数为0,除数(d)设为从0到1。
因此除法结果为799。
12.2.5余数(MOD)
除法余数的变量类型:
BYTE,WORD,DWORD,SINT,USINT,INT,UINT,DINT,UDINT。
这个功能的结果是除法的余数。
这个结果将是一个整数。
IL中的实例:
LD9
MOD2
STVar1(*Resultis1*)
ST中的实例:
var1:
=9MOD2;
FBD中的实例:
12.2.6INDEXOF
执行这个功能可以查找POU的内部指针。
ST中的实例:
var1:
=INDEXOF(POU2);
12.2.7SIZEOF
执行这个功能以确定所给数据类型要求的字节数。
IL中的实例:
arr1:
ARRAY[0..4]OFINT;
Var1INT
LDarr1
SIZEOF
STVar1(*Resultis10*)
ST中的实例:
var1:
=SIZEOF(arr1);
12.3位字符串操作符(BitstringOperators)
12.3.1与(AND)
位操作符AND,操作数的类型为BOOL,BYTE,WORD或DWORD。
IL中的实例:
Var1BYTE
LD2#1001_0011
AND2#1000_1010
STVar1(*Resultis2#1000_0010*)
ST中的实例:
var1:
=2#1001_0011AND2#1000_1010
FBD中的实例:
提示:
如果在SFC中有如下程序步骤,
且如果使用68xxx-或C-code编程器,请注意:
AND操作块的第二个输入变量的值对变量z的指定将不被执行!
这是由于如果输入变量为FALSE时,SFC中的优化处理引起的。
12.3.2或(OR)
位操作OR。
操作数类型为BOOL,BYTE,WORD或DWORD。
IL中的实例:
var1:
BYTE;
LD2#1001_0011
OR2#1000_1010
STvar1(*Resultis2#1001_1011*)
ST中的实例:
Var1:
=2#1001_0011OR2#1000_1010
FBD中的实例:
提示:
如果在SFC中有如下程序步骤,
且如果使用68xxx-或C-code编程器,请注意:
OR操作块的第二个输入变量的值对变量z的指定将不被执行!
这是由于如果输入变量为FALSE时,SFC中的优化处理引起的。
12.3.3异或(XOR)
位操作XOR。
操作数类型为BOOL,BYTE,WORD或DWORD。
IL中的实例:
Var1:
BYTE;
LD2#1001_0011
XOR2#1000_1010
STVar1(*Resultis2#0001_1001*)
ST中的实例:
Var1:
=2#1001_0011XOR2#1000_1010
FBD中的实例:
12.3.4非(NOT)
位操作NOT。
操作数类型为BOOL,BYTE,WORD或DWORD。
IL中的实例:
Var1:
BYTE;
LD2#1001_0011
NOT
STVar1(*Resultis2#0110_1100*)
ST中的实例:
Var1:
=NOT2#1001_0011
FBD中的实例:
12.4位移操作符(Bit-ShiftOperators)
提示:
用于InfineonC16x目标系统的编码发生器使用模数16执行位移计算操作。
12.4.1左移(SHL)
一个操作数按位左移(left-shift):
erg:
=SHL(in,n)
输入变量erg,in和n的类型为BYTE,WORD或DWORD。
in将左移n位,右边以0补齐。
提示:
请注意位的数量,这一操作被当作算术操作,输入变量的数据类型是虚假的!
如果输入变量是常量,注意最小可能数据类型。
在算术操作上,输出变量的类型根本没有影响。
参看以下十六进制符号的例子,依照输入变量(BYTE或WORD)数据类型的不同,尽管输入变量in_byte和in_word是相同的,erg_byte和erg_word将得到不同的结果。
ST中的实例:
FBD中的实例:
IL中的实例:
LD16#45
SHL2
STerg_byte
12.4.2右移(SHR)
一个操作数按位右移(right-shift):
erg:
=SHR(in,n)
erg,in和n的类型将为BYTE,WORD或DWORD。
in将向右移动n位,左边用0补齐。
参看以下十六进制符号的例子,依照输入变量的类型(BYTE或WORD)注意算术操作的结果。
ST中的实例:
FBD中的实例:
IL中的实例:
LD16#45
SHL2
STerg_byte
12.4.3循环左移(ROL)
一个操作数循环向左移动:
erg:
=ROL(in,n)
erg,in和n的类型为BYTE,WORD或DWORD。
in将n次向左移动一位,当移到最左边时,再重新从右边插入。
提示:
请注意位的数量,这一操作被当作算术操作,输入变量的数据类型是虚假的!
如果输入变量是常量,注意最小可能数据类型。
在算术操作上,输出变量的类型根本没有影响。
参看以下十六进制符号的例子,依照输入变量(BYTE或WORD)数据类型的不同,尽管输入变量in_byte和in_word是相同的,erg_byte和erg_word将得到不同的结果。
ST中的实例:
FBD中的实例:
IL中的实例:
:
LD16#45
SHL2
STerg_byte
12.4.4循环右移(ROR)
一个操作数循环向右移动:
erg:
=ROL(in,n)
erg,in和n的类型为BYTE,WORD或DWORD。
in将n次向右移动一位,当移位到最右边时,再重新从左边插入。
提示:
请注意位的数量,这一操作被当作算术操作,输入变量的数据类型是虚假的!
如果输入变量是常量,注意最小可能数据类型。
在算术操作上,输出变量的类型根本没有影响。
参看以下十六进制符号的例子,依照输入变量(BYTE或WORD)数据类型的不同,尽管输入变量in_byte和in_word是相同的,erg_byte和erg_word将得到不同的结果。
ST中的实例:
FBD中的实例:
IL中的实例:
LD16#45
SHL2
STerg_byte
12.5选择操作符(SelectionOperators)
所有选择操作符同变量一起执行。
为了更加明确,以下我们将限制使用常量作为操作符的例子。
12.5.1SEL
二元选择
OUT:
=SEL(G,IN0,IN1)means:
OUT:
=IN0ifG=FALSE;
OUT:
=IN1ifG=TRUE.
IN0,IN1和OUT可以是变量的任一类型,G必须是BOOL。
如果G是FALSE,选择结果是IN0;如果G是TRUE,结果为IN1。
IL中的实例:
LDTRUE
SEL3,4
STVar1(*Resultist4*)
LDFALSE
SEL3,4
STVar1(*Resultist3*)
ST中的实例:
Var1:
=SEL(TRUE,3,4);(*Resultis4*)
FBD中的实例:
提示:
如果IN0是TRUE,IN1或IN2前面的表达式将不处理。
12.5.2MAX
最大功能是返回两个数值中较大的值。
OUT:
=MAX(IN0,IN1)
IN0,IN1和OUT可以是任意类型的变量。
IL中的实例:
LD90
MAX30
MAX40
MAX77
STVar1(*Resultis90*)
ST中的实例:
Var1:
=MAX(30,40);(*Resultis40*)
Var1:
=MAX(40,MAX(90,30));(*Resultis90*)
FBD中的实例:
12.5.3MIN
最大功能是显示两个数值中较小的值。
OUT:
=MIN(IN0,IN1)
IN0,IN1和OUT可以是任意类型的变量。
IL中的实例:
LD90
MIN30
MIN40
MIN77
STVar1(*Resultis30*)
ST中的实例:
Var1:
=MIN(90,30);(*Resultis30*);
Var1:
=MIN(MIN(90,30),40);(*Resultis30*);
FBD中的实例:
12.5.4LIMIT
限制处理。
OUT:
=LIMIT(Min,IN,Max)意思是:
OUT:
=MIN(MAX(IN,Min),Max)
对于结果来讲Max是上限,Min是下限。
IN的数值超过上限Max,LIMIT将返回Max。
IN的数值低于下限Min,结果将为Min。
IN和OUT可以是任意类型的变量。
IL中的实例:
LD90
LIMIT30,80
STVar1(*Resultis80*)
ST中的实例:
Var1:
=LIMIT(30,90,80);(*Resultis80*);
12.5.5MUX
多路转换器(Multiplexer)。
OUT:
=MUX(K,IN0,...,INn)意思是:
OUT:
=INK.
IN0,...,INn和OUT可以是变量的任意类型。
K必须是BYTE,WORD,DWORD,SINT,USINT,INT,UINT,DINT或UDINT。
MUX从一组数值中选择第K个值。
IL中的实例:
LD0
MUX30,40,50,60,70,80
STVar1(*Resultis30*)
ST中的实例:
Var1:
=MUX(0,30,40,50,60,70,80);(*Resultis30*);
提示:
除了INK以外,输入前的表达式将不被执行存储运行时间!
所有表达式只在仿真模式下执行。
12.6比较操作符(ComparisonOperators)
12.6.1GT
大于。
当第一个操作数的值比第二个大时,布尔操作符返回TRUE。
操作数可以是BOOL,BYTE,WORD,DWORD,SINT,USINT,INT,UINT,DINT,UDINT,REAL,TIME,DATE,TIME_OF_DAY,DATE_AND_TIME和STRING。
IL中的实例:
LD20
GT30
STVar1(*ResultisFALSE*)
ST中的实例:
VAR1:
=20>30>40>50>60>70;
FBD中的实例:
12.6.2LT
小于。
当第一个操作数的值比第二个小时,布尔操作符返回TRUE。
操作数可以是BOOL,BYTE,WORD,DWORD,SINT,USINT,INT,UINT,DINT,UDINT,REAL,TIME,DATE,TIME_OF_DAY,DATE_AND_TIME和STRING。
IL中的实例:
LD20
LT30
STVar1(*ResultisTRUE*)
ST中的实例:
VAR1:
=20<30;
FBD中的实例:
12.6.3LE
小于等于。
当第一个操作数的值小于或等于第二个值时,布尔操作符返回TRUE。
操作数可以是BOOL,BYTE,WORD,DWORD,SINT,USINT,INT,UINT,DINT,UDINT,REAL,TIME,DATE,TIME_OF_DAY,DATE_AND_TIME和STRING。
IL中的实例:
LD20
LE30
STVar1(*ResultisTRUE*)
ST中的实例:
VAR1:
=20<=30;
FBD中的实例:
12.6.4GE
大于等于。
当第一个操作数的值大于或等于第二个值时,布尔操作符返回TRUE。
操作数可以是BOOL,BYTE,WORD,DWORD,SINT,USINT,INT,UINT,DINT,UDINT,REAL,TIME,DATE,TIME_OF_DAY,DATE_AND_TIME和STRING。
IL中的实例:
LD60
GE40
STVar1(*ResultisTRUE*)
ST中的实例:
VAR1:
=60>=40;
FBD中的实例:
12.6.5EQ
等于。
当操作数的值相等时,布尔操作符返回TRUE。
操作数可以是BOOL,BYTE,WORD,DWORD,SINT,USINT,INT,UINT,DINT,UDINT,REAL,TIME,DATE,TIME_OF_DAY,DATE_AND_TIME和STRING。
IL中的实例:
LD40
EQ40
STVar1(*ResultisTRUE*)
ST中的实例:
VAR1:
=40=40;
FBD中的实例:
12.6.6NE
不等于。
当操作数的值不相等时,布尔操作符返回TRUE。
操作数可以是BOOL,BYTE,WORD,DWORD,SINT,USINT,INT,UINT,DINT,UDINT,REAL,TIME,DATE,TIME_OF_DAY,DATE_AND_TIME和STRING。
IL中的实例:
LD40
NE40
STVar1(*ResultisFALSE*)
ST中的实例:
VAR1:
=40<>40;
FBD中的实例:
12.7地址操作符(AddressOperators)
12.7.1ADR
地址功能。
ADR是以DWORD的形式返回其变量的地址。
输送给制造机能的这个地址作为一个指针处理,或在项目中被分配给一个指针。
IL中的实例:
LDVar1
ADR
STVar2
man_fun1
12.7.2容量操作符(ContentOperator)
一个指针可通过在其后面添加这个容量操作符(contentoperator)"^"而被取消。
ST中的实例:
pt:
POINTERTOINT;
var_int1:
INT;
var_int2:
INT;
pt:
=ADR(var_int1);
var_int2:
=pt^;
12.8调用操作符(CallingOperator)
12.8.1CAL
调用一个功能块或程序。
在IL中使用CAL调用一个功能块实例。
输入变量放在功能块实例名之后的圆括号中。
例如:
从功能块中调用实例Inst,其输入变量Par1和Par2分别为0和TRUE。
CALINST(PAR1:
=0,PAR2:
=TRUE)
12.9类型转化功能(TypeConversionFunctions)
从“较大”类型到“较小”类型的隐含转换是禁止的(例如:
从INT到BYTE或从DINT到WORD)。
如需要,可使用特殊类型转换。
从一种类型到另一种元素类型的转换是基本类型转换。
语法结构:
_TO_
请注意TO_STRING的转换,字符串从左边开始产生。
如果定义短了,将剪切掉其右边的字符。
12.9.1BOOL_TO
从BOOL类型转换到任意其它类型:
当操作数为TRUE时,数字类型的结果为1;当操作数为FALSE时,结果为0。
STRING类型的结果为'TRUE'或'FALSE'。
IL中的实例:
LDTRUE
BOOL_TO_INT
STi(*Resultis1*)
LDTRUE
BOOL_TO_STRING
STstr(*Resultis'TRUE'*)
LDTRUE
BOOL_TO_TIME
STt(*ResultisT#1ms*)
LDTRUE
BOOL_TO_TOD
STtof(*ResultisTOD#00:
00:
00.001*)
LDFALSE
BOOL_TO_DATE
STdat(*ResultisD#1970-01-01*)
LDTRUE
BOOL_TO_DT
STdandt(*ResultisDT#1970-01-01-00:
00:
01*)
ST中的实例:
i:
=BOOL_TO_INT(TRUE);(*Resultis1*)
str:
=BOOL_TO_STRING(TRUE);(*Resultis"TRUE"*)
t:
=BOOL_TO_TIME(TRUE);(*ResultisT#1ms*)
tof:
=BOOL_TO_TOD(TRUE);(*Resultis
TOD#00:
00:
00.001*)
dat:
=BOOL_TO_DATE(FALSE);(*ResultisD#1970*)
dandt:
=BOOL_TO_DT(TRUE);(*ResultisDT#1970-01-01-00:
00:
01*)
FBD中的实例:
(*Resultis1*)
(*Resultis'TRUE'*)
(*ResultisT#1ms*)
(*ResultisTOD#00:
00:
00.001*)
(*ResultisD#1970-01-01*)
(*ResultisDT#1970-01-01-00:
00:
01*)
12.9.2TO_BOOL
从其它变量类型转换为BOOL:
当操作数不等于0时,结果为TRUE。
当操作数等于0时,结果为FALSE。
当操作数为"TRUE"时,STRING类型变量的结果为