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区。
**************************