寄存器间接寻址 pointer疑问
刘玉蓉
发布于2014-11-14 17:18
5
0
标签:
对pointer还是不能正确理解,困扰了好几天了,对应图中程序我写下来,那位能给逐一分析一下。下面是FC1中程序。
L P##Start_addr
LAR1
L 0
L W [AR1,P#0.0]
==I
JC _001
T #DB_No
OPN DB [#DB_No]
_001: L D [AR1,P#2.0]
LAR1
L L#0
T #Result
L #Number
BACK: T #Sycle_c
L W [AR1,P#0.0]
ITD
L #Result
+D
T #Result
+AR1 P#2.0
L #Sycle_c
LOOP BACK
在OB1中调用 FC1
CALL FC 1
Start_addr: =DB2.DBX4.0 //数据区起始地址
Number :=5 //需要累加的次数
Result:=DB2.DBD0 //保持运算结果的双整数
问题补充:
若P##Start_addr=DB2,.DBX4.0那么 W [AR1,P#0.0]就表示把pointer的前2个字节值取出来,是取的DB2.DBW4.0吗? D [AR1,P#2.0]表示取出地址标示符和地址,是DB2.DBD6吗?误区就在这个地方,理解的还是不对。望指教
图片说明: 1,1.1 2,1.2
佳答案
pointer类型占用6个字节,前2个字节有数值则表示DB号,无数值就不是DB块变量。后4个字节表示地址标示符和地址。 W [AR1,P#0.0]就表示把pointer的前2个字节值取出来和0比较,不是0则打开DB块,是0则直接运算。 D [AR1,P#2.0]表示取出地址标示符和地址,把它存放在AR1中,在下面的间接寻址中直接使用。
参见:S7-300和S7-400寻址
https://www.ad.siemens.com.cn/download/OnlineReading.aspx?DocId=1597
补充:前2个字节是DB块号,即是2。后4个字节是地址标示符(DB)和地址(4.0)。上面的文档你没有下载看吗,还是学习一下。