回复:1个奇怪的指针用法

emil128

  • 帖子

    271
  • 精华

    10
  • 被关注

    21

论坛等级:侠圣

注册时间:2011-05-16

普通 普通 如何晋级?

发布于 2013-09-10 22:14:59

13楼

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区传递,导致结果异常。
评论
编辑推荐: 关闭

请填写推广理由:

本版热门话题

SIMATIC S7-300/400

共有54711条技术帖

相关推荐

热门标签

相关帖子推荐

guzhang

恭喜,你发布的帖子

评为精华帖!

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

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

  • 分享

  • 只看
    楼主

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