发布于 2014-12-11 21:11:07
6楼
1:S7 CPU的参数传递方式,一般是按引用传递的。
2:CALLING块 首先将实参的值,传递到L区,在调用"被调用块"的时候,会把L区的地址 传递给"被调用块",这个时候,在"被调用块"里面就根据"调用块"存在L区(在被调用块里,就叫V区,其实也是L区,就是"调用块"的L区)里的地址,然后根据地址 把实参的值读取到内部。
当然这个都是CPU操作系统底层干的事情。
比如OB1中 调FC1,FC1有个IN类型接口IN1
正常调用这样
CALL FC1
IN1:MW0
但操作系统 底层会这样干
L MW0
T LW20
UC FC1
IN1:P#L20.0
在FC1内部取IN1的值的时候,应该类似如下过程
LAR1 P#IN1
L W[AR1,P#0.0]AR1里的值就DW#16#870000A0,也就P#V20.0了。
这个“调用块”里的L20.0 在FC1内,就叫V20.0了,这个是因为FC里,也有自己的L区,所以CALLING的区,就叫V区了,是特殊的V区(这个纯属个人猜测)
所以在调用 ANY,POINTER等参数类型或者复杂数据类型的接口时,就有了指向指针的说法了。
系统在调用过程中,会不断进行这个过程,COPY实参(变量或者常数)到L区。所以,CPU停止再次运行后,你的存在L区里的值会丢失了,但是PLC在执行到调用FC的语句时,会再次把100 COPY到相应的L区里。
人生就像一场旅行!