变量指针程序如何理解?

A     #glass_id_auto              //手动=1
// A     "横向打开到位"
// A     "纵向打开到位1"
// A     "纵向打开到位2"
// A     "玻璃到位检测(顶柱)"
      JC    nt31
      NOP   0

      O     "cnt_read_ok"               //编码器数据稳定,可以开始检测
//    O     "T 允许玻璃识别延时"
//    O     "M 3工位自动涂胶准备好"
      A     "对工工位支撑柱玻璃在位"

      JCN   nt6

      SET   
      R     #start_timer


      L     0
      T     #loop_cnt
nxt3: NOP   0

      OPN   DB [#ProductDBTmp]
      L     #loop_cnt
      L     34
      *I    
      SLW   3
      LAR1  
      L     DBD [AR1,P#20.0]
      L     DBW [AR1,P#28.0]
      +D    
      T     #cnt2_cmp_up

      L     DBD [AR1,P#20.0]
      L     DBW [AR1,P#28.0]
      -D    
      T     #cnt2_cmp_down

      L     DBD [AR1,P#24.0]
      L     DBW [AR1,P#28.0]
      +D    
      T     #cnt1_cmp_up

      L     DBD [AR1,P#24.0]
      L     DBW [AR1,P#28.0]
      -D    
      T     #cnt1_cmp_down

      A(    
      L     #cntv2_act
//  L     "TP_cntv2_save"
      L     #cnt2_cmp_down
      >=D   
      )     
      A(    
      L     #cntv2_act
//   L     "TP_cntv2_save"
      L     #cnt2_cmp_up
      <=D   
      )     
      A(    
      L     #cntv1_act
//  L     "TP_cntv1_save"
      L     #cnt1_cmp_down
      >=D   
      )     
      A(    
      L     #cntv1_act
// L     "TP_cntv1_save"
      L     #cnt1_cmp_up
      <=D   
      )     
      JCN   nt30
      L     #loop_cnt
      L     1
      +I    
      OPN   DB [#AssignDBTmp]
      T     DBB   13
      L     DB32.DBB   13
      T     #glass_type

      JU    nt3
nt30: L     #loop_cnt
      L     1
      +I    
      T     #loop_cnt
      L     16
      <I    
      JC    nxt3

      L     0
      T     #glass_type
      T     DBB   13
      S     "对中工位玻璃判别失败"

      R     "对中工位玻璃判别完成"

      JU    nt6
//由于和客户沟通后决定,不需要做在自动情况下的自动取消涂胶工艺,故取消下列功能
//   OPN   DB [#AssignDBTmp]
//   A     DBX    8.2                  //取消涂胶?
//  JCN   n301                        //否
//   L     100                         //是,将取消涂胶编号100发给机器人,任务100为空操作,只
//  T     #glass_type
//  T     DBB   13

//n301: NOP   0                           //强制涂胶,等待转换到涂胶手动选择
// L     0
//  T     #glass_type
// T     DBB   13
//  JU    nt6

//nt31: NOP   0
nt31: NOP   0                           //手动选择玻璃型号
      OPN   DB [#AssignDBTmp]
      A     DBX   23.4
      A     "对中横向对中汽缸原位"

      A     "对中纵向对中1汽缸原位"

      A     "对中纵向对中2汽缸原位"

      A     "对中吸盘升降汽缸1上升位"

      A     "对中吸盘升降汽缸2上升位"

      A     "对中工位真空吸附完成"

      JCN   nt3
      L     DBB   12
      T     #glass_type
      T     DBB   13
nt3:  NOP   0
      S     "对中工位玻璃判别完成"

      R     "对中工位玻璃判别失败"

nt6:  NOP   0

这个语句表从nxt3开始的程序不知道如何理解,什么左移三位,变量指针加AR1,麻烦高手指点下该语句表如何理解。不甚感激。

最佳答案

这个语句表从nxt3开始的程序不知道如何理解,什么左移三位,变量指针加AR1,麻烦高手指点下该语句表如何理解?
1、首先了解双字指针:
当使用在区域内寄存器间接寻址中时,我们知道这时的AR中的内容只是指明数值单元,因此,区域内寄存器间接寻址时,寄存器中的内容等同于上帖中提及的存储器间接寻址中的双字指针,也就是:  
  其0-2bit,指定bit位,3-18bit指定byte字节。其第31bit固定为0。  
  AR:  
  0000 0000 0000 0BBB BBBB BBBB BBBB B*  
  例如:当AR=D4(hex)=0000 0000 0000 0000 0000 0000 1101 0100(b),实际上就是等于26.4。 
2、为什么左移三位?
据上述双字指针的格式,将一个32位整形数据转为双字指针,即字节指针,将这个个32位整形数据左移3位(即乘8)就是字节指针。例如:
   L #L100  //装入32为整形数据100
   SLD 3   //左移3位(即乘8)
   T  LD0  //LD0得到P#100.0的指针常数。
3、楼主的程序:
nxt3: NOP   0
      OPN   DB [#ProductDBTmp]  //打开用#ProductDBTmp表示数据块号之DB。
      L     #loop_cnt
      L     34
      *I        
      SLW   3  // #loop_cntch乘以34的结果,再左移3位(即乘8),形成字节指针。
      LAR1    //将上述运算结果装入指针AR1。
      L     DBD [AR1,P#20.0]//取指针AR1加上偏移量20.0为地址的那个DBD中的数据。
      L     DBW [AR1,P#28.0]//取指针AR1加上偏移量28.0为地址的那个DBW中的数据。
      +D    // 将上述两者相加
      T     #cnt2_cmp_up//将上述两者相加存入 #cnt2_cmp_up中。
4、建议楼主系统看看下述两个文档,就全明白了:
、见《关于S7-300和S7-400指针寻址的说明与例程(更新版)(2008.03.04)     》下载:
http://www.ad.siemens.com.cn/download/searchResult.aspx?searchText=F0215
、详见《step7编程之地址概念详解》连接:
http://www.plc365.com/jishu/57.html

提问者对于答案的评价:
谢谢你的回答,很有帮助

原创文章,作者:more0621,如若转载,请注明出处:https://www.zhaoplc.com/plc243956.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2018年12月1日
下一篇 2018年12月1日

相关推荐