quote:以下是引用bosszhang在2013-09-10 15:02:35的发言:
大家都是在学习。指针寻址功能我也用了很多。这是第1次看到这样的用 法。v 区其实也 好理解 :pointer any 类型的数据地址信息被放到了V区 。当然我们也是学习到的。西门子解释的少。
在线看过 ,当然肯定是1184.0 高16位 是16#8000 ,
我的理解是 在 word 地址传递过程中 地址被放到了32位的某个零时存储区,类似V区。并左移3位 ,以
byte.bit 形式保持。 p## word 作用就是就把零时存储区地址作为指针。
只能这样强制理解了。
我觉得问题主要是楼主一直纠结于#Startadress是WORD型,于是大家跟着使劲就往上面想了。
但是事实上程序中根本没有使用过#Startadress,而是用的P##Startadress,作为P指针可不是word而是32位的指针。
换句话说定义这个变量不是要用它的内容,而是它的地址。
这里涉及到2个问题
1、FC的形参传递问题,PI区的实参在传递到形参时是直接传递的,不需要经过V区。所以L P##Startadress直接就得到是PI区的地址,所以这段程序能正确运行,如果真的经过V区转换,那L P##Startadress得到的就是V区的地址了,那么这段程序结果肯定就要出错了。
2、32位指针指向地址的起始位,不包含长度。所以PIW1184在作为P指针读取时,得到的其实是PI1184.0(虽然PI区域不允许位寻址的,但指针指向位还是允许的)。
于是乎Startadress是什么类型的数据变得无关紧要
可以定义为BYTE,输入写PIB1184
可以定义为WORD或INT,输入写PIW1184
可以定义为DWORD或REAL,输入写PID1184
结果都一样可以正常运行。
不过不能定义为pointer、any或array等复杂数据类型,因为这样会像第1条说的,经过V区传递,导致结果异常。