小弟初涉STEP7编程,针对相同的启动条件的电机,想用FC做一个模板,在OB1或者另外的FC中多次调用,实现用不同的输入输出接口启动同启停条件的不同电机。
但是在做的过程引用了TEMP 局部变量, 有BOOL也有INT, 突然想到,如果在同一OB块或者FC中反复调用, 此局部变量会不会碍事? 因为是同一个FC块的局部变量,可能第一次调用,有起动条件接通了,或者赋值了, 然后再第二次调用的时候,没有起动条件接通此变量,可是此局部变量因为第一次调用接通,始终在接通, 或者参数对此变量赋值,可是因为此局部变量在第一次调用时已经赋过值,所以此时有不该有的值...
会出现这样的情况么?
如果会出现这样的情况,是不是必须把局部变量全部做到IN_OUT里去,一一赋予不同的实参?
问题补充:
不能做上,下沿和自保回路么?
我在一FC种编绘如下图程序,顺控同编号1,2,3,4
不光用了上,下沿 自保回路, 还需要根据OB1的信号接入刷新IN_OUT 与 OUT
OB1中调用2次,这样能执行顺利么?
图片说明:
最佳答案
FC和FB快中的TEMP变量为临时局部数据存储区,在CPU内部由CPU根据所执行的程序快的情况临时分配。一旦程序执行完毕,该区域被收回(临时变量数据丢失),在下一个扫描周期中,执行到该程序时再重新分配TEMP存储区,而FN和FP指令是要必须把前一扫描周期的信号状态保存在边沿标志地址(一般为位地址)中,在当前的程序扫描周期,把RLO位的信号状态都将与前一周期获得的结果进行比较,看信号状态是否有变化。而FB、FC中的TEMP变量中数据在上一周期调用结束已经被清除,因此是无法用FC、FB中的TEMP临时变量作为检测RLO状态的;
局部变量
在程序的开始必须有对该存贮区地址的赋值操作(即初始化),否则可能会出现错误的执行结果。
局部变量在所在块结束时被清零,局部变量是分配给每个子程序的临时存贮区。局部存储区是应该用于临时的,存放中间过程的。.call子程序时,IN会把数值先送给分配好的局部变量,然后运行子程序。结束时,系统自动把分配好的局部变量传输给OUT。
局部变量是公共区间,所有程序中的局部变量都会使用这片区域。它保存的值不会程序调用的结束而自动清零,因此所有程序使用局部变量之前应该遵守先赋值,再使用的原则。同样的,应该警惕子程序返回CRET指令对局部变量OUT的影响,先赋值,再退出。
对于计数,建议用保持寄存器V区间。
当子程序被调用时,系统分配局部变量区给子程序;子程序执行完成后,该局部变量区被释放。释放时其中存贮的值也同时丢失,不能再下一扫描周期再被子程序使用。
局部变量区的大小为64个字节,其中最后4个字节被系统所占用,实际可供子程序使用的为60个字节。
由于局部变量区的数据不能带到下一扫描周期,因此只能用于存迪程序运算中的中间值,可以减少对全局变量区的占用。
由于局部变量区在子程序被调用时才被分配,且分配时并不对数据区进行初始化,所以其初始值是不确定的。因此在程序中用到这些存贮区的值的指令前,必须有对该存贮区地址的赋值操作,否则可能会出现错误的执行结果。
尤其在子程序中存在大量的跳转指令时,很容易出现漏掉对局部变量赋值的情况,要格外注意。
为了较可简便地监视与检查程序,建议应用M存储区。
局部变量教程:
http://www.ad.siemens.com.cn/service/elearning/cn/CourseV2.aspx?CourseID=533
提问者对于答案的评价:
非常感谢
原创文章,作者:more0621,如若转载,请注明出处:https://www.zhaoplc.com/plc239134.html