问题就是出在,在编写程序时,没有考虑到多重背景调用的情况,因为为了提高程序的通用性,我在编写编码器定位控制的FB块时,使用了区域内寄存器寻址,从而导致了FB块以多重背景调用方式的时候出现了问题。 请看下面我的编码器定位控制FB的STAT变量Bins为一个64的数组,数组元素类型为一个STRUCT. Bins : ARRAY [1 .. 64 ] OF //仓数据区 STRUCT ParPostionAbsolute : INT ; //虚拟仓位置所对应的格雷码转换为二进制的值 PostionOffset : INT ; //仓位置所允许的误差 ParPostionToOutPort : INT ; //虚拟仓转到取料口时,编码器所对应的格雷码转换为二进制的值 END_STRUCT ; 在FB 程序里面,我对此处类容进行了间接寻址 ,见下面代码: //--Serch the selectedt bin postion LAR1 P##Bins; L #InTargetBinIndex; + -1; ITD ; L P#6.0; *D ; +AR1 ; L DIW [AR1,P#4.0]; T #SelectedBinTarPostion; L DIW [AR1,P#2.0]; T #SelectedBinOffset; //--Serch the selectedt bin postion end 编写完成后,进行FB测试,没有问题。但是以多重背景方式调用时,出现问题了。原因是什么了? 让大家更明白,我们约定以多重背景方式在其他FB块里面被调用的FB块称之为“子FB块”吧,调用该“子FB块”的FB块为“父FB块”吧,呵呵,有点不专业额。 大家知道在SIMENES PLC中有2个地址寄存器,AR1和AR2,以及2个数据块寄存器DB,DI。其中AR2地址寄存器和DI数据块寄存器相对特殊,主要用在FB中进行寻址。当我们在程序里进行调用FB块时,AR2寄存器类容被初始化为16#85000000.实际上在该FB期间AR2一直保持为16#85000000,当该FB块为一个“父FB块”时,在调用到“子FB块”时,AR2类容变为什么了?答案是在调用"子FB块"过程中AR2类容变为16#85000000+"子FB块"在“父FB块”中的偏移地址。但这个问题和程序出错又有什么关系了? :) 因为在“子FB块”我以 LAR1 P##Bins; 语句取出的Bins的起始地址仅仅是在”子FB块“中的偏移地址。如果“在FB块”在“父FB块”以多重背景方式调用时,我们应该为该偏移地址再加上“子FB块”在“父FB块”中的偏移地址。 说到这里我想大家应该也明白问题所在了。因此我将上面代码稍作修改,程序即可正确执行了。 //--Serch the selectedt bin postion LAR1 P##Bins; TAR2 //新增加语句,取出“子FB块"在”父FB块“中的偏移地址 +AR1 //新增语句,加上该偏移地址,从而得到BINS在“父FB块”中的偏移地址 L #InTargetBinIndex; + -1; ITD ; L P#6.0; *D ; +AR1 ; L DIW [AR1,P#4.0]; T #SelectedBinTarPostion; L DIW [AR1,P#2.0]; T #SelectedBinOffset; //--Serch the selectedt bin postion end