quote:以下是引用晓星汝在2013-02-28 12:44:12的发言:quote:以下是引用YiMoon在2013-02-28 12:33:54的发言:quote:以下是引用youhm在2013-02-27 13:32:34的发言:quote:以下是引用晓星汝在2013-02-27 13:20:16的发言:quote:以下是引用youhm在2013-02-26 23:23:44的发言:
楼主这个问题是多重背景数据块使用中需要注意的一个地方,在多重背景调用的FB块里使用 L P##IN0这样获取变量IN0的地址是相对地址,并不是在多重背景数据块里的绝对地址,需要加上AR2里的偏移量才能得到真实的地址,你的代码可以改成
LAR1 AR2
L P##IN0
AD DW#16#FFFFFF
+AR1
L W [AR1,P#0.0]
T #TEMP1
L D [AR1,P#2.0]
T #TEMP2
OPN DB [#TEMP1]
L DBW [#TEMP2]
T #IN_OUT1
奇侠同志正解,谢谢。不过貌似 AD DW#16#FFFFFF这句多余?
的确多余了,+AR1只涉及累加器的低字。
怎么可能多余?
LAR1 AR2 // 得到的数据为DBX0.0(假设是第一个DB块,十六进制84000000)
L P##IN0 //得到的数据为DIX12.0(假设是其中一个参数地址,十六进制85000050)
AD DW#16#FFFFFF //与之后,就为12.0(不与的话,怎么相加,一个是DBX,一个是DIX,84000000 +85000050,加出来是什么了?如果与之后,84000000 + 50 =84000050,就刚好是DBX12.0)
+AR1 //AR1为DBX12.0
这里有个问题,背景数据块最后是用DIX来赋值,所以程序改一下
TAR2
AD DW#16#FFFFFF
LAR1 P##IN0
+AR1
嗯,都有道理,不过这样更稳妥些
TAR2
AD DW#16#7FFFF
L P##IN0
+D
LAR1
各位还有何高见没有呢
你这个是多余了,要么你用AR1来做,要么就用累加器做
你把最后一个LAR1删除,就是累加器的方法,加了LAR1,就是画蛇添足了