如果在FB1、FB2中使用POINTER或ANY数据类型指针进行拆分时,不考虑在多重背景DB块中的位置,将会造成错误,例如在FB1中定义输入接参数FB1_POS,数据类型为POINTER,在FB1中的程序如下:
L P##FB1_POS //指向存储地址指针FB1_POS首地址。
LAR1 //存储于地址寄存器1中。
L D [AR1,P#2.0] //装载实参赋值的地址指针,并传送到
MD20中。
T MD 20
同样在FB2中定义输入接参数FB2_POS,数据类型为POINTER,在FB2中的程序如下:
L P##FB2_POS //指向存储地址指针FB2_POS首地址。
LAR1 //存储于地址寄存器1中。
L D [AR1,P#2.0] //装载实参赋值的地址指针,并传送到
MD24中。
T MD 24
在FB10中,将FB1、FB2作为静态变量使用, FB10的接口参数为
数据接口 名称 数据类型 地址
STAT FB1_POS FB1 0.0
STAT FB2_POS FB2 6.0
FB10的程序如下:
CALL #FB1_POS //调用FB1,赋值地址指针P#M100.0。
FB1_POS:=P#M 100.0
CALL #FB2_POS //调用FB2,赋值地址指针P#M120.0。
FB2_POS:=P#M 120.0
在OB1中调用FB10,并生成DB10,程序如下:
CALL FB 10 , DB10 //调用FB10,生成DB10。
结果:
希望将P#100.0赋值到MD20中,将P#120.0赋值到MD24中,但程序执行后MD20和MD24存储的地址指针同为P#M100.0,这是由于FB1中的指令 L P##FB1_POS与FB2中的指令L P##FB2_POS同时指向多重背景数据块DB10中FB1接口数据区的首地址DB10.DBX0.0,以地址DB10.DBX0.0开始的POINTER指针变量存储的地址指针为P#M100.0;
解决办法:
T AR2 //将偏移地址传送到累加器1中。
L DW#16#FFFFFF //过滤地址区,如将P#M20.0变为P#20.0。
AD
L P##FB1_POS //将偏移地址与FB1_POS首地址相加并装载到
AR1中。
+D
LAR1 //得到FB1在多重背景DB块中的首地址。
L D [AR1,P#2.0] //将P#M100.0装载到MD20中。
T MD 20