首页 理论教育 SCL基础知识介绍

SCL基础知识介绍

时间:2023-06-30 理论教育 版权反馈
【摘要】:2)作为一个条件,用于一条控制指令。满足比较条件时比较结果为TRUE,否则为FALSE。关系运算符可以处理当前CPU支持的各种数据类型,结果的数据类型始终为Bool。2)字符串的比较基于ASCⅡ字符集,使用变量长度和每个ASCⅡ字符的数值进行比较。大多数S7-SCL运算由两个地址组成,称为二元操作,例如“A+B”。在SCL的赋值运算中不能使用Pointer数据类型。

SCL基础知识介绍

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 运算符及其优先级

978-7-111-58719-4-Chapter05-85.jpg

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元素*)

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