跟踪一下讨论。 happylife来看看。

已锁定

芳季

西门子1847工业学习平台

  • 帖子

    15507
  • 精华

    101
  • 被关注

    960

论坛等级:至圣

注册时间:2007-08-03

钻石 钻石 如何晋级?

跟踪一下讨论。 happylife来看看。

376

3

2017-12-25 10:42:46

http://www.ad.siemens.com.cn/service/answer/solution.aspx?Q_ID=180189&cid=1076

引用一下部分原文:

扫描方式是不是这样
1:扫描程序段7,得到LW5为9,即MW6,MW12,MW18都为9,然后释放add3的值
2:扫描程序段8,得到LW7为0,但是start没有接通,所以值不放入MW12和MW18
也就是扫描第一个程序段是覆盖全部的OUT点,扫描第二个程序段是覆盖除了第一个的OUT点,扫描第三个程序段是覆盖除了前两个的OUT点。

----------------隔---------------

子程序中out的特性是进入子程序毫无动作,退出子程序时把L值传给输出参数。(重要中的重要是“退出”两个字。)

子程序毫无疑问是有退出的一刻的,而且并不会理会子程序的执行经历过一些什么。好像楼主这个程序,LW5并没有经过赋值就退出了。结果LW5仍然要把自己的值传给输出参数。可怜的是自己本身都没有经过赋值过程。那怎么办呢?……

happylife说:扫描第一个程序段是覆盖全部的OUT点,扫描第二个程序段是覆盖除了第一个的OUT点,扫描第三个程序段是覆盖除了前两个的OUT点。

我说不是。你试试接通中间那个程序,第一第三个程序也会受到感染。

这里必须知道一种特质。

**************************

所有同级子程序共享一片L区。

**************************

不同级的子程序有各自本级所属的L区。所以L区其实很大的。

以上请注意“级”字。也可以理解成辈份,我觉得理解成子程序的辈份会比较好理解一些。

楼主这个子程序,只有一个子程序,当然是使用唯一的一个L区。进入和退出子程序并不会对L区有“额外”的初始化。L区会遗留着上一次执行子程序时候结束的状态,而且是必然的值。谁用到最后是多少就是多少。(这句话随便你理解不理解。因为书本上说L没有初始值,值是任意的。)

说到这里,那么应该好理解了。上一次执行是什么值?

第一次LW5得了个9 。退出了。

第二次调用的时候,这个值就是9。并且第二次调用的时候LW7没有传到LW5,所以,没办法,LW5手头上只有9这个值。退出子程序的时候,只能把以前遗留下来的值赔给你了。

第三次调用的时候,既然前面的都是这么做了,那么我也这么做了。结果9就是这样传到自己手上。

后面再调用多少次,假如都是不执行mov的话,还是那个9 。

说到这里,倒回来一点点。并不是多次调用同一个子程序才会这样,而是调用任何子程序都会这样。例如第二次调用之前调用过其他子程序,并且他也使用到LW5,把LW5写成了133,那么你接着的第二次调用你的子程序的时候LW5就是133了。

**************************

所有同级(同辈)子程序共享一片L区。

**************************


跟踪一下讨论。 happylife来看看。 已锁定
编辑推荐: 关闭

请填写推广理由:

本版热门话题

SIMATIC S7-200

共有33257条技术帖

相关推荐

热门标签

相关帖子推荐

guzhang

恭喜,你发布的帖子

评为精华帖!

快扫描右侧二维码晒一晒吧!

再发帖或跟帖交流2条,就能晋升VIP啦!开启更多专属权限!

  • 分享

  • 只看
    楼主

top
您收到0封站内信:
×
×
信息提示
很抱歉!您所访问的页面不存在,或网址发生了变化,请稍后再试。