LP#M6.0
LAR1
LW[AR1,P#20.0]这个取出的是MW26,很好理解
LP##STaRT(#start是一功能块的输入数据类型pointer)
LAR1
L0
LW[AR1,P#0.0]这个为什么取出的是指针的前两字节(数据所在数据块的编号)
==I
我怎么觉得它取出的应该是输入本身呀,而不是指针的前两字节,没搞明白后一段和前一段区别在哪?
最佳答案
1:首先请参见,我发的附件POINTER结构
2:POINTER是个参数类型,不是数据类型。它占用了6个字节。根据名称你可以吧它叫着指向指针的指针。
当你在某个块里面调用你这个FC者fb时,在实参到形参传递过程中,系统会把POINTER参数类型的数据保存到调用者的L区里面。
当你在被调用者(FC)里面对POINTER类型进行引用时,必须对POINTER(指向指针的指针)进行分析。
LP##start(#start是一功能块的输入数据类型pointer)
LAR1//将POINTER参数类型的首地址存入AR1,此时AR1类容应该为DW#16#87xxxxxxxx指向指针的指针。
然后你可以根据POINTER参数类型的结构可知。
W[AR1,P#0.0]就是来自实参的DB号(如果不是DB区则为0)
D[AR1,P#0.0]这个才是地址指针.
这个时候如果你执行LAR1AR1里面的类容和执行下面语句后的AR1类容里面内容相近了,就是我们通常说的32位地址指针
LP#M50.0
LAR1
类似的参数类型还有ANY,它占用10个字节。
图片说明:
1b2aec5373e4cbb758e777b46CE4e057
提问者对于答案的评价:
谢谢你的回答,刚又看了下那本书,上面讲的很清楚了,参数类型为pointer,那个#start已经是地址了,和P##start实际上是地址的地址所以W[AR1,P#0.0]指向的是地址
最佳答案作者回复:
实际上指针指向调用FC的程序块的L区,也就是FC里面的V区。这个V区是一个比较特殊的L区。