初次用S7-300,梯形图还勉强可以调试,有段程序要用循环指令比较DB块内4个变量的大小,同时把最大值取出来,把索引号以出来,我编了一段程序,调试老是出错,请大虾们指导,不甚感谢!
问题补充:
我是想MW102为索引,做一个4次的循环,比较DB1.DBW0、DB1.DBW2、DB1.DBW4、DB1.DBW6里边的四个INT形值,最后把最大值取出来,把当前的索引号也放到DB1.DBW12中。现在提示写入时发生对齐错误,读取时发生对齐错误,我不明白错误出在哪,请高手指点
图片说明:
最佳答案
首先有个明显的错误,
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