问题1:如题。
举例:
在子程序1当中,将网络1的计算结果存入LD4以备后用。
在网络2中嵌套了另一个子程序2,这个子程序当中也使用到了LD4。
然后在子程序1的网络3中,我使用LD4进行其他的计算。
请问,网络3当中的LD4的值是子程序1网络1当中保存的那个值,还是在子程序2的运算当中保存的值?或者根本就是一个被释放的状态?(看到有人说子程序运行完之后,LD的存储区会被完全释放,结果应该都是0)
如果子程序1网络3当中的LD4值不是子程序1网络1的计算结果,那我要怎么才能实现子程序当中的子程序嵌套,才能规避这种地址冲突?
1、把LD4设置成IN/OUT类型给外部保存?可是我的L区地址不大够用了啊。。。
2、把子程序2做成库,然后在使用这个库的时候,给他专门指定内存区域?可是即使指定了专门区域,这个库文件里面的代码还是LD4啊。。。会不会仍有冲突?
问题2:
如何在子程序中实现类似PID回路表那样的,用一个临时变量标定多个外部变量地址。
例如:在子程序中,IN值的地址是VB100,然后我需要13个B或者W或者D类的变量,但我又不想占用太多L区临时变量名额。所以用了类似PID回路表那样的方法,将VB100后面的若干空间直接定义给子程序使用?
我猜一定用到了指针,但具体怎么用我还说不上来。还请大侠详细说明。
最佳答案
楼主描述了许多,但他人对楼主的程序尚不能了解。在此只能转帖一些注意事项供参考:
1、带形式参数的子程序,定义为OUT类型的变量为何会在多次调用子程序时互相干扰?
那是因为定义为 OUT 类型的形式参数并非每次调用子程序时在其内部都有确定的赋值操作。可以将此类参数定义为 IN_OUT 类型,或者确保在每次调用子程序时都有赋值操作。
2、注意S7-200:
、子程序可以嵌套调用,即子程序中再调用子程序,一共可以嵌套8层 。
、子程序在调用时会保持当前的逻辑运算结果,但是不保存累加器(ACx)的内容 。
、子程序在执行到末尾时自动返回,不必加返回指令;在子程序中间也可以使用条件返回指令
子程序不能使用跳转语句跳入、跳出 。
、子程序返回时,回到调用子程序的指令后面,继续执行上一级程序 。
、S7-200 CPU最多可以调用64个子程序(CPU226为128个)。
、在中断服务程序中不能欠套调用子程序,被中断服务程序调用的子程序中不能再出现子程序调用 。
、子程序可以带参数调用,在子程序的局部变量表中设置参数的类型;一共可以带16个参数(形式参数)。
3、使用子程序时,为何动作只能执行一次,或者某些状态不能结束?
如果发生动作不能重复执行,或者状态不能结束(像锁死了一样),而这些功能都与子程序有关时,请检查是否有条件调用子程序。调用子程序的条件在上述动作执行后,或者进入某个状态后不再有效,无法再次“激活”,而脱离上述状态或复位的指令正好在子程序内,必然造成上述的现象。
提问者对于答案的评价:
谢谢老师指点。
专家置评
已阅,最佳答案正确。
原创文章,作者:more0621,如若转载,请注明出处:https://www.zhaoplc.com/plc294644.html