回复:FB编程疑问:间接寻址问题?

老学童

  • 帖子

    765
  • 精华

    32
  • 被关注

    65

论坛等级:奇侠

注册时间:2011-06-22

钻石 钻石 如何晋级?

发布于 2015-03-26 13:45:45

8楼

展开查看
以下是引用dudongdong在2015-03-25 18:52:19的发言 >6楼:出现这种情况的原因在于,STEP7在创建FB时,块属性默认是“具有多实例能力的”
所以,当我们创建的FB没有被更高级的FB调用时,即不存在“多重背景模型”的时候,AR2总是指向P#DBX0.0的,
也就是说FB的声明参数总是从DBX0.0开始定义的。但是LAR2 P##TUse这条语却使AR2指向了P#DIX5.0
那么FB的声明参数就会从DBX5.0开始定义
即你看到的
var_IN
Clear Bool 0.0实际上是从DBX5.0处定义的,那么执行
A DIX[AR2,P#0.0]后就相当于A #Clear,而不是 A TUse .0
要想A TUse.0,就得写成A DIX[AR2,P#5.0]
或者将块属性‘具有多重实例能力’的钩去掉,这样A DIX[AR2,P#0.0]就同A TUse.0一样了。
个人认为,背景数据块是FB特有的,而AR2地址寄存器在FB中背景DB寻址时永远从背景数据块首地址开始寻址,即无论程序前面AR2如何赋值,DI? [AR2,P#0.0]永远指向背景数据块首地址。
“FB的声明参数就会从DBX5.0开始定义”的说法不正确。
从以下DB1在线状态可以看出,FB声明参数的地址不会发生改变



用楼主的程序举个反例
A #Clear
L 0
T #INIT
SET
LAR1 P##TApply
LAR2 P#100.0 //这里给AR2任意赋值,例如:LAR2 P#M10.0等
SET
A DIX [AR2,P#0.0] //这里同样也会变成 #Clear
A DIX [AR1,P#0.0]
= #OK
也就是说前面无论AR2怎样赋值,DI?[AR2, P#0.0]的AR2总是指向DIX0.0。
因为,AR2并不是仅仅用于背景数据寻址,如果在程序前面AR2曾用于共享数据块或其它存储区寻址,当用AR2在背景数据块寻址时,DI?[AR2, P#0.0]会自动指向背景数据块首地址。
人的生命似洪水在奔流,不遇着岛屿、暗礁,难以激起美丽的浪花。
评论
编辑推荐: 关闭

请填写推广理由:

本版热门话题

SIMATIC S7-300/400

共有54658条技术帖

相关推荐

热门标签

相关帖子推荐

guzhang

恭喜,你发布的帖子

评为精华帖!

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

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

  • 分享

  • 只看
    楼主

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