求助~~:s7-200主程序里多次调用同一个子程序时遇到了问题 点击:6186 | 回复:13



nl

    
  • 精华:0帖
  • 求助:0帖
  • 帖子:1帖 | 10回
  • 年度积分:0
  • 历史总积分:79
  • 注册:2005年7月02日
发表于:2005-12-25 07:49:00
楼主
使用s7-224控制器,在主程序里多次调用同一个子程序时遇到了问题.
我的本意是有一个标准的子程序,可以多次的调用,每次调用应根据不同的输入,有相应的输出,且其中不希望有M和V这类的全局存储的地址.

* 第一种情况
在主程序中2次调用同一个子程序(子程序中没有上升,下降,计时和计数),子程序大概意思如下:
3个传递参数IN,3个输出参数OUT传递给,没有IN_OUT,其中子程序内部有set,set块置位了一个temp地址是L1.0,[color=#FF0000]这个temp值对输出有决定性影响[/color]
在主程序中第一次调用传递i0.0,i0.1,i0.2给IN参数,输出OUT参数输出给Q0.0,Q0.1,Q0.2
第二次调用传递I0.4,I0.5,I0.6给IN参数,输出OUT参数输出给Q0.4,Q0.5,Q0.6
当改变第一次调用的DI时(两次DI不同),两次调用的输出同时按照一样的规律变化,
想了下,觉得是这个temp对输出的影响,于是做了点改变就是下面的第二种情况

*第二种情况
把子程序复制成2个,然后分别调用2个子程序(但L局部存储的地址同第一种一样),分别测试两次调用,还是相互影响,第一次调用的输入同时改变两次调用的输出.
我想可能是因为两次调用的temp量地址是一样的.做了修改,见下

*第三种情况
改变子程序中的temp量,将原来的temp量L1.2放在IN_OUT中.有了好转,第一次调用的输入不影响第二次调用的输出.反过来也不影响.

我不知道这么做是否合理,
是不是不同的子程序里只要L存储的地址一样,就可以在子程序之间相互影响??
但从上面的情况看来,IN,OUT和IN_OUT的L存储地址一样,但不会在不同的调用中有影响.似乎是只有在temp里才会这样.
或者说用作参数传递的L存储器,即使地址一样也不会在不同的调用中相互影响,是这样么?
有没有更好的办法解决这种问题?请大家多指点~~



nl

  • 精华:0帖
  • 求助:0帖
  • 帖子:1帖 | 10回
  • 年度积分:0
  • 历史总积分:79
  • 注册:2005年7月02日
发表于:2005-12-25 20:36:00
1楼
怎么没有人啊?

nl

  • 精华:0帖
  • 求助:0帖
  • 帖子:1帖 | 10回
  • 年度积分:0
  • 历史总积分:79
  • 注册:2005年7月02日
发表于:2005-12-25 20:36:00
2楼
怎么没有人啊?

wincc123

  • 精华:4帖
  • 求助:0帖
  • 帖子:41帖 | 765回
  • 年度积分:1
  • 历史总积分:1067
  • 注册:2003年10月13日
发表于:2005-12-26 09:55:00
3楼
你要知道L临时变量的性质,从子程序返回时,L即消失

皓月

  • 精华:9帖
  • 求助:0帖
  • 帖子:483帖 | 5271回
  • 年度积分:0
  • 历史总积分:8863
  • 注册:2003年11月09日
发表于:2005-12-26 10:08:00
4楼
应该不会影响

nl

  • 精华:0帖
  • 求助:0帖
  • 帖子:1帖 | 10回
  • 年度积分:0
  • 历史总积分:79
  • 注册:2005年7月02日
发表于:2005-12-29 00:18:00
5楼
L是临时变量没错,不过,在这个程序中,调用是在控制器运行时一直调用的,也就是说使用sm0.0在调用这个子程序,这个L不会出现调用完成而析构的情况
现在我让里面的L变量与一个输入输出联系起来,两次调用间没有影响了,只是不知道这是为什么

nl

  • 精华:0帖
  • 求助:0帖
  • 帖子:1帖 | 10回
  • 年度积分:0
  • 历史总积分:79
  • 注册:2005年7月02日
发表于:2005-12-29 00:56:00
6楼
请大侠们赐教一二

曹文清

  • 精华:0帖
  • 求助:0帖
  • 帖子:1帖 | 19回
  • 年度积分:0
  • 历史总积分:99
  • 注册:2005年12月19日
发表于:2005-12-29 09:15:00
7楼
最后一种方案也是不可取,因为IN_OUT(输入_输出变量):其初始值由调用它的POU提供,被子程序修改后返回给调用它的POU.

nl

  • 精华:0帖
  • 求助:0帖
  • 帖子:1帖 | 10回
  • 年度积分:0
  • 历史总积分:79
  • 注册:2005年7月02日
发表于:2005-12-30 00:18:00
8楼
这个IN_OUT只是为了建立一个临时变量与调用POU的联系,在主程序根本没有用到,其他地方也没有,个人认为这样一个占用可以避免受第一次调用输入的影响.当然用OUT也可以,反正别的地方也没有用到.
请注意这个调用是全局范围内的调用,一直存在,也有在部分时间段内调用的.
后来我做了测试,确定这两次调用不会相互产生影响,希望有大虾们帮我分析并且解释一下,或者告诉我一种更好的办法来实现.

曹文清

  • 精华:0帖
  • 求助:0帖
  • 帖子:1帖 | 19回
  • 年度积分:0
  • 历史总积分:99
  • 注册:2005年12月19日
发表于:2005-12-30 08:51:00
9楼
编写一个公用子程序.然后二次调用这个子程序.(两次调用都是有调件的.但是条件不同).你可以按此试试.

亮亮工控

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 17回
  • 年度积分:0
  • 历史总积分:17
  • 注册:2004年5月28日
发表于:2006-01-02 16:44:00
10楼
在同一类子程序调用时,请先清零

hubo77

  • 精华:0帖
  • 求助:0帖
  • 帖子:12帖 | 14回
  • 年度积分:0
  • 历史总积分:72
  • 注册:2001年2月16日
发表于:2006-06-11 13:18:00
11楼
我也遇到这种问题,它不是说在第二次调用同一个功能块时要先将L区清零,而是在第一次调用时,临时变量同时影响了第二次输出。调用的

君禾机电

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 6回
  • 年度积分:0
  • 历史总积分:10
  • 注册:2003年2月24日
发表于:2006-06-21 15:36:00
12楼
我也遇到过类似问题,以个人理解认为是L局部变量因之前程序调用后处于不确定值而导致出错.解决方法是仔细分析哪些过程量是否需要用于下次程序调用,若存在的话,将它设为IN_OUT类型.

gnefam

  • 精华:1帖
  • 求助:11帖
  • 帖子:35帖 | 265回
  • 年度积分:309
  • 历史总积分:19990
  • 注册:2009年2月12日
发表于:2015-11-28 20:38:03
13楼

这个问题我也遇到了,不知道有什么好方法解决?


热门招聘
相关主题

官方公众号

智造工程师