初次用S7-300,梯形图还勉强可以调试,有段程序要用循环指令比较DB块内4个变量的大小,同时把最大值取出来,把索引号以出来,我编了一段程序,调试老是出错,请大虾们指导,不甚感谢!
问题补充:
我是想MW102为索引,做一个4次的循环,比较DB1.DBW0、DB1.DBW2、DB1.DBW4、DB1.DBW6里边的四个INT形值,最后把最大值取出来,把当前的索引号也放到DB1.DBW12中。现在提示写入时发生对齐错误,读取时发生对齐错误,我不明白错误出在哪,请高手指点
图片说明:
8b7b476696FC6641e9203968409c5d5c
最佳答案
首先有个明显的错误,
L2
TMD50
MD50作为存放指针的存储区,你这样的编是不对的;
L2
SLD3
TMD50
我写的程序,供参考:数据存在mw400开始的7个字里,用SFC20拷贝到DB1开始的7个字里,怎么做的目的是在比较的过程中,数值会被改变,所以增加了一道;
CALL"BLKMOV"
SRCBLK:=P#M400.0BYTE14
RET_VAL:=MW440
DSTBLK:=P#DB1.DBX0.0BYTE14
OPNDB1
LAR1P#0.0
L6
_001:TMW200
LDBW[AR1,P#0.0]
LDBW[AR1,P#2.0]
<I
JCN_002
TAK
TDBW[AR1,P#2.0]
_002:+AR1P#2.0
LDBW[AR1,P#0.0]
TMW300
LMW200
LOOP_001
提问者对于答案的评价:
你这种方法也可以的,但我原来的算法是用一个中间变量MW100来取每次循环的较大值,再拿这个较大值去跟下一个被比较值比较,再取较大值,最后把这四个值中最大的取出来,所以不会把原来用来比较的四个值改变,不用块拷贝功能。不过十分感谢您的指点。你上面用到的SLD3我在看资料时就看到了,对这块一直有疑惑,所以没敢加这段。现在也没搞明白为什么要左移三位。如果方便麻烦你展开来讲一下。谢谢。我马上在你的基础上把程序改一下试试。
最佳答案作者回复:
再给一个程序吧,最大数在MW520里
OPNDB2
LAR1P#0.0
LAR2P#2.0
L6
_001:TMW500
LDBW[AR1,P#0.0]
LDBW[AR2,P#0.0]
>I
JC_002
CAR
TAR1AR2
_002:+AR2P#2.0
LMW500
LOOP