请高手帮我分析下,下面的程序哪里有问题?

程序如下,仿真的时候,运行了大概2秒钟CPU就STOP了。就运行了这一段程序,没有其他的。 

  OPN   DB    20
      L     P#DBX 0.0
      T     MD   100
      L     6
next: T     MW     0
      LAR1  MD   100
      L     MD   100
      L     P#4.0
      +D    
      LAR2  
      A(    
      L     D [AR1,P#0.0]
      L     D [AR2,P#0.0]
      <D    
      )     
      JCN   _000
      TAR1  
      T     MD   100
      JU    _002

_002: L     MW     0
      LOOP  next
      LAR1  MD   100
      L     D [AR1,P#0.0]
      T     MD   104
_000: TAR2  
      T     MD   100
      JU    _002

另外,我想问一下,跳转标号后面相当于是一段子程序,平时是不执行的。但是,判断有两个结果,判断结果为真,我想执行一个标号后面的程序,判断结果为假,我也要执行另一个标号后面的程序。但是关键的是,判断完了之后我还要继续执行其他的,但是又不能写在标号程序与跳转的地方。一般,除了LOOP外 标号程序是不是放在程序段的最后啊,为什么?
就是如上面的代码所示,我的_002是想放在那个判断之后要一直执行的,但是判断的地方又要用跳转,不知道该怎么写,才能互不影响。

最佳答案

程序写的太复杂了,我看你这段程序的目的就是找出DB20.DBD0~DBD20这连续6个双字的最小值,但是你犯了3个严重错误:
1.你的_002放在了循环外面且循环结束后并没有跳过_002,导致你的循环结束后又通过_002跳回到循环中造成死循环,这是导致当机的根本因素。
2.你的程序得不到正确结果,因为你的指针是MD100,每次循环MD100都应该增加p#4.0的,但是由于你的跳转结果不确定,导致你的指针MD100有可能保持不变或者是增加了p#4.0(如果是TAR1就没有变,如果是TAR2就增加了),这样的话可能循环结束,你也就比较了DB20.DBD0和DB20.DBD4,根本无法比较所有数值。
3.你每次比较完只是保存了指针,并没有保存数值,这样就算指针是每次都增加了p#4.0,但是你的MD104中得到的也就是最后一次比较的最小值而已。
如果的确是需要得到最小值,可以按下面程序来做:
   OPN   DB    20
      LAR1  P#DBX 0.0
      L     D [AR1,P#0.0]
      T     MD   104

      L     5
next: T     MW     0

      L     D [AR1,P#4.0]
      L     MD   104
      <D    
      JCN   _000

      L     D [AR1,P#4.0]
      T     MD   104

_000: +AR1  P#4.0
      L     MW     0
      LOOP  next

提问者对于答案的评价:
谢谢,看来你的STL语言用的很好啊,像你学习,我也正在学习STL中!加油!!!

最佳答案作者回复:
慢慢来,建议你学习使用仿真程序PLCSIM,直接在电脑上测试程序,这样就方便多了。

原创文章,作者:more0621,如若转载,请注明出处:https://www.zhaoplc.com/plc238297.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2018年12月1日 下午5:51
下一篇 2018年12月1日 下午5:51

相关推荐