子程序的局部变量表中的临时变量的状态为什么不能保持?
只有在执行S7-200的子程序时,它定义的临时变量才被使用,执行完后,不再使用临时变量中的数值。S7-200的局部变量区是各子程序公用的,所以在调用别的子程序时,它们中的数据可能被覆盖掉。
为了深入了解CPU对局部变量中的临时变量的处理,编写了下面的主程序和子程序:
![](http://www.591dg.com/uploads/allimg/170312/34-1F3121FI2Q1.png)
![](http://www.591dg.com/uploads/allimg/170312/34-1F3121FI2Q1.png)
子程序中局部变量的地址是按先后次序自动分配的。在0号子程序中对局部临时变量TMPl (LWO)加1,程序中的“#”号是CPU自动添加的。在1号子程序中,将局部临时变量TMP2 (LWO)清零。TMP1和TMP2分别是两个子程序中的局部临时变量,它们在局部变量表中的地址相同,均为LWO。
将程序下载到PI_C后,用程序状态功能监视0号子程序。不论上次RUN模式时TMP1的值是多少,PLC进入RUN模式时,TMP1的值都会被清零。说明CPU在第1个扫描周期时将局部变量表的数据全部清零。
如果只调用子程序0,每调用一次,TMPI的值加1,说明在停止调用时临时变量TMP1并未被清零。如果调用子程序1,TMP2的值被清零,因为TMP1和TMP2使用同一物理存储器字LWO,所以在监视子程序0时可以看到,rrMPI也被清零。
由此可以看出,各子程序的局部变量区是共用的。
在10.0的上升沿调用0号中断程序,将局部变量TMP3(LWO)清零。在子程序0中可以看到它的临时变量TMP1(LWO)并未被清零。 由此可以看出,子程序和中断程序分别使用不同的局部变量区。
值得注意的是没有调用该子程序时,用监视功能是看不见TMP1的当前值的。只有在11.0的上升沿,才能看到TMP1的值。TMP1被子程序1清零后,第1次调用子程序0时,看到的TMP1的值为1,因为在调用它时TMP1被加1。
如果有PLC,很多问题都可以通过设计适当的程序,观察运行的结果,自己求出答案。
上一篇:步在顺序控制中有什么作用?
下一篇:什么是动作?
相关推荐
最新更新
推荐阅读
猜你喜欢
电工推荐
![电工技术基础_电工基础知识_电工之家-电工学习网](/skin/images/guanzhu.jpg)