蹊跷的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循环 仿真
------在你的这段程序里,循环程序是在不断的运行的,所以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循环 仿真
--------比如在循环期间,能否设置 S_ODT指令。
蹊跷的LOOP循环 仿真
--------尽管你的语法上没有问题,但LOOP循环最大次数65535(FFFF)次,循环不了999999999次,建议楼主再温习一下LOOP指令。 -------楼上已经说了。 整数1~65535;字W#16#0001~W#16#FFFF
|