写了一个累计设备运行时间的子程序,其中发现一些问题,请教大家。
首先建立了一个子程序,IN变量建立了两个,一个是设备运行的状态,作为计时开始,一个为清零状态。OUT变量建立了三个,分别是秒,分钟,小时。这些变量都是使用的局部变量,即L开头的存储区。
下面的程序就是60秒以后加分钟,清秒,60分加小时清分钟。
在主程序中调用这个子程序,用了一个秒脉冲。只调用一个子程序的时候是正常的,但是调用两个或者几个子程序的时候,时间输出都是一样的了。
对子程序的局部变量不是十分的了解,是否多次调用子程序以后,每一个子程序对应的局部变量只有一个吗?(造成累计时间程序的时候,多个子程序调用,输出的时间都是一致的)
类似S7-300的FB块都可以指定背景数据块,那200的局部变量又是怎么对应的呢?
或者是局部变量的类型没有设置正确造成的呢?
问题补充:
先谢谢1楼的回答。
但是,我主要想了解的是,当多个同样子程序调用的时候,局部变量所存储的值都变成一样了。怎么解决这个问题。
另这个子程序在主程序是秒脉冲调用的,可以不用加SM0.5了。
图片说明:
最佳答案
1、局部变量所存储的值都变成一样了。怎么解决这个问题?
在程序的开始必须有对该存贮区地址的赋值操作(即初始化),否则可能会出现错误的执行结果。
2、有关局部变量:
转帖:
局部变量是分配给每个子程序的临时存贮区。
当子程序被调用时,系统分配局部变量区给子程序;子程序执行完成后,该局部变量区被释放。释放时其中存贮的值也同时丢失,不能再下一扫描周期再被子程序使用。
局部变量区的大小为64个字节,其中最后4个字节被系统所占用,实际可供子程序使用的为60个字节。
由于局部变量区的数据不能带到下一扫描周期,因此只能用于存迪程序运算中的中间值,可以减少对全局变量区的占用。
由于局部变量区在子程序被调用时才被分配,且分配时并不对数据区进行初始化,所以其初始值是不确定的。因此在程序中用到这些存贮区的值的指令前,必须有对该存贮区地址的赋值操作,否则可能会出现错误的执行结果。
尤其在子程序中存在大量的跳转指令时,很容易出现漏掉对局部变量赋值的情况,要格外注意。
3、为了较可简便地监视与检查1程序,建议应用M存储区。
提问者对于答案的评价:
同样谢谢其他人
原创文章,作者:more0621,如若转载,请注明出处:https://www.zhaoplc.com/plc306331.html