[西门子] 西门子SCL基础教学---for...to...do

[复制链接]
查看71757 | 回复0 | 2024-3-11 17:22:43 | 显示全部楼层 |阅读模式
上期,我们讲解了case...of,这期我们讲解下for...to...do语句。

关于for...to...do语句的解释:

for循环是可以指定循环次数的一个循环,在使用时,首先需要定义一个整型的循环计数变量(博途更新V16之后,支持了无符号的整型数据类型),然后指定它的循环范围,for循环会根据你的语句自动递增或者递减这个循环计数变量,直到循环次数超出你的循环范围然后结束循环。循环计数变量可以是全局的,也可以是临时或者静态的
举例:

定义一个temp=i=int

定义一个output=DATA=ARRAY[0..4] OF INT

FOR #i := 0 TO 4 DO

          #DATA := i + 1;

END_FOR;

这是一个最基本的for循环程序,就是给DATA数组里面赋值的。for循环在执行前首先将i初始化为起始值0,然后以1个单位递增,直到i=4。该循环体内语句一共被执行了5次。

根据解释,上面这段程序最终的结果就是

DATA[0]:=1

DATA[1]:=2

DATA[2]:=3

DATA[3]:=4
DATA[4]:=5
那有人要问了,我不想一步一步,我想两步两步走。也可以

举例:

定义一个temp=i=int

定义一个output=DATA=ARRAY[0..5] OF INT

FOR #i:= 0 TO 5 BY 2 DO

         #DATA := i + 5;

END_FOR;

这时候你可以看出,这比上面一句多了个BY,BY后面跟着的就是循环步,你可以省略掉,如果省略掉,默认是一步。如果你写了BY 2,那么它就是两步。最终的data里面的数据就会是

DATA[0]=5

DATA[2]=7

DATA[4]=9
当然了,你也可以加的更多,比如BY 10等等。这里仅是举例。
那么,既然有了递增,那有没有递减呢。答案是有的。

举例:

定义一个temp=i=int

定义一个output=DATA=ARRAY[0..5] OF INT

FOR #i:= 5 TO 0 BY -1 DO

         #DATA := i - 5;

END_FOR;

实现递减,我们只需要将BY后面的循环步修改成负数,那么这时候i的起始值就是5,这个循环计数器将从5递减到0。这时候上面这段程序的结果就是

DATA[0]=-5

DATA[1]=-4

DATA[2]=-3

DATA[3]=-2

DATA[4]=-1
DATA[5]=0
那么居然有循环了,假如说,我在循环体中,不想要某一个循环,可不可以呢。也是可以的。假设:我不想要第四次循环。

举例:

定义一个temp=i=int

定义一个output=DATA=ARRAY[0..4] OF INT

FOR #i := 0 TO 4 DO

           IF I = 3

               THEN

               CONTINUE;

           END_IF;

          #DATA := i + 1;

END_FOR;

CONTINUE关键字的意思就是跳过本次循环,也就是说当循环计数器i=3的时候,跳过这个循环,那么这段程序的结果就是

DATA[0]:=1

DATA[1]:=2

DATA[2]:=3

DATA[3]:=上一次的值
DATA[4]:=5那有没有退出整个循环这个关键字呢。也是有的。假设:我有一个数组,我需要根据我输入的数值对这个数组里面的数值做比较,当比较到我需要的数据之后,我需要知道这个数据在这个数组的位置。举例:
定义一个input=number=int

定义一个temp=i=int

定义一个output=site=int

定义一个output=DATA=ARRAY[1..100] OF INT(DATA[1]=1,DATA[2]=2,以此类推,DATA[100]=100)

FOR #i := 1 TO 100 DO

           IF DATA = number

               THEN

               site:=i;

               EXIT;

           END_IF;

END_FOR;
根据我们输入的number的数值进行比较。如果比较不成功,site输出的值为上一次的值。如果比较成功,则输出这个数据在哪个位置。比如我们对number输入35,那么当他比较到35的时候,site会输出一个35,表示数据在第35的位置。那有人会有疑问,为什么i没有循环到100。因为,我们有条件去判断了,当data的数值等于number输入的数值的时候,我们执行了exit关键字这个语句,exit,退出整个循环,也就是for循环遇到exit关键字的时候,就退出整个循环。哪怕只循环了一次就遇到,后面没循环的次数都将不会继续循环下去。
for循环的到此就结束了,本来想把另外两个放一起讲的,后来想想,那两个和for有区别,就不放一起了。

for循环的注意事项:


    循环计数器不能循环到没有这个数值的地方去。比如for i:= 0 TO 9 DO,然后你的数组给的是DATA=ARRAY[0..8] OF INT,如果这样的话,那么在第九次循环的时候,PLC里面是没有这个数据的,PLC就会报错。诊断缓冲区会有一个FB(C)xx的区域长度错误。这就是因为你循环到了PLC不存在的数据上去了。因为程序编译的时候不会编译出这个错误,所以要自己避免。

    BY后面必须要跟一个不为0的数值,当然,你写了0之后,系统会提示你:值为0时,该表达式会导致死循环。

您需要登录后才可以回帖 登录 | 注册哦

本版积分规则