回复:多重背景运行时莫名出错

牧歌2050

  • 帖子

    24
  • 精华

    1
  • 被关注

    2

论坛等级:游士

注册时间:2014-03-16

普通 普通 如何晋级?

发布于 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),
这个时候你的间接寻址就错了。
评论
编辑推荐: 关闭

请填写推广理由:

本版热门话题

SIMATIC S7-300/400

共有54616条技术帖

相关推荐

热门标签

相关帖子推荐

guzhang

恭喜,你发布的帖子

评为精华帖!

快扫描右侧二维码晒一晒吧!

再发帖或跟帖交流2条,就能晋升VIP啦!开启更多专属权限!

  • 分享

  • 只看
    楼主

top
您收到0封站内信:
×
×
信息提示
很抱歉!您所访问的页面不存在,或网址发生了变化,请稍后再试。