首页 上一页 1 2 3 下一页 尾页

哇!终于让我遇到了传说中的程序跑飞。。。 点击:13591 | 回复:59



chinacupor

    
  • 精华:2帖
  • 求助:13帖
  • 帖子:25帖 | 845回
  • 年度积分:0
  • 历史总积分:2751
  • 注册:2013年2月16日
发表于:2013-03-07 22:28:34
楼主

故事是这样的。。。

 

      为了偷懒,我做了个限制参数设定范围的子程序。总共涉及3个局部变量,上限、下限(这俩是IN型)、地址(这个是IN/OUT型)

因为都是实数类型,所以LD0/LD4/LD8三个双字地址被占用。

 

      很简单的子程序,无非就是地址大于上限,将上限写入地址。地址小于下限,将下限写入地址。当发生任何强制写入的时候,都将激活一个超限位。

      然后,我的设定项有点多。。。大概有个二十多条吧(貌似这也不算多吧。。。)

 

      然后就在一个网络中,把这个子程序调用了二十多遍。。。用SM0.0来导入,然后很二的把那个公共超限开关导出到Q0.4上。

 

      开CPU,正发愣的工夫,就听见我的二手PLC跟打铃似的,嗷嗷的!然后手忙脚乱把CPU关了。心疼半天把那个超限放到一个M位上,然后把最前面的SM0.0换成I0.3,先跑跑程序看看排除其他的问题。等其他的问题都搞定了,回过头来再强制I0.3闭合,然后实时监测子程序的进出数据。很快就发现不对劲了,因为我的设定项都在数据块里做过定义了,绝对没有任何一条超出上下限范围的。而且在开始的时候这些数据还是很正常的,但跑了大概有两三秒之后,所有的设定项都逐渐变成了不是上限就是下限。。。而且有的是这个设定值成了另一个设定值的上限或者下限之类的。。。到所有设定项都沦陷时,我才发现我连开机都没开,系统还在待机状态下。。。

 

      这算是打摆子打疯了么?我那个子程序编的确实有点像打摆子。。。

 

      然后一怒之下,把那个上下限子程序删了,然后把所有的计算内容都放到主程序里面来摆桌面上,一个临时地址都不用,我看T娘D谁还犯毛病!还是用SM0.0做导游,然后并上N条通路,后来一个网络都放不下了,分两个网络才放完。。。

 

      开CPU,一次性通过。。。在TD里试验了一下超限设置,发现还不错,一旦确认了超限值,立马写成最大值或者最小值。

 

      感想:

1、以后临时变量能不用就不用吧,出于井绳心理,真心不大敢了。。。反正V区地址多得是,老子以后都用全局地址,看你还跟我来劲?

2、TD组态怎么那么占地方?我不过搞了二十多个设定和显示项,数据块就5K多个字节了,就跟写小说似的。。。我有那么啰嗦么?另外,这数据块都存在哪里啊?是EEPROM么?那不是要跟我的掉电保持和程序块争地方?




江湖混混-余 辉

  • [版主]
  • 精华:53帖
  • 求助:44帖
  • 帖子:3351帖 | 28451回
  • 年度积分:603
  • 历史总积分:131640
  • 注册:2006年4月25日
发表于:2013-03-07 23:08:26
1楼
提议授精              

chinacupor

  • 精华:2帖
  • 求助:13帖
  • 帖子:25帖 | 845回
  • 年度积分:0
  • 历史总积分:2751
  • 注册:2013年2月16日
发表于:2013-03-07 23:23:51
2楼

关于第二个感慨,我想我可能找到答案了,不知道西门大官人咋想的,我只是在数据块里定义了一批设定项,然后为了方便一键批量保存,所以把这些设定项都放在VB5000以后,最后一个设定值地址是VW5126。

 

然后,编译的时候发现,我的数据块大小就成了5128字节。。。。

 

至于TD的组态数据,花了四百多个B,从VB0到VB400多,在向导下面可以看到。。。于是为TD洗清了冤屈

江湖混混-余 辉

  • [版主]
  • 精华:53帖
  • 求助:44帖
  • 帖子:3351帖 | 28451回
  • 年度积分:603
  • 历史总积分:131640
  • 注册:2006年4月25日
发表于:2013-03-07 23:25:58
3楼
已授精  支持原创  而且是介绍经验的

王者之师--lzgz00

  • 精华:0帖
  • 求助:0帖
  • 帖子:445帖 | 1223回
  • 年度积分:0
  • 历史总积分:4892
  • 注册:2008年9月02日
