展开查看
以下是引用dudongdong在2015-03-25 18:52:19的发言 >6楼:出现这种情况的原因在于,STEP7在创建FB时,块属性默认是“具有多实例能力的”
所以,当我们创建的FB没有被更高级的FB调用时,即不存在“多重背景模型”的时候,AR2总是指向P#DBX0.0的,
也就是说FB的声明参数总是从DBX0.0开始定义的。但是LAR2 P##TUse这条语却使AR2指向了P#DIX5.0
那么FB的声明参数就会从DBX5.0开始定义
即你看到的
var_IN
Clear Bool 0.0实际上是从DBX5.0处定义的,那么执行
A DIX[AR2,P#0.0]后就相当于A #Clear,而不是 A TUse .0
要想A TUse.0,就得写成A DIX[AR2,P#5.0]
或者将块属性‘具有多重实例能力’的钩去掉,这样A DIX[AR2,P#0.0]就同A TUse.0一样了。
个人认为,背景数据块是FB特有的,而AR2地址寄存器在FB中背景DB寻址时永远从背景数据块首地址开始寻址,即无论程序前面AR2如何赋值,DI? [AR2,P#0.0]永远指向背景数据块首地址。
“FB的声明参数就会从DBX5.0开始定义”的说法不正确。
从以下DB1在线状态可以看出,FB声明参数的地址不会发生改变

用楼主的程序举个反例
A #Clear
L 0
T #INIT
SET
LAR1 P##TApply
LAR2 P#100.0 //这里给AR2任意赋值,例如:LAR2 P#M10.0等
SET
A DIX [AR2,P#0.0] //这里同样也会变成 #Clear
A DIX [AR1,P#0.0]
= #OK
也就是说前面无论AR2怎样赋值,DI?[AR2, P#0.0]的AR2总是指向DIX0.0。
因为,AR2并不是仅仅用于背景数据寻址,如果在程序前面AR2曾用于共享数据块或其它存储区寻址,当用AR2在背景数据块寻址时,DI?[AR2, P#0.0]会自动指向背景数据块首地址。