西门子程序如何走出死循环(请高手支招啊) 点击:1790 | 回复:10



阿呆的中国梦

    
  • 精华:0帖
  • 求助:4帖
  • 帖子:12帖 | 220回
  • 年度积分:0
  • 历史总积分:162
  • 注册:2016年9月16日
发表于:2016-09-30 12:03:56
楼主

        本题是网上一道求助题:step7数组的使用,MW0中的数值不停的变化,怎样编程将MW0的值不停的写入一个数组(例如数组A中可以容纳20个值),又怎样编程使数组中只保留MW0最后20次的值。

        解题思路:先在DB1中定义一个二维数组A[1..2,1..10] 20个数据对应dbw1.dbw0至db1.dbw40. 以下程序:当mw0有变化时依次移送到dbw0-dbw40;超出20个数,更换数组前面的数据(相当于先进先出),数组始终保持最近的20个数据,只是最后一个数据不一定在dbw40里面。程序如下:     

      OPN   DB     1

      L     0

      LAR1                              //指针

      T     MW     0

      T     MW     2                    //记录写入数据个数

      T     MW   100                    //赋初值0


a0:   L     MW     0                    //变化的数据

      L     MW   100

      ==I                               //无变化时转b0

      JC    b0



      FP    M     10.0                  //有变化时取个脉冲触发

      =     M     10.1

      A     M     10.1

      L     MW     0                    //不相等即有变化时将此值

      T     DBW [AR1,P#0.0]             //(第一次是写入DB1.DBW0)

      T     MW   100                    //赋给MW100


      A     M     10.1

      +AR1  P#2.0                       //指针加2

      L     MW     2

      L     1

      +I    

      T     MW     2

      L     20                          //只写入20个数据

      <I    

      JC    a0


      A     M     10.1

      L     0                           //写完20个数据记录个数清零

      T     MW     2

      TAR1                              //写完20个数据DBW38后下一个数据回到DBW0

      L     P#40.0

      -D    

      LAR1  

      JU    a0

b0:   NOP   0

(这道题试了好几种办法都不行,主要是等待数据变化时再写入,循环周期要超时,仿真CPU报错;以上程序仿真CPU不报错,但写不进mw0。  请教高手解题办法! 谢谢




无人值班

  • 精华:0帖
  • 求助:0帖
  • 帖子:5帖 | 81回
  • 年度积分:0
  • 历史总积分:438
  • 注册:2014年6月13日
发表于:2016-09-30 14:04:58
1楼

西门子不怎么熟悉 看到楼主又是跳步又是指针的 晕了 楼主才是高手啊

实现方法其实很简单啊 

if MW0不等于M100 then

BLKMOVE MW2 MW4 38个字节

MW2=MW0

MW100=MW0

end if






阿呆的中国梦

  • 精华:0帖
  • 求助:4帖
  • 帖子:12帖 | 220回
  • 年度积分:0
  • 历史总积分:162
  • 注册:2016年9月16日
发表于:2016-09-30 16:01:20
2楼


回复内容:

对: 无人值班 西门子不怎么熟悉 看到楼主又是跳步又是指针的 晕了 楼... 内容的回复!


感谢回复! 我用的是西门子的ST语句,不知道哪儿出错了。您用的是三菱的高级语言编写的吗,西门子好像有SCL语言类似高级语言可惜我没安装选件包也没用过。谢谢,看哪位可以用ST语言帮我修改下程序以实现功能。

无人值班

  • 精华:0帖
  • 求助:0帖
  • 帖子:5帖 | 81回
  • 年度积分:0
  • 历史总积分:438
  • 注册:2014年6月13日
发表于:2016-09-30 16:41:30
3楼


回复内容:

对: 阿呆的中国梦 

我用的是通俗的说法 用梯形图或则ST都行 只是我没有编程软件


撞破烂钟——王者之师

  • 精华:28帖
  • 求助:1帖
  • 帖子:328帖 | 15621回
  • 年度积分:0
  • 历史总积分:78592
  • 注册:2006年7月25日
发表于:2016-10-01 09:16:59
4楼

多使用分布,少使用循环,可以多写几个程序块,使用跳转在程序块间切换,程序块执行完要下一个空指令。

A0的程序块偶看不到空指令语句已实现程序的结束,所以其一直在程序中循环而不能结束。

阿呆的中国梦

  • 精华:0帖
  • 求助:4帖
  • 帖子:12帖 | 220回
  • 年度积分:0
  • 历史总积分:162
  • 注册:2016年9月16日
发表于:2016-10-01 19:28:47
5楼


回复内容:

对: 撞破烂钟——王者之师 多使用分布,少使用循环,可以多写几个程序块,使用跳转在... 内容的回复!


     这道题的难点在于:mw0是动态的(在变量表里面仿真输入),要输入20个数据用循环好像办不到,扫描周期是毫秒单位,用循环CPU要超时报警。(也可能是我方法不对)。今天试了一下不用循环,费了好大力也只能输入一个数据(我想这可能是不用循环的结果)。  有点黔驴技穷了,希望高手们不惜赐教啊!

    

 ...............................................................................

感谢各位关注,问题已经解决了,用的是MD指针;另外想用Adr1地址寄存器没有成功。

fypy

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 163回
  • 年度积分:0
  • 历史总积分:857
  • 注册:2009年6月29日
发表于:2016-10-01 22:03:48
6楼

改变下思路,另外设置一个表头寄存器指示当前最末位置,新存储的从这里开始

无人值班

  • 精华:0帖
  • 求助:0帖
  • 帖子:5帖 | 81回
  • 年度积分:0
  • 历史总积分:438
  • 注册:2014年6月13日
发表于:2016-10-08 12:42:36
7楼


回复内容:

对: 阿呆的中国梦 回复内容:对: 撞破烂钟——王者之师  多使用分布,少... 内容的回复!

楼主 我的方法实现不了吗?挺简单的问题干嘛复杂化?

阿呆的中国梦

  • 精华:0帖
  • 求助:4帖
  • 帖子:12帖 | 220回
  • 年度积分:0
  • 历史总积分:162
  • 注册:2016年9月16日
发表于:2016-10-08 14:31:42
8楼


回复内容:

对: 无人值班 回复内容:对: 阿呆的中国梦  回复内容:对: 撞破烂... 内容的回复!


您好:您说的方法应该是可以的,只是与题目要求有点不同,题目是要求动态的(即随时生产新的数据,随时比较;并不是拿现成的数据做比较);感谢大家的关注,问题已经解决。可以在OB100里先赋初值,在OB1里面写程序,用指针做循环;数据相同(无变化)时跳出循环等待(用nop指令);不相同时赋值,可以用AR1稍麻烦;也可以用双字变量,每次不相同后,循环变量加16#10,再赋值给ar1,只有ar1的地址每次偏移才行。顶楼程序稍改即可... ...

遥望远方

  • 精华:0帖
  • 求助:0帖
  • 帖子:1帖 | 43回
  • 年度积分:0
  • 历史总积分:129
  • 注册:2016年10月12日
发表于:2016-10-27 08:37:44
9楼

111111111111111111111111111111111

qyw_63

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 270回
  • 年度积分:210
  • 历史总积分:175
  • 注册:2006年11月09日
发表于:2016-10-27 10:15:31
10楼

 好资料,感谢楼主的奉献啊。XXXXXXXXXXXXXX


热门招聘
相关主题

官方公众号

智造工程师