发表于:2013-03-08 07:05:43
4楼
编译的时候会比你当时定义的有所增加的

明理

  • 精华:1帖
  • 求助:1帖
  • 帖子:44帖 | 3150回
  • 年度积分:0
  • 历史总积分:20986
  • 注册:2007年6月21日
发表于:2013-03-08 07:58:23
5楼
楼主的经历给大家提醒,编写程序是要特别注意这些情况。

通讯网-原创军团

  • 精华:11帖
  • 求助:1帖
  • 帖子:432帖 | 10265回
  • 年度积分:0
  • 历史总积分:24711
  • 注册:2004年7月09日
发表于:2013-03-08 08:50:18
6楼
没看懂。。。。。。。。。。。。。

xyzg666888

  • 精华:0帖
  • 求助:0帖
  • 帖子:2帖 | 74回
  • 年度积分:0
  • 历史总积分:0
  • 注册:2012年9月06日
发表于:2013-03-08 10:25:22
7楼
呵呵,看不懂,太深奥啦。有点像小说

痛并快乐zhe

  • 精华:0帖
  • 求助:0帖
  • 帖子:3帖 | 355回
  • 年度积分:0
  • 历史总积分:1983
  • 注册:2012年12月17日
发表于:2013-03-08 10:59:25
8楼
编译的时候会比你当时定义的有所增加的

chinacupor

  • 精华:2帖
  • 求助:13帖
  • 帖子:25帖 | 845回
  • 年度积分:0
  • 历史总积分:2751
  • 注册:2013年2月16日
发表于:2013-03-08 11:02:08
9楼
引用 江湖混混-余 辉 的回复内容: 已授精  支持原创  而且是介绍经验的


多谢斑竹,祝愿工控网越办越好。。。

PS:后台更新啥时候完成啊?话说俺滴短消息还看不见的说。。。

zhxl198808——工控人生

  • 精华:5帖
  • 求助:10帖
  • 帖子:46帖 | 3915回
  • 年度积分:0
  • 历史总积分:22216
  • 注册:2008年9月06日
发表于:2013-03-08 14:22:43
10楼
引用 xyzg666888 的回复内容:呵呵,看不懂,太深奥啦。有点像小说



houwenzhi

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 1回
  • 年度积分:0
  • 历史总积分:11
  • 注册:2013年3月02日
发表于:2013-03-08 16:04:13
11楼
看我太懂,貌似挺复杂的。。。

雪峰山-孤狼

  • 精华:2帖
  • 求助:0帖
  • 帖子:1200帖 | 11283回
  • 年度积分:2326
  • 历史总积分:62523
  • 注册:2006年8月05日
发表于:2013-03-08 16:44:31
12楼
西门子如果不出现问题就不是西门子了

chinacupor

  • 精华:2帖
  • 求助:13帖
  • 帖子:25帖 | 845回
  • 年度积分:0
  • 历史总积分:2751
  • 注册:2013年2月16日
发表于:2013-03-08 17:11:27
13楼

呃。。。都看不懂?不会吧。。。都在装谦虚?

 

简单说,就是我做了个子程序,然后在主程序当中每个扫描周期里反复调用20多遍,然后程序就跑飞了。。。

 

具体原因分析,可能是子程序太短,L区的地址来不及释放和再赋值。因为都是用的同样的那几个LD地址。CPU不停的把不同的数值写入一个地址,读取这个地址,运算,再写入新值,再读取,再运算,再写入,再读取。。。

 

我的扫描周期大概4~5mS,具体到那个问题网络估计1mS都不到,因为后面还有PID运算之类的内容,同样的活在不到1mS的时间内连着干了20多遍,于是就把CPU给惹毛了,还冲我咆哮。。。话说我内个冤

 

 

winter938

  • 精华:1帖
  • 求助:0帖
  • 帖子:55帖 | 945回
  • 年度积分:0
  • 历史总积分:3418
  • 注册:2005年6月12日
发表于:2013-03-08 17:29:27
14楼
楼主把你的程序传上来看看,估计是对子程序数值传递的规律理解不充分造成的.

chinacupor

  • 精华:2帖
  • 求助:13帖
  • 帖子:25帖 | 845回
  • 年度积分:0
  • 历史总积分:2751
  • 注册:2013年2月16日
发表于:2013-03-08 18:39:37
15楼
引用 winter938 的回复内容: 楼主把你的程序传上来看看,估计是对子程序数值传递的规律理解不充分造成的.


