火热求助!! 点击:540 | 回复:8



businiao567

    
  • 精华:0帖
  • 求助:1帖
  • 帖子:9帖 | 10回
  • 年度积分:0
  • 历史总积分:552
  • 注册:2002年12月08日
发表于:2007-09-05 12:15:00
楼主
小弟写了一段程序,用STL。在仿真的时候,一进入循环,PLC就停止,报SF灯就亮!请大家帮我诊断一下,谢谢。
    主要功能是:将DB2中的每个字,每次自加1。
    程序如下:
//DB地址初始化
      L     L#0
      T     MD   120
// 打开DB,读取DB长度
     OPN   DB     2
      L     DBLG
      T     MD   124
//更新DB中的数据,每次自加“1”
j1:   L     DBW [MD 120]
      L     1
      +D    
      T     DBW [MD 120]
//地址加“2”
     L     MD   120
      L     2
      +D    
      T     MD   120
//比较地址是不是到达最大值
     L     MD   120
      L     MD   124
      <D  
      JC    j1
      BE



liu xianghou

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 195回
  • 年度积分:0
  • 历史总积分:179
  • 注册:2007年8月17日
发表于:2007-09-05 15:27:00
1楼
指令L DBLG取的是数据块的长度(BYTE)数,MD120每次加2,执行到一半的时候已经超出DB的范围了。改成
OPN   DB     2
      L     DBLG
      L 2    //*
      /D     //*
      T     MD   124
就可以了
我觉得这样写更好一点
    LAR1 P#DBX0.0
    OPN DB2
    L DBLG
    L 2
    /I
LOP1:L W[AR1,P#0.0]
    + 1
    T W[AR1,P#0.0]
    +AR1 P#2.0
    POP
    LOOP LOP1

businiao567

  • 精华:0帖
  • 求助:1帖
  • 帖子:9帖 | 10回
  • 年度积分:0
  • 历史总积分:552
  • 注册:2002年12月08日
发表于:2007-09-05 16:45:00
2楼
先谢谢,liu xianghou同志。
你写的程序比我要简单得多了,用寄存器寻址也更直观。

第一句话我没理解,为什么执行到一半的时候,就已经超出DB的范围了。这个“一半”是指什么的一半?我是按“字”来累加地址的,循环次数为DB块长度的一半。

liu xianghou

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 195回
  • 年度积分:0
  • 历史总积分:179
  • 注册:2007年8月17日
发表于:2007-09-06 08:49:00
3楼
我也看错了,间接寻址时要用指针,MD120里要是指针而不是长整数.改成
//DB地址初始化
      L     P#0.0
      T     MD   120
// 打开DB,读取DB长度
     OPN   DB     2
      L     DBLG
      T     MD   124
//更新DB中的数据,每次自加“1”
j1:   L     DBW [MD 120]
      L     1
      +D    
      T     DBW [MD 120]
//地址加“2”
     L     MD   120
      L     P#2.0
      +D    
      T     MD   120
//比较地址是不是到达最大值
     L     MD   120
      SRD 3
      L     MD   124
      <D  
      JC    j1
      BE
这样就可以了

businiao567

  • 精华:0帖
  • 求助:1帖
  • 帖子:9帖 | 10回
  • 年度积分:0
  • 历史总积分:552
  • 注册:2002年12月08日
发表于:2007-09-06 22:20:00
4楼
看了置顶的那篇“step7编程之地址概念详解 ”,基本上对指针寻址也有了了解。
间接寻址有两种:寄存器间接寻址和存储器间接寻址。您用的这种是寄存器间接寻址,我的正文中用的存储器间接寻址。这两种方式在我的程序里都是可以用的,不过有两处区别:
1.指针初始化
    寄存器间接寻址
      L     P#0.0
      T     MD   120
    存储器间接寻址
      L     L#0
      T     MD   120
2.地址累加
    寄存器间接寻址
      L     MD   120
      L     P#2.0
      +D    
      T     MD   120

    存储器间接寻址
      L     MD   120
      L     32
      +D    
      T     MD   120
正所谓讨论出真知
再次谢谢liu xianghou同志,以及您的程序。
希望各位也能把典型性的问题拿出来,大家来一起进步!谢谢

liu xianghou

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 195回
  • 年度积分:0
  • 历史总积分:179
  • 注册:2007年8月17日
发表于:2007-09-07 09:10:00
5楼
好像不全是吧
存存储器间接寻址分单字指针和双字指针的,如果单字指针用的是整数,可以用在T、C、DB号等,但是DBW[MDXX]的指针就是双字指针了。
把下面传送的数字换成2进制你就可以看出来只是格式不同,但在PLC里表示的内容却是相同的
1.指针初始化
    寄存器间接寻址
      L    P#0.0 //2#0000_0000_0000_0000_0000_0000_0000_0000
      T     MD   120
    存储器间接寻址
      L     L#0  //2#0000_0000_0000_0000_0000_0000_0000_0000
      T     MD   120
2.地址累加
    寄存器间接寻址
      L     MD   120
     L    P#2.0 //2#0000_0000_0000_0000_0000_0000_0001_0000
      +D    
      T     MD   120

    存储器间接寻址
      L     MD   120
      L     32 //2#0000_0000_0000_0000_0000_0000_0010_0000
这个应该是16,你的DBW地址才是以2递增的,不信你可以试试
      +D    
      T     MD   120

所以虽然你赋的值形式上不同,但是内容却是完全相同的,而且都会被当做指针的格式使用.寄存器和存储器间接寻址区别只是指针存放的位置不同而已.寄存器只能用PLC的两个地址寄存器,而存储器指针则可以放在M、L、DB区内

一只孤雁

  • 精华:0帖
  • 求助:0帖
  • 帖子:48帖 | 389回
  • 年度积分:0
  • 历史总积分:772
  • 注册:2006年4月27日
发表于:2007-09-07 11:36:00
6楼
不错啊!强啊!我还是看不懂,现在就是不知道怎么去学习这样的字节传送!真希望楼主和楼上的多多指教!
我的电子邮件是:hu_shenghua263@sina.com.cn
谢谢你们的赐教!

一只孤雁

  • 精华:0帖
  • 求助:0帖
  • 帖子:48帖 | 389回
  • 年度积分:0
  • 历史总积分:772
  • 注册:2006年4月27日
发表于:2007-09-07 11:37:00
7楼
还有,麻烦楼主告诉我,那个地方可以下载方针软件啊!我找了好多的地方都找不到啊!在官方网站上也找不到!谢谢了!

businiao567

  • 精华:0帖
  • 求助:1帖
  • 帖子:9帖 | 10回
  • 年度积分:0
  • 历史总积分:552
  • 注册:2002年12月08日
发表于:2007-09-07 12:40:00
8楼
To 一只孤雁:阅读一下"step7编程之地址概念详解"这篇文章,对指针讲的非常详细。你说的“方针”软件,是不是“仿真”软件阿,这个在Step7里有集成阿!

热门招聘
相关主题

官方公众号

智造工程师