首页 理论教育 SCL程序控制指令详解

SCL程序控制指令详解

时间:2023-06-30 理论教育 版权反馈
【摘要】:下面重点介绍打开SCL程序后,“基本指令”窗格的“编程控制操作”文件夹中SCL特有的指令。然后程序从END_IF的下一条指令开始继续执行。图5-43给出了上面的程序的监控结果。此外,CASE指令也可通过使用CASE替换一个指令块来进行嵌套。END_CASE表示CASE指令结束。通过“复查循环条件”指令CONTINUE,可以终止当前连续运行的程序循环。执行该指令期间,不允许更改结束值。在主程序中调用FC1,启动主程序的程序状态监控功能,将“输入值2”的值修改为3。

SCL程序控制指令详解

下面重点介绍打开SCL程序后,“基本指令”窗格的“编程控制操作”文件夹中SCL特有的指令。

在项目“SCL应用”的FC1的接口区生成数据类型为Bool的输入参数“位输入1”和“位输入2”,数据类型为Int的输入参数“输入值1”和“输入值2”,数据类型为Bool的输出参数“位输出1”~“位输出4”,以及数据类型为Int的输出参数“输出值1”“输出值2”。在OB1中调用FC1。生成名为“数据块_1”的DB1,在其中生成数据类型为Array[1..10] of Int的数组1~数组4。

1.IF指令

“条件执行”指令IF根据条件,控制程序流的分支。该条件是结果为布尔值的表达式。可以将逻辑表达式或比较表达式作为条件。

执行IF指令时,将对<条件>指定的表达式进行运算。如果表达式的Bool值为TRUE,则表示满足该条件;如果其值为FALSE,则表示不满足该条件。根据分支的类型,可以对以下形式的指令进行编程。

(1)IF分支

IF<条件>THEN<指令>

END_IF;

如果满足指令中的条件,将执行THEN后面的指令;如果不满足该条件,程序将从END_IF的下一条指令开始继续执行。

(2)IF和ELSE分支

IF<条件>THEN<指令1>

ELSE<指令0>

END_IF;

如果满足指令中的条件,将执行THEN后编写的指令1。如果不满足该条件,则执行ELSE后编写的指令0。然后程序从END_IF的下一条指令开始继续执行。

(3)IF、ELSIF和ELSE分支

IF<条件1>THEN<指令1>

ELSIF<条件2>THEN<指令2>

ELSE<指令0>

END_IF;

如果满足第一个条件(<条件1>),将执行THEN后的指令1。执行该指令后,程序将从END_IF后继续执行。

如果不满足第一个条件,将检查条件2。如果满足条件2,则将执行THEN后的指令2。执行该指令后,程序将从END_IF后继续执行。

如果不满足任何条件,则执行ELSE后的指令0,再执行END_IF后的程序。

在IF指令内可以嵌套任意多个ELSIF和THEN组合。可以选择对ELSE分支进行编程。

下面给出了应用IF指令的例子:

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

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

如果“#位输入1”的值为1,“输出值1”为10;如果“#位输入2”的值为1,“输出值1”为20;如果两个条件的值均为0,“输出值1”为30。图5-43给出了上面的程序的监控结果。

2.CASE指令

“创建多路分支”指令CASE根据数字表达式的值执行多个指令序列中的一个,表达式的值必须为整数。执行该指令时,将表达式的值与多个常数的值进行比较。常数可以是整数(例如5)、整数的范围(例如15..20)或由整数和范围组成的枚举(例如10、11、15..20)。下面是“创建多路分支”指令的语法。

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

如果表达式的值等于常数1的值,将会执行紧跟在该常数后编写的指令1。然后程序将从END_CASE之后继续执行。

如果表达式的值不等于常数1的值,将该值与下一个设定的常数值进行比较,直至比较的值相等为止。如果表达式的值与所有设定的常数值均不相等,将执行ELSE后编写的指令0。ELSE是一个可选的语法部分,可以省略。

此外,CASE指令也可通过使用CASE替换一个指令块来进行嵌套。END_CASE表示CASE指令结束。

启动OB1的程序状态监控,令FC1的输入参数“输入值1”为7,FC1执行CASE指令后,仅“位输出3”为TRUE(见图5-44)。

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

图5-44 FC1中CASE指令的例程

3.FOR指令

使用“在计数循环中执行”指令FOR,程序被重复循环执行,直至运行变量不在指定的取值范围内。程序循环可以嵌套,即在程序循环内,可以编写包含其他运行变量的其他程序循环。

通过“复查循环条件”指令CONTINUE,可以终止当前连续运行的程序循环。通过“立即退出循环”指令EXIT,终止整个循环的执行。

(1)“在按步宽计数循环中执行”指令

下面是指令的语法:

FOR<执行变量>:=<起始值>TO<结束值>BY<增量>DO<指令>

END_FOR;

FOR指令的执行变量、起始值、结束值和增量的数据类型可选有符号整数SInt、Int和DInt,S7-1500还可选LInt。

循环开始时,将起始值赋值给执行变量。每次循环后执行变量都会增加(正增量)或减少(负增量)增量的绝对值。每次运行循环后,将检查执行变量是否已达到结束值。如果未达到结束值,则将执行DO之后编写的指令。如果达到结束值,最后执行一次FOR循环。如果超出结束值,程序将从END_FOR之后继续执行。执行该指令期间,不允许更改结束值。

(2)“在计数循环中执行”指令

下面是指令的语法:

FOR<执行变量>:=<起始值>TO<结束值>DO<指令>

END_FOR;

指令未指定增量,每次循环后执行变量的值加1,即增量为默认值1。

(3)FOR指令应用的例子

