1.表达式
表达式在程序运行期间进行运算,然后返回一个值。一个表达式由操作数(例如常数、变量或函数调用)和与之搭配的运算符(例如*、/、+或-)组成。通过运算符可以将表达式连接在一起或相互嵌套。
表达式将按相关运算符的优先级和从左到右的顺序进行运算,括号中的运算优先。
表达式分为算术表达式、关系表达式和逻辑表达式。
表达式的运算结果有以下几种不同的用法:
1)作为一个值,赋给一个变量。
2)作为一个条件,用于一条控制指令。
3)作为一个参数,用于一个调用块或指令。
2.算术表达式
算术表达式可以是一个数字值,也可以是由带有算术运算符的两个值或表达式组合而成。
算术运算符可以处理当前CPU支持的各种数据类型。如果在该运算中有两个操作数,它们可以具有不同的数据类型,运算结果将采用长度足够长的那个数据类型。例如Int+Real=Real,Real+LReal=LReal。如果一个操作数为有符号整数,另一个为无符号整数,那么结果将采用另一个长度较大的有符号数据类型,例如SInt+USInt=Int,
下面是一个算术表达式的例子:
"MyTag1":="MyTag2"*"MyTag3";
3.关系表达式
关系表达式对两个操作数的值进行比较,得到一个布尔值。满足比较条件时比较结果为TRUE,否则为FALSE。
关系运算符可以处理当前CPU支持的各种数据类型,结果的数据类型始终为Bool。
编写关系表达式时,应注意以下规则:
1)整数/浮点数、二进制数、位字符串和字符串这些数据类型中的所有变量都可以进行比较。Time、LTime、日期和时间只能比较相同类型的变量。
2)字符串的比较基于ASCⅡ字符集,使用变量长度和每个ASCⅡ字符的数值进行比较。
3)S5Time变量不能作为比较的操作数,需要将它转换为Time数据类型后再进行比较。
下面是关系表达式的例子:
IF a>b THEN c:=a;
IF A>20 AND B<20 THEN C:=TRUE;
IF A<>(B AND C)THEN C:=FALSE;
4.逻辑表达式
逻辑表达式由两个操作数以及逻辑运算符(AND、OR或XOR)或取反操作数(NOT)组成。逻辑运算符可以处理当前CPU支持的各种数据类型。
如果两个操作数都是Bool型,逻辑表达式的结果也为Bool型。如果两个操作数中至少有一个是位字符串,结果也为位字符串,且结果是由位数最高的操作数的类型决定。例如逻辑表达式的两个操作数分别是Byte类型和Word类型时,结果为Word类型。
逻辑表达式中一个操作数为Bool类型而另一个为位字符串时,必须先将Bool类型的操作数显式转换为位字符串类型。(www.xing528.com)
下面是逻辑表达式的例子:
IF"My Tag1"AND NOT"My Tag2"THEN
c:=a;
MyTag:=ALPHA OR BETA;
5.运算符和运算符的优先级
通过运算符可以将表达式连接在一起或相互嵌套,表达式的运算顺序取决于运算符的优先级和括号。基本规则如下:算术运算符优先于关系运算符,关系运算符优先于逻辑运算符;同等优先级运算符的运算顺序则按照从左到右的顺序进行;括号中的运算的优先级最高。
表5-3给出了运算符的优先级,括号的优先级为1(最高)。
大多数S7-SCL运算由两个地址组成,称为二元操作,例如“A+B”。有的运算仅包含一个地址,称为一元操作。一元运算符在地址的前面,例如“-#AA”。可以将一元加、一元减理解为加、减号。在赋值指令“#BB:=-#AA;”中,“一元减”运算符(减号)用来改变变量#AA的符号。
表5-3 运算符及其优先级
6.赋值运算
可以通过赋值运算,将一个表达式的值分配给变量。赋值表达式的左侧为变量,右侧为表达式的值。
函数名称也可以作为表达式。赋值运算将调用该函数,并将函数的返回值赋值给左侧的变量。赋值运算的数据类型取决于左边变量的数据类型。右边表达式的数据类型必须与该数据类型一致。
1)如果两个结构(Struct)相同而且结构中成员的数据类型和名称也相同,则可以将整个结构分配给另一个结构。可以为单个结构元素分配一个变量、一个表达式或另一个结构元素。
2)如果两个数组(Array)的元素数据类型和数组下标的上、下限值都相同,则可以将整个数组分配给另一个数组。可以为单个数组元素分配一个变量、一个表达式或另一个数组元素。
3)可以将数据类型为String或WString的整个字符串赋值给数据类型相同的另一个字符串。可以为单个字符元素分配另一个字符元素。
4)只能将Any数据类型的变量赋值给同样为Any数据类型的FB的输入参数,或FB和FC的临时局部数据。使用Any指针时,只能指向“标准”访问模式的存储区。
在SCL的赋值运算中不能使用Pointer数据类型。
下面是赋值运算的例子:
"MyTag1":="MyTag2"; (*通过变量进行赋值*)
"MyTag1":="MyTag2"*"MyTag3"; (*通过表达式进行赋值*)
"MyTag":="MyFC"(); (*调用一个函数,并将函数的返回值赋值给变量*)
#MyStruct.MyStructElement:="MyTag"; (*将一个变量赋值给一个结构元素*)
#MyArray[2]:="MyTag"; (*将一个变量赋值给一个Array元素*)
"MyTag":=#MyArray[1,4]; (*将一个Array元素赋值给一个变量*)
#MyString[2]:=#MyOtherString[5]; (*将一个String元素赋给另一个String元素*)
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。