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个字节。
图片说明:
提问者对于答案的评价:
谢谢你的回答,刚又看了下那本书,上面讲的很清楚了,参数类型为pointer,那个#start已经是地址了,和P##start实际上是地址的地址所以W[AR1,P#0.0]指向的是地址
最佳答案作者回复:
实际上指针指向调用FC 的 程序块的L区,也就是FC 里面的V区。这个V区是一个比较特殊的L区。
原创文章,作者:more0621,如若转载,请注明出处:https://www.zhaoplc.com/plc229917.html