程序分析总觉得不太对,请高手指教。

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

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2017年11月6日 下午7:03
下一篇 2017年11月6日 下午7:03

相关推荐