回复:寄存器间接寻址的问题

Letham

西门子1847工业学习平台

  • 帖子

    2023
  • 精华

    43
  • 被关注

    360

论坛等级:至圣

注册时间:2006-04-15

钻石 钻石 如何晋级?

发布于 2015-01-08 20:23:34

20楼

quote:以下是引用LJCLWYF在2015-01-06 16:30:52的发言:
回letham老师:我监控过背景db,正如你说的情况。但是我不知道为什么不能将#b的address的db1.dbw8的起始地址读不到ar1里?监控#b(没有加ar2)时的情况如下:
程序 ar1 ar2
l p#address db8.0 db14.0
lar1 di2.0 ..(同上)
l w[ar1,p#0.0] .. ..
t db_no .. ..
l d[ar1,p#2.0] .. ..
lar1 db0.0 ..//这里为什么是db0.0,而不是我输入的db8.0
opn db[db_no] db0.0 db14.0
l 4 .. ..
c1:t temp2 db6.0 ..//这里为什么是db6.0
后面ar1和ar2的值就分别是db6.0和db14.0,而且监控#a时除了ar2的值变成了db0.0以外,ar1的值和#b是一样的。
而且这时的执行结果就是我7楼说的结果。
我把fb1的address改成双字,然后l p#0.0; t md100
l p#8.0; t md104
把md100给#a的address,
把md104给#b的address,不加ar2,结果正确。是什么原因必须要按照PKH2006老师的做法才对呢?


首先,你需要知道 POINTER类型是一个指向指针的指针,它不是直接的32位指针。
实参到形参的传递是要用到调用者的参数区,你的程序里,就是DI。
在对POINTER进行使用前,必须对POINTER进行分析。
你 这样编写 也是没有问题的,建议你 监控下DB1和DB2寄存器内容,
同时看看 你的背景DB块的 DBW2和DBD4 的数值 是不是1和DW#16#84000040。
具体问题,你还需自己检查下,是不是后面还有类似的背景FB的调用 覆盖了AR1的内容。
人生就像一场旅行!
评论
编辑推荐: 关闭

请填写推广理由:

本版热门话题

SIMATIC S7-300/400

共有54618条技术帖

相关推荐

热门标签

相关帖子推荐

guzhang

恭喜,你发布的帖子

评为精华帖!

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

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

  • 分享

  • 只看
    楼主

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