那段程序已经去见马克思了。。。我重写了一段如下

LD     SM0.0

LPS

AR>    #地址:LD8, #上限:LD0

MOVR   #上限:LD0, #地址:LD8

AENO

=      #超限:L12.0

LPP

AR<    #地址:LD8, #下限:LD4

MOVR   #下限:LD4, #地址:LD8

AENO

=      #超限:L12.0

 

至于理解不充分。。。这就这么两行代码3个地址,很难理解么?类似的子程序我不是第一次用,以前都用得蛮好的,不过以前都是一两个跑一下,一点问题都没有。这次多了点,而且还都放在一起,可能问题就在这里。

 

如果是代码的问题,那么我把同样的代码拉出来放主程序里就没事,也排了一大排。一个参数就是2行指令。二十多个,就有四五十行。唯一的区别,是在主程序里,不涉及L区地址。

chinacupor

  • 精华:2帖
  • 求助:13帖
  • 帖子:25帖 | 845回
  • 年度积分:0
  • 历史总积分:2751
  • 注册:2013年2月16日
发表于:2013-03-08 20:59:43
16楼

刚才又遇到一个临时变量犯毛病的事情。。。

 

我用了一个定时器,每100ms给一个临时地址里的变量+1,结果它给我从0加到63就彻底罢工了。。。给我气的

 

就因为害怕出事,还特意在整体运行之前把这一小段代码新建一个主程序跑了一下,完美达标!然后放到这个子程序里换上临时地址就又瞎菜了。。。

 

然后我想看看是不是子程序里其他部位的问题,于是把整个子程序都搬出来,放到一个新建的主程序里,结果又没事了,跑得不知道多欢实。。。

王者之师—广州@阿君

  • [版主]
  • 精华:25帖
  • 求助:18帖
  • 帖子:503帖 | 6997回
  • 年度积分:0
  • 历史总积分:66772
  • 注册:2010年6月26日
发表于:2013-03-09 13:08:29
17楼
经验铁。。。下次建议图文并茂。。。

Lgj3388

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 236回
  • 年度积分:0
  • 历史总积分:925
  • 注册:2003年8月13日
发表于:2013-03-09 15:27:03
18楼

楼主是中彩了!!!

本人曾经也做过连续的多次带参数调用同一个子程序的项目,该机器运行到现在都快十年了,但这等希奇事物始终没有出现。

ShowFine

  • 精华:1帖
  • 求助:1帖
  • 帖子:57帖 | 753回
  • 年度积分:0
  • 历史总积分:1671
  • 注册:2003年10月29日
发表于:2013-03-09 15:35:37
19楼

楼主在主程序里调用该程序里, 将二十几次的调用分成独立的二十几个Network里试试?

 

至于最新发贴里的以100ms给临时变量+1? 这怎么搞? 临时变量先赋值后调用……  有兴趣楼主将完整的程序发上来看看。

 

不太相信楼主就这么好运气,能撞上这么多问题。 要说PLC有问题我做了十年至今只碰到过一次欧姆龙的,那也是因为当时现场环境太差,强电磁干扰。 后来改善电源环境,一样的程序就完全OK。 

chinacupor

  • 精华:2帖
  • 求助:13帖
  • 帖子:25帖 | 845回
  • 年度积分:0
  • 历史总积分:2751
  • 注册:2013年2月16日
发表于:2013-03-09 17:00:01
20楼
引用 ShowFine 的回复内容: 楼主在主程序里调用该程序里, 将二十几次的调用分成独立的二十几个Network里试试? 至于最新发贴里的以100ms给临时变量+1? 这怎么搞? 临时变量先赋值后调用……  有兴趣楼主将完整的程序发上来看看。 不太相信楼主就这么好运气,能撞上这么多问题。 要说PLC有问题我做了十年至今只碰到过一次欧姆龙的,那也是因为当时现场环境太差,强电磁干扰。 后来改善电源环境,一样的程序就完全OK。 


汗,我可没有精力去帮西门大官人找BUG,既然叫我遇到了,那以后就注意就好了,等有时间了再试试你说的放到二十多个网络的办法哈。。。

 

不过貌似我好像有点孤僻动作似的,能放一个网络绝不分两个网络,大家说说这个习惯是好还是不好?


热门招聘
相关主题

官方公众号

智造工程师
    首页 上一页 1 2 3 下一页 尾页