mall9002
级别: 略有小成
精华主题: 0
发帖数量: 136 个
工控威望: 247 点
下载积分: 919 分
在线时间: 181(小时)
注册时间: 2017-11-30
最后登录: 2024-04-24
查看mall9002的 主题 / 回贴
楼主  发表于: 2019-05-08 11:57
怎么感觉FOR循环下,到达表达式成立后后面的,加,转移指令还会执行? 逻辑指令能够停止?这是怎么回事?

FOR  shuzhi1:=0  TO 10  BY 1  DO
     Z1:=Z1+1;
     DMOV(TRUE,k1234,shuzhi2);
     Y21:=M8002;
     IF shuzhi1=10 THEN
         EXIT;
     END_IF;
END_FOR;


shuzhi2 为全局变量 软元件 D1354Z1
shizhi1 全局变量 D1350

shuzhi1到达10后,Z1:=Z1+1; DMOV(TRUE,k1234,shuzhi2); 还会执行;  Y21:=M8002; 不执行 。

而且编译结果看起来也是跳过这些语句的,实在不明白了。使用REPEAT的不存在这样的问题。


129    LDD> D1350 K10
138    CJ P1074

141    LD M8000
142    ADD Z1 K1 Z1
149    LD M8000
150    DMOV K1234 D1354Z1
159    LD M8002
160    OUT Y021
161    LDD<> D1350 K10
170    CJ P1075
173    LD M8000
174    CJ P1074
177    P1075
179    LD M8000
180    DADD K1 D1350 D1350
193    LD M8000
194    CJ P1073
197    P1074
199    LD M8012
200    OUT Y020




mall9002
级别: 略有小成
精华主题: 0
发帖数量: 136 个
工控威望: 247 点
下载积分: 919 分
在线时间: 181(小时)
注册时间: 2017-11-30
最后登录: 2024-04-24
查看mall9002的 主题 / 回贴
1楼  发表于: 2019-05-08 12:16
FOR shuzhi3:=0  TO 10  BY 1  DO
          shuzhi4:=shuzhi4 +1 ;
END_FOR;

shuzhi3 = 11
shuzhi4 = 13420; shuzhi4 = 13420

手册上的例子照抄都是不停止执行。

201    LD M8000
202    MOV K0 D536
207    P1076
209    LD> D536 K10
214    CJ P1077
217    LD M8000
218    ADD D535 K1 D535
225    ADD K1 D536 D536
232    LD M8000
233    CJ P1076
236    P1077
238    P1072
枫落云端
施主,脚抬一下
级别: 略有小成

精华主题: 0
发帖数量: 341 个
工控威望: 465 点
下载积分: 1590 分
在线时间: 408(小时)
注册时间: 2017-10-10
最后登录: 2024-04-24
查看枫落云端的 主题 / 回贴
2楼  发表于: 2019-05-08 14:00
FOR 是一直会执行循环;建议FOR外面加条件IF,等到需要执行FOR的时候执行一次。
至于 “Y21:=M8002; 不执行 ” ,应该是你分析的问题,实际上肯定是一直会执行Y21:=m8002;
M8002只是第一次开机扫描周期会ON,之后都为OFF
mall9002
级别: 略有小成
精华主题: 0
发帖数量: 136 个
工控威望: 247 点
下载积分: 919 分
在线时间: 181(小时)
注册时间: 2017-11-30
最后登录: 2024-04-24
查看mall9002的 主题 / 回贴
3楼  发表于: 2019-05-08 15:16
引用
引用第2楼枫落云端于2019-05-08 14:00发表的  :
FOR 是一直会执行循环;建议FOR外面加条件IF,等到需要执行FOR的时候执行一次。
至于 “Y21:=M8002; 不执行 ” ,应该是你分析的问题,实际上肯定是一直会执行Y21:=m8002;
M8002只是第一次开机扫描周期会ON,之后都为OFF


本来要写 Y21:=M8012 ,手残了。改了以后是都执行。
if加在for外面是可行的,刚又去翻了一下书,FOR的变量初始值在一次执行中是加到到达数,然后停止循环,再次执行到for时再从初始值开始加进入循环,所以看到执行语句是不停执行的。
感谢!
IF shuzhi1<10 THEN
     FOR  shuzhi1:=0  TO 10  BY 1  DO
     bianzhi:=bianzhi+1;
     DMOV(TRUE,k1234,shuzhi2);
     Y21:=M8012;
     END_FOR;
END_IF;
这个是可行的
[ 此帖被mall9002在2019-05-08 15:39重新编辑 ]
1102629597
级别: 探索解密
精华主题: 0
发帖数量: 15 个
工控威望: 105 点
下载积分: 448 分
在线时间: 13(小时)
注册时间: 2016-07-14
最后登录: 2023-02-13
查看1102629597的 主题 / 回贴
4楼  发表于: 2019-05-13 14:55
FOR  shuzhi1:=0  TO 10  BY 1  DO
    
     DMOV(TRUE,k1234,shuzhi2);
     Y21:=M8002;
     IF shuzhi1=10 THEN
         EXIT;
     END_IF;
     Z1:=Z1+1;
END_FOR;