间接寻址的问题(S7 300 400应用技术(第三版) 162-163内容)

L   P# M6.0
LAR1
L   W[AR1,P#20.0] 这个取出的是MW26 ,很好理解
L   P##start(#start是一功能块的输入 数据类型pointer)
LAR1
L   0
L   W[AR1,P#0.0]这个为什么取出的是指针的前两字节(数据所在数据块的编号)
== I
我怎么觉得它取出的应该是输入本身呀,而不是指针的前两字节,没搞明白后一段和前一段区别在哪?

最佳答案

1:首先请参见,我发的附件POINTER 结构
2:POINTER  是个参数类型,不是数据类型。它占用了6个字节。根据名称你可以吧它叫着指向指针的指针。

当你在某个块里面调用 你这个FC者FB时,在实参到形参传递过程中,系统会把POINTER 参数类型 的数据保存到 调用者的L区里面。
当你在被调用者(FC)里面 对POINTER 类型进行引用时,必须对POINTER(指向指针的指针)进行分析。
L   P##start(#start是一功能块的输入 数据类型pointer) 
LAR1   //将POINTER 参数类型的首地址存入AR1,此时AR1 类容 应该为DW#16#87xxxxxxxx指向指针的指针。
然后 你可以根据 POINTER 参数类型的结构可知。
W [AR1,P#0.0]   就是来自实参的DB号(如果不是DB区则为0)

D[AR1,P#0.0] 这个才是地址指针 . 
这个时候 如果你执行 LAR1 AR1里面的类容和执行下面语句后的AR1类容里面内容相近了,就是 我们通常说的32位地址指针
L P#M50.0
LAR1  
类似的参数类型还有ANY ,它占用10个字节。

图片说明:

间接寻址的问题(S7 300 400应用技术(第三版) 162-163内容)  

提问者对于答案的评价:
谢谢你的回答,刚又看了下那本书,上面讲的很清楚了,参数类型为pointer,那个#start已经是地址了,和P##start实际上是地址的地址所以W[AR1,P#0.0]指向的是地址

最佳答案作者回复:
实际上指针指向调用FC 的 程序块的L区,也就是FC 里面的V区。这个V区是一个比较特殊的L区。

原创文章,作者:more0621,如若转载,请注明出处:https://www.zhaoplc.com/plc229917.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2018年12月1日 上午4:10
下一篇 2018年12月1日 上午4:10

相关推荐