QQ登录

只需一步,快速开始

蹊跷的LOOP循环 仿真

[ 复制链接 ]
蹊跷的LOOP循环 仿真

和大家探讨一个问题,也是求助了!

我学习仿真LOOP指令的时候,遇到很蹊跷的问题,如截图所示。

LOOP不出来。

朋友们能看出来问题吗??

如果我一直调这段程序,LOOP看起来是没完没了的,MD200不停的往上加,超过999999999了有还不停下来。MD100只能从999999999变为999948289,就不再往下减;

如果我是用一个上升沿调这一段程序,第一次上升沿,MD100瞬间从999999999变成999948289,MD200瞬间就加到 51711,然后停住了。给第二个上升沿,MD100不动,MD200再加51711(即103422),第三次第四次一样的规律。

有个共同点是,循环丝毫不受M50.1和M3.3的影响,无论他们状态。 这两个位只有一个影响:如果他们不置位,无论循环进展如何,M50.0永远不会被置位; 如果他们被置位,M50.0在循环开始瞬间也就被置位了(瞬间置位,因为扫描速度太快了)。 还有,MD100我如果不设那么大,循环一进行,它就会一直等于1(肉眼看起来)。


把MD100改为其他值,还会出现不一样的循环次数。 不知道这些特殊数字,是怎么来的。

(比如MD100改为555555的时候,触发一次循环,它会减到524289就不动了,MD200会等于31267)


欢迎朋友们探讨,解释。最好也一起仿真下这段程序。看看怎么说的通。



蹊跷的LOOP循环 仿真

蹊跷的LOOP循环 仿真


------在你的这段程序里,循环程序是在不断的运行的,所以MD200会一直增加;而且你的循环次数也实在是太多了。

      L   0

      T   MW100

      L   10

A001:T  MW200

      L    MW100

      + 1

      T    MW100

      L    MW200

      LOOP  A001

      L  MW100

      T  MW102     //模拟看看是否这个数值为10


-------把你的程序仿真了一下。

我大概明白了两条要点:

1/ 我之前少了初始化,导致加法无止境的一直往上加。(这也说明 循环的确是一直在进行的)

2/ 你最后那个MW102还是为1(而不是0),说明LOOP指令它是把循环次数-1,大于0的话继续循环。=0的时候就结束循环,所以MW102=1。不可能等于0.如果等于0,就会一直无止境的往负的循环到CPU报错。


还有一个疑问,大家说的LOOP指令 在一个扫描周期内 是执行一次完整的扫描(就是扫描次数从初始值减到1),然后才执行后面的程序, 那是不是意味着,LOOP是不是不适合用于这种场合:MW100每个小时加1.(我知道这个功能 可以通过其他写法实现) ? 因为如果Loop到中间,等1个小时,才让它跳转,那其他程序都没法工作了,CPU估计也会报错。


我现在还无法实现,对LOOP内的程序进行干涉,比如让它等待指定时间之后,再跳转。

蹊跷的LOOP循环 仿真

蹊跷的LOOP循环 仿真

--------比如在循环期间,能否设置 S_ODT指令。

蹊跷的LOOP循环 仿真

蹊跷的LOOP循环 仿真


--------尽管你的语法上没有问题,但LOOP循环最大次数65535(FFFF)次,循环不了999999999次,建议楼主再温习一下LOOP指令。

-------楼上已经说了。

整数1~65535;字W#16#0001~W#16#FFFF




回复

使用道具 举报

快速回复 返回列表 客服中心 搜索