发布于 2010-05-28 14:24:46
59楼
FC调用输出实参为数据块时的处理,与输出实参为M、I、Q、PQ不同。
在输出实参为M、I、Q、PQ时,FC输出形参(指针)指向实参实际存储地址,如果在FC中,没有对输出形参形成实质性操作,则形参指针所指向的实际存储区内容不会改变,对于参数传递过程而言,仅仅是调用时形参指向实参,调用结束时形参指针区域释放的一个过程。
在输出实参为DB块时,FC开始调用时,先在V区为该形参分配一个存储区(可能是位,也可能是字节或其它,根据形参参数类型而定),每一次调用FC,根据调用FC时所传递的实参类型不同,为输出形参分配的V区区域可能不同,比如一个FC有一个位输入形参,一个位输出形参,在第一次调用时,实参分别是I0.0,DB0.DBX0.0,则为输出形参分配的V区为V20.1;第二次调用FC,实参分别为DB0.DBX0.1,DB0.DBX0.2,则为输出形参分配的V区为V20.2,原来的V20.1被输入形参所对应的实参DB0.DBX0.1内容所填充。如果第二次调用FC时,实参为M0.1,DB0.DBX0.2,则为输出形参分配的V区仍为V20.1。
其后,FC在实际运行时,针对输出形参(数据块)的处理其实都是在对该V区进行处理,在FC结束调用后,不管在FC中有没有对该V区进行实质性处理,该V区的内容均会被拷贝至另一个存储区,比如L区,该L区与实参区对应,但不在同一区,此时并一直等到本次OB循环结束,该L区内容都不会被拷贝至实参区,所以这个时候实参区的内容还不会有变化。
等到下一个OB循环开始之前,该L区内容就会被拷贝至实参区。
我们可能会这样认为,FC的形参调用,对于输入、输出以及输入/输入形参的处理区别在于:
对于输入是只读不写,对于输出是只写不读,对于输入/输入是即读又写。
但这种认识并不确切,对于实参是M、I、Q、PI、PQ的参数传递,是指针指向,所以输入、输出以及输入/输入形参其实是一样的,但如果实参是数据块的参数传递,则不是指针指向,还是副本拷贝,所以可以这样认为。
对于这段程序,使用INPUT_OUTPUT代替OUTPUT能够得出预期的结果正是这个原因。而用“=”代替“RS”也可以,是因为“=”是根据直接把RLO位拷贝到输出(还是V区),输出(V区)是实时变化的;而“RS”的是否执行需要根据RLO位结果来进行判断,RLO位为零时,RS指令不执行,则输出(V区)不变。
其实以上所说的内容,在STEP7在线帮助的“梯形图帮助”中的“参数传递”一节说得很清楚,也就是29楼所拷贝的内容。但西门子的说明非常简捷,一时真看不懂,只有实际使用单步模拟调试几次,才明白手册中所说的意思。