any数据类型共10个字节,数据格式如下
Byte 0:固定10h 表示S7
Byte 1:表示数据类型
Byte 2,3 /Word2:表示传送的数据长度,重复因子
Byte 4,5/Word3:表示DB块号或者为0
Byte 6:表示存储区域
ANY类型占10字节
比如P#DB1.Dbx0.0 Byte 10
BYTE 0 对于S7PLC 固定是16进制10
BYTE 1 对应 数据类型,2代表是BYTE。
BYTE2到3 是重复系数,相当于P#DB1.DBX0.0 BYTE 10的数字10.
BYTE 4到5 是DB号,如果 为0,则是非DB区。
BYTE 6到9 是32位指针,即相当于P#DB1.DBX0.0 BYTE 10中的指针地址 DBX0.0 即DW#16#84000000
这个程序执行后结果为:
. 首址为Zeiger_Quelle:
. 地址Zeiger_Quelle+0单元中:存入了W#16#1002 ,即常数W#16#1002;
. 地址Zeiger_Quelle+4单元中:存入了SOURCE_DBNR,即数据块号 DB25
. 地址Zeiger_Quelle+6单元中:存入了由#Ziel_Anfang(DB块内的起始地址)左移3位并或#16#84000000运算结果。
该结果即形成的 一DB数据块某位的指针,即例如DBX96.0的指针;
. 地址Zeiger_Quelle+2单元中:存入了#Laenge,即长度。
说明:
SLD 3 //因为L #Quelle_Anfang 是字节偏移量,如果不左移,则对齐了指针的后三位是xxx 小数位
OD DW#16#8400000
上述两指令的用途:
地址寄存器是专门用于寻址的一个特殊指针区域,西门子的地址寄存器共有两个:AR1和AR2,每个32位。
当使用在区域内寄存器间接寻址中时,我们知道这时的AR中的内容只是指明数值单元,因此,区域内寄存器间接寻址时,寄存器中的内容等同于上帖中提及的存储器间接寻址中的双字指针,也就是:
其0-2bit,指定bit位,3-18bit指定byte字节。
其第31bit固定为0。
AR:0000 0000 0000 0BBB BBBB BBBB BBBB BXXX
这样规定,就意味着AR的取值只能是:0.0 ——65535.7
例如:当AR=D4(hex)=0000 0000 0000 0000 0000 0000 1101 0100(b),实际上就是等于26.4。
而在区域间寄存器间接寻址中,由于要寻址的区域也要在AR中指定,显然这时的AR中内容肯定于寄存器区域内间接寻址时,对AR内容的要求,或者说规定不同。
AR:1000 0YYY 0000 0BBB BBBB BBBB BBBB BXXX
比较一下两种格式的不同,我们发现,这里的第31bit被固定为1,同时,第24、25、26位有了可以取值的范围。
聪明的你,肯定可以联想到,这是用于指定存储区域的。
对,bit24-26的取值确定了要寻址的区域,它的取值是这样定义的:
区域标识符
26、25、24位
P(外部输入输出)
000
I(输入映像区)
001
Q(输出映像区)
010
M(位存储区)
011
DB(数据块)
100
DI(背景数据块)
101
L(暂存数据区,也叫局域数据)
111
如果我们把这样的AR内容,用HEX表示的话,那么就有:
当是对P区域寻址时,AR=800*xx
当是对I区域寻址时,AR=810*xx
当是对Q区域寻址时,AR=820*xx
当是对M区域寻址时,AR=830*xx
当是对DB区域寻址时,AR=840*xx
当是对DI区域寻址时,AR=850*xx
当是对L区域寻址时,AR=870*xx
经过列举,我们有了初步的结论:如果AR中的内容是8开头,那么就一定是区域间寻址;如果要在DB区中进行寻址,只需在8后面跟上一个40。
84000000-840FFFFF指明了要寻址的范围是:
DB区的0.0——65535.7。
例如:当AR=840000D4(hex)=1000 0100 0000 0000 0000 0000 1101 0100(b),实际上就是等于DBX26.4