在FC1的接口区定义数据类型为Int的临时变量i,生成全局数据块“数据块_1”,去掉它的“优化的块访问”属性。在其中生成数组“数组1”和“数组2”,其数据类型为Array[1..10]ofInt。

FOR#i:=2TO 6 BY 2 DO(www.xing528.com)

"数据块_1".数组2[#i]:=#输入值2*"数据块_1".数组1[#i];

END_FOR;

在各次循环中,#输入值2分别乘以"数据块_1".数组1的下标为2、4、6的元素,并将运算结果分别送给"数据块_1".数组2的下标为2、4、6的元素。

在主程序中调用FC1,启动主程序的程序状态监控功能,将“输入值2”的值修改为3。在项目树的“监控与强制表”文件夹生成监控表_1,在其中生成"数据块_1".数组1的下标为2、4、6的元素。启动监控功能,将1、2、3分别写入"数据块_1".数组1的下标为2、4、6的元素。打开数据块_1,启动监控功能,可以看到由于循环程序的执行,数组2的下标为2、4、6的元素的值分别为3、6和9。

4.WHILE指令

“满足条件时执行”指令WHILE用来重复执行程序循环,直到不满足执行条件为止。

下面是WHILE指令的语法:

WHILE<条件>DO<指令>

END_WHILE;

执行该指令时,将对<条件>指定的逻辑表达式或比较表达式进行运算。如果表达式的布尔值结果为TRUE,则表示条件满足,将执行DO后面的指令;如果结果为FALSE,表示条件不满足,程序将从END_WHILE后继续执行。

下面是应用WHILE指令的例子:

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

只要操作数“#输入值1”和“#输入值2”的值不相等,就会执行DO后面的指令。二者相等时,程序将从END_WHILE后继续执行。

5.REPEAT指令

“不满足条件时执行”指令REPEAT可以重复执行程序循环,直到不满足执行条件为止。

下面是REPEAT指令的语法:

REPEAT<指令>

UNTIL<条件>END_REPEAT

每次执行循环之后,都要对<条件>指定的逻辑表达式或比较表达式进行运算。如果条件的结果为FALSE,则表示条件不满足,将再次执行程序循环。

如果表达式的值为TRUE,则表示条件满足,将跳出程序循环,从END_REPEAT之后继续执行。下面是应用REPEAT指令的例子:

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

只要操作数“#位输入1”的信号状态为“0”,就会反复地将操作数“#输入值2”的值赋值给操作数“#输出值1”。

WHILE指令是先评估条件,条件满足才执行指令。而REPEAT指令是先执行其中的指令,然后才评估条件,因此即使满足终止条件,循环体中的指令也会执行一次。

WHILE和REPEAT指令的循环是在一个扫描循环内完成的。如果在程序中使用WHILE和REPEAT指令,可能导致PLC的扫描循环时间超时,系统异常。

6.CONTINUE指令

“复查循环条件”指令CONTINUE用于结束FOR、WHILE或REPEAT循环的当前程序运行。执行该指令后,将再次计算继续执行程序循环的条件。

下面是应用CONTINUE指令的例子:

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

如果满足条件#i<5,则不执行END_IF后续的指令("数据块_1".数组3[#i]:=5)。FOR指令的执行变量i以增量1递增,然后检查i的当前值是否在设定的取值范围内。如果执行变量在取值范围内,将再次计算IF的条件。

如果不满足条件#i<5,则执行END_IF后续的指令,并开始一次新的循环。在这种情况下,执行变量也会以增量1进行递增并接受检查。

上面的程序的执行结果是"数据块_1".数组3中的元素数组3[5]~数组3[10]被赋值为5。

7.EXIT指令

“立即退出循环”指令EXIT可以随时取消FOR、WHILE或REPEAT循环的执行,而无需考虑是否满足条件。在循环结束(END_FOR、END_WHILE或END_REPEAT)后继续执行程序。下面是应用EXIT指令的例子:

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

如果满足条件#i<5,则取消循环的执行,程序将从END_FOR之后继续执行。

如果不满足条件#i<5,则执行后续的指令("数据块_1".数组4[#i]:=2),并开始一次新的循环。将运行变量#i以2进行递减,并检查该变量的当前值是否在程序中设定的取值范围之内。如果执行变量#i在取值范围内,则将再次计算IF的条件。

上面的程序的执行结果是数组元素数组4[10]、数组4[8]和数组4[6]被赋值为2。

8.GOTO指令

执行“跳转”指令GOTO后,将跳转到指定的跳转标签处,开始继续执行程序。

GOTO指令和它指定的跳转标签必须在同一个块内。在一个块内,跳转标签的名称只能指定一次。多个跳转指令可以跳转到同一个跳转标签处。

不允许从外部跳转到程序循环内,但是允许从循环内跳转到外部。

下面是GOTO(跳转)指令的例子,根据变量“#输入值1”的值,程序将从对应的跳转标签标识点开始继续执行。例如,如果“#输入值1”的值为2,程序将从跳转标签“MyLABEL2”开始继续执行。在这种情况下,将跳过“MyLABEL1”跳转标签所标识的程序行。

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

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

标签“Lab_end:”之后可以更换为其他指令。

启动OB1的程序状态监控,分别令FC1的输入参数“输入值1”为1、2和其他值,可以看到“输出值2”的值分别为10、20和30。

9.RETURN指令

使用“退出块”指令RETURN,可以终止当前被处理的块中的程序执行,返回调用它的块继续执行。如果该指令出现在块结尾处,则被忽略。下面是使用RETURN指令的例子:

IF#错误标志<>0THEN RETURN;

END_IF;

如果Bool操作数“错误标志”的信号状态不为0,则将终止当前处理的代码块中的程序执行。

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

我要反馈