我原以为DB块和M的使用没有区别,都是作为存储数据的单元,直到今天在调试时出现了问题。具体描述如下:建立一个功能,然后在OB1重多次调用此功能,F1函数见下图:
其中本着先赋值后调用的原则,将形参add5定义为IN_OUT接口,这样只在sure为1,add4才输出两个输入量的和。
下图为OB1调用FC1的情况:
在此情况下发现问题:在I0.0为1时,两个调用输出都为各自两个值的和,单是i0.0为0,第一个DB1.dbd112的值不能保持,会变为db1.dbd28的值,再调用几个fc1,情况依然,在i0.0为0时,各输出值均变为最后一个调用FC1的输出值,后来我将所有的db数据更改为M区数据,即使i0.0为零,各输出依然为原值,不会变化。这说明M和DB在调用时是有区别的,即当形参sure处为0,如果使用M,则会保持上次sure为1的状态,只用DB块,则会输出所用调用中,最后一个FC1调用,的上一次输出值,这样相当于所有的FC1调用全部输出一个值。但是为什么会有这个差距?请各位大侠解疑
经过几天琢磨,基本搞清怎么回事了,具体见4楼分析。
结论:在重复调用FC功能时,如果使用DB块作为数据传输,其每次执行数据都是存放在L堆栈中(临时变量),如果说在fc中有输出未使用(例如我刚发帖时的情况,由于有一个开关点将输出的db块断开,不能每次讲输出赋值),则在调用此处时会将上一步输出(即B27-30存放的地址),也赋值给此次输出。