发布于 2014-10-12 23:37:59
8楼
这个问题我知道是什么原因,而且有很大可能性。
如果你对指针用法了解很多了,请看后面的代码,是否是你以前考虑过。是否你在指针用法中也存在盲区。也许就明白问题所在了。
你的那个FB4里面有指针的调用。这就是为什么你的一个FB5里面多次调用FB4.
你把FB4单独拉出来在非FB块内,如FC或者ob1中,调用都不会出错。
如果FB4中有指针调用时,必然用到AR1,FB4内变量寻址是以AR1作为首地址参考的。正常AR1寻址到DBX0.0或者DIX0.0.但是在FB5中调用FB4,且FB4用的是背景数据块,FB4中AR1寻址就到了背景数据块的地址,假定是DIX10.0,这样在FB4中寻址W[AR1,P#0.0]寻的是整个FB5数据块内的0.0,而不是FB4内的0.0.
解决的方法是:在FB4中先把AR2存起来,每个FB内的AR2是这个FB块的入口地址。本例中在第一次调用FB4时是DBX10.0, 先把AR2暂存,跟需要的变量地址指针相加,这样寻址才是正常的。
L ar2 ,Lar1 P#aaa //aaa是变量名,+ar1, l w[ar1,p#0.0]
自己可以去监控 AR1,AR2的值,一看就可明白。
这也是很多人认为FB块的调用跟外部数据没关系,比FC块容易用。在什么地方运行结果都一样。但是如果是有指针调用时,请加上几句
//---正确做法,保险做法
L AR2
LAR1 P#AAA
+AR1
L W[AR1,P#0.0] //或者其他的用,这个时候,AR1才是你的正确寻址地址。
//----不完善做法,可能会出错的做法
LAR1 P#AAA
L W[AR1,P#0.0]
//---
如果该FB没有被多重背景包含,就没有问题。
若是在多重背景中,寻址就不是你想象的那样了。
例如该FB的多重背景编址从DIX10.0,
AAA,在FB内用的地址是DIX2.0;
在 LAR1 P#AAA,中AR1寻址到了,整个大DB块的DIX2.0,而不是DIX12.0(DIX10.0+2.0),
这个时候你的间接寻址就错了。