恭喜,你发布的帖子
发布于 2015-09-18 09:12:35
4楼
以前也有看到M区和DB区参数调用区别的帖子,但也不太明白。你的例子中把DB区变量换成M区变量,程序可能就可以用了(但总觉得不很妥当),把OUT改为IN_OUT满足RS/SR指令要求才是根本吧。
手册中说调用FC时,参数的类型不同,在FC中处理的方式也不同,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区内容就会被拷贝至实参区。
如果正如手册所讲的,第一个程序就很好解释了,但是第二个程序就无法解释了。开始看到第一个程序时,再看手册上的内容,觉得自己找到答案了,结果遇到了第二个程序,就彻底凌乱了。。坐等大神解答!
请填写推广理由:
分享
只看
楼主