欢迎来到西门子工业支持中心网站!
欢迎来到西门子工业支持中心网站!
悬赏:10西币 | 解决时间:2015-10-22 19:13
产品版区:
SIMATIC S7-300(F)/S7-400(F/H/FH)
zxs1710
//////////////////////////////// buffer声明为pointer输入变量,DB_ID声明为word临时变量
L P##buffer ///读取指针基址,父程序调用时,buffer=DB2.DBX0.0
LAR2 ///装入AR2
L W [AR2,P#0.0] ///这时读取是到底是什么?一直没有搞清楚,仿真读的是2,2是DB块号,但不知道为什么是2?我曾经有两种理解,一种理解是:在前述DB2中,读取以指针(基址+偏移)寻找到的字,就是在DB2中第0个字,似乎不对。另一种理解是:以指针(基址+偏移)作为一个双字数据,读取它的一个低字,这个低字包含DB号信息,但这个理解也说不通。两种理解似乎都不能与西门子的说法相符?西门子说pointer类型是6字节,而AR是4字节,6字节对4字节?
T #DB_ID ///作为DB号
OPN DI [#DB_ID] ///将这个DB作为背景数据块打开
L D [AR2,P#2.0] ///此处也有同样的疑问?还有偏移量(+P#2.0)是以字节为单位加的,还是以前面数据宽度(比如双字D)为单位加的?
LAR2 ///装入AR2
以问题上希望前辈们解释一下,看过很多网上的解释和西门子的说法一直没搞清楚,头大了!
小程序:
最佳答案
如果下面 再有 L W[AR2,P#2.0] 就相当于 L DB2.DBW2了 ,不在指向LW22了。
回答者:
Letham
回答时间:2015-10-19 11:07
提问者对于答案的评价:
谢谢热心回答,明白了
补充一个问题:
L P##ABC
ABC除了声明为POINTER外,还能声明为其它类型吗?若有请举例回答。
(关于P##ABC我之前的理解是:P#(#ABC),#ABC是局部符号变量,前面P#是把后面的变量指针化,不知对否?)
最佳答案作者回复:
可以是为其它类型,比如更复杂的ANY,用法类似POINTER 只不过ANY 占 10字节
更简单的 变量类型 比如 L P#M5.0 L P#DBX0.0 L P##L0.0
关于P##ABC我之前的理解是:P#(#ABC),#ABC是局部符号变量,前面P#是把后面的变量指针化,不知对否?)
可以这么理解。对 于 形参注意有个参数传递的过程是用到L区(实际上是V区,一种特殊的L区)
如果 对 FB STAT变量 进行 P##XXX,实际上就是取出XXX的偏移地址。
专家置评
已阅,最佳答案正确。好需要了解变量的直接寻址和间接寻址、存储器间接寻址和寄存器间接寻址、寄存器内部区域间接寻址和交叉区域间接寻址等知识点。
置评专家:西门子自动化技术支持 2015-10-23 09:52
L P##buffer ///读取指针基址,buffer=DB2.DBX0.0
LAR2 ///装入AR2
L W [AR2,P#0.0] /// 这个时候读取的是DB号,就是2
T #DB_ID ///作为DB号
OPN DI [#DB_ID] ///将这个DB作为背景数据块打开
L D [AR2,P#2.0] ///这里读取的DB2.DBX0.0的地址
LAR2 ///装入AR2
西门子说pointer类型是6字节:前面的两个字节,用来存放DB号,后面的四个字节用来存放数据的地址;L W [AR2,P#0.0] 是DB块的号,是一个字,而 L D [AR2,P#2.0] 地址,是双字;
见附图:
关键你是没有把Pointer指针存储格式看明白。格式见附图。
对于Pointer指针格式,前2个字节存储的就是DB块号,或者不是DB块变量的就是0。后4个字节存储的就是变量的实参地址。这是西门子Pointer指针固定格式。
楼主不要死钻你的程序,建议你先看看下述资料,看过后便可解决你自己的问题了。不然你再遇到指针问题还是一头雾水。给你渔,不是给你鱼。见:
、《关于S7-300和S7-400指针寻址的说明与例程(更新版)》下载:
http://www.ad.siemens.com.cn/download/SearchResult.aspx?searchText=F0215
、《S7-300/400PLC ANY指针使用详解》连接:
http://blog.sina.com.cn/s/blog_669692a601019hvt.html
现赠您1张1847体验会员卡,可免费领取,畅学1847会员内容,是否领取?
欢迎您访问支持中心!
丰富的视频,全方位的文档,大量的网友交流精华……
为了更好的完善这些内容,我们诚邀您在浏览结束后,花20秒左右的时间,完成一个用户在线调查!
感谢您的支持!