1.我写了利用寄存器间接寻址来得到一个背景数据块的数据源,这个背景数据块号可以自己设定,但是为什么 A DBX [AR1,P#68.2] O DBX [AR1,P#68.3] 这两个地址读出来是0,0,用直接地址 A DBX 68.2 O DBX 68.3读出来是1,1,实际上也是1,1;这是为什么?请看截图1和2,非常感谢!
2.下面我想用循环加右移位检测最右边是否为1来计算内存 #_ZS_CAL1中为1的个数,请问为什么这段程序不行,还变成了死循环?非常感谢!
//#_ZS_CAL1
L 0
T #_ZS_CAL1
L #_ZS_Status1
AW W#16#1
L 1
==I
JC P1
P3: L 3
P100: T MB 5
SRW 1
L #_ZS_Status1
AW W#16#1
L 1
==I
JC P1
P2: L MB 5
L 0
==I
JC P101
TAK
LOOP P100
P1: L #_ZS_CAL1
L 1
+I
T #_ZS_CAL1
L 3
L MB 5
==I
JC P3
JU P2
P101: NOP 0
图片说明:
最佳答案
1、 A DBX [AR1,P#68.2] O DBX [AR1,P#68.3] 这两个地址读出来是0,0,用直接地址 A DBX 68.2 O DBX 68.3读出来是1,1,实际上也是1,1;这是为什么?
你的指令用错了,应该为:
L P#0.0 //初始读指针
LAR1 //将 P#0.0装入AR1中
不应使用TAR1,TAR1是将AR1中的内容送至累加器1中。从你截图中即可看出AR1中的内容始终为6.0,以至于指针寻址的数据不是你所要的。
2、关于循环的问题,不能完全理解你的意图,肯定给不出满意的答案。倒不如,请你看看下述的典型的循环语句编程,从中理解其中的指针及循环指令的典型用法。我相信你读后,你自己就能够解决你自己的问题了:
、典型的循环语句编程例程:
例: 需将PIW128- PIW147,共20个字送入DB10中的 DW0,DW1,.......,DW19中:
在OB1:
OPN DB 10 //打开DB 10
L P#128.0 //初始读指针
LAR1
L P#0.0 //初始写指针
LAR2
L 20 // 20个字的循环计数为初值
M001: T MB 10 //计数值 送入MB 10
L PIW [AR1,P#0.0] //按读指针指示的地址读数据
T DBW [AR2,P#0.0] //按写指针指示的地址写数据
+AR1 P#2.0 //读指针指向下一数据地址
+AR2 P#2.0 //写指针指向下一数据地址
L MB 10 //取循环计数值
LOOP M001 //循环计数值如为0则结束循环;如不为0,则减1后转向标号为M001的语句,继续循环。
提问者对于答案的评价:
阿鸣大师多谢!!!,很多都是自己太粗心了,万分感谢!
最佳答案作者回复:
回答自控达人的问题: 请问为什么会是6.0呢? 由于编程者用错指令,使得程序中的ARI中的内容始终没有改变,始终保持着原内容,即6.0!提问者给出的程序只是一部分,执行到本程序时ARI中的内容就是6.0了。
原创文章,作者:more0621,如若转载,请注明出处:https://www.zhaoplc.com/plc289307.html