用指针寻址循环指令比较DB块内4个变量的大小

初次用S7-300,梯形图还勉强可以调试,有段程序要用循环指令比较DB块内4个变量的大小,同时把最大值取出来,把索引号以出来,我编了一段程序,调试老是出错,请大虾们指导,不甚感谢!

问题补充:
我是想MW102为索引,做一个4次的循环,比较DB1.DBW0、DB1.DBW2、DB1.DBW4、DB1.DBW6里边的四个INT形值,最后把最大值取出来,把当前的索引号也放到DB1.DBW12中。现在提示写入时发生对齐错误,读取时发生对齐错误,我不明白错误出在哪,请高手指点

图片说明:

用指针寻址循环指令比较DB块内4个变量的大小    用指针寻址循环指令比较DB块内4个变量的大小   

最佳答案

首先有个明显的错误,
 L 2
 T  MD50
MD50作为存放指针的存储区,你这样的编是不对的;
L 2
SLD 3
T  MD50
我写的程序,供参考:数据存在mw400开始的7个字里,用SFC20拷贝到DB1开始的7个字里,怎么做的目的是在比较的过程中,数值会被改变,所以增加了一道;
 CALL  "BLKMOV"
       SRCBLK :=P#M 400.0 BYTE 14
       RET_VAL:=MW440
       DSTBLK :=P#DB1.DBX0.0 BYTE 14
      OPN   DB     1
      LAR1  P#0.0
      L     6
_001: T     MW   200
      L     DBW [AR1,P#0.0]
      L     DBW [AR1,P#2.0]
      <I    
      JCN   _002
      TAK   
      T     DBW [AR1,P#2.0]
_002: +AR1  P#2.0
      L     DBW [AR1,P#0.0]
      T     MW   300
      L     MW   200
      LOOP  _001

提问者对于答案的评价:
你这种方法也可以的,但我原来的算法是用一个中间变量MW100来取每次循环的较大值,再拿这个较大值去跟下一个被比较值比较,再取较大值,最后把这四个值中最大的取出来,所以不会把原来用来比较的四个值改变,不用块拷贝功能。不过十分感谢您的指点。你上面用到的SLD3我在看资料时就看到了,对这块一直有疑惑,所以没敢加这段。现在也没搞明白为什么要左移三位。如果方便麻烦你展开来讲一下。谢谢。我马上在你的基础上把程序改一下试试。

最佳答案作者回复:
再给一个程序吧,最大数在MW520里
  OPN   DB     2
      LAR1  P#0.0
      LAR2  P#2.0
      L     6
_001: T     MW   500
      L     DBW [AR1,P#0.0]
      L     DBW [AR2,P#0.0]
      >I    
      JC    _002
      CAR   
      TAR1  AR2
_002: +AR2  P#2.0
      L     MW   500
      LOOP 

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

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

相关推荐