OPN DB 1 //打开DB1 块 假设IN0=3200 IN1=3249
L #IN0 //装载 IN0=3200的内容 ,到ACC1中 (ACC1=3200)
ITD //转化成双整,存入ACC1 =3200
SLD 3 //acc1 中的内容*8= 25600
LAR1 // AR1= 25600
L #IN1 // ACC1= 3249
L #IN0 // ACC1=3200 ACC2=3249
-I // ACC2-ACC1=49 ----------ACC1=49
L 1 // ACC1=1 ACC2=49
+I // acc1= 50
M001: T #TEMP2 // temp2= 50
L B#16#0 // acc1= B#16#0
T DBB [AR1,P#0.0] //将 DB1.DBB[25600]=0 ???????
L P#1.0 //ACC1=1000
+AR1 //AR1=1000
L #TEMP2 //ACC1=50
LOOP M001 //循环50次 jump to the NEXT jump label if ACCU 1-L > 0.
BE
问题补充:
本程序作为一个程序块被另外的程序块调用,没看明白执行的实际意义:
最佳答案
假设IN0=3200 IN1=3249,都是十进制数。程序是将DB1的第3200字节至第3249字节,共50个字节中的内容清零。
1、OPN DB 1 //打开DB1 块 假设IN0=3200 IN1=3249
L #IN0 //装载 IN0=3200的内容 ,到ACC1中 (ACC1=0C80十六进制)
ITD //转化成双整,存入ACC1 =0000 0C80十六进制
SLD 3 //acc1 中的内容左移3位形成32位6400(十六进制)。
LAR1 // 装入指针,安装指针格式,那么AR1= #P3200.0
上述程序将IN0=0C80,左移3位,意义是形成32位地址指针 #P00003200.0。32位地址指针格式为:
0000 0000 0000 0BBB BBBB BBBB BBBB BXXX
其0-2bit,指定bit位,3-18bit指定byte字节。其第31bit固定为0。就意味着AR的取值只能是:0.0 ——65535.7。
0C80左移3位为:
0000 0000 0000 0000 0110 0100 0000 0000 (十六进制的0000 6400),按上述格式,再换算为十进制指针为#P3200.0。
2、 L #IN1 // ACC1= 3249
L #IN0 // ACC1=3200 ACC2=3249
-I // ACC2-ACC1=49 ----------ACC1=49
L 1 // ACC1=1 ACC2=49
+I // acc1= 50
上述程序是计算循环的计算器,即要清零操作的字节数。
3、M001: T #TEMP2 // 保存计数器至temp2中
L B#16#0 // acc1= B#16#0
T DBB [AR1,P#0.0] //将常数0存入按地址指针寻址的DB字节中。
L P#1.0 //
+AR1 //指针加1.0,即指针指向下一字节。
L #TEMP2 //取计算器
LOOP M001 ///循环计数值如为0则结束循环;如不为0减1后则转向标号为M001的语句,继续循环。
BE //如循环计数值如为0则结束循环。
4、建议楼主看看下述资料,才能真正清楚指针寻址及循环语句,否则再见指针寻址还是不明白:
、《关于S7-300和S7-400指针寻址的说明与例程(更新版)(2008.03.04) 》下载:
http://www.ad.siemens.com.cn/download/searchResult.aspx?searchText=F0215
、《step7编程之地址概念详解》连接:
http://wenku.baidu.com/view/b2b4d3375a8102d276a22fd3.html
或
http://www.chinakong.com/rencai/disp.asp?id=1633&leibie=4
、《西门子STL间接寻址常问问题集》
http://www.ad.siemens.com.cn/download/docMessage.aspx?
ID=6175&loginID=&srno=&sendtime=
提问者对于答案的评价:
明白了,分析的很好,多谢
原创文章,作者:more0621,如若转载,请注明出处:https://www.zhaoplc.com/plc208704.html