1.存储器间接寻址
s7-300/400的存储器间接寻址方式与s7-200 plc相比,在实际使用中具有两方面明显的区别:
①在s7-300/400中,间接寻址不需要建立指针的过程,可以直接在寻址对象的前面加“【]”标记,表示该寻址对象为间接寻址。
②间接寻址可以用于二进制位地址。
【例1】通过局部变量ld10,将输入i22.2读入,与io.o进行“与”运算,结果输出到qo.1的程序如下:
lp#22.2 //二进制位数据22.2读入累加器;
tld10 //二进制位数据22.2传送到局部变量ld1o中:
ai[ldio] //读入由ldio确定的输入点;
aio.o //与io.o进行“与”运算;
=qo,l //结果输出到qo.1
以上指令等效于指令:
ai22.2
aio.o
=qo.1
2.寄存器间接寻址
s7-300/400的寄存器间接寻址是一种利用指针寄存器进行偏移的间接寻址方式,格式为[ar1,m]或[ar2,m],间接寻址所指定的存储器地址为指针寄存器ar1或ar2的内容与m之和。
指针寄存器ar1或ar2为双字长寄存器,可以同时存储地址、字节、位等信息,因此,寻址不仅可以在存储器自身的区域内进行(如内部标志m之间、输入i之间等),而且可以在不同的区域内进行(如由内部标志m到输入i等)。
寄存器各位所代表的含义如下:
地址位(bit31):“0”指针寄存器不含地址符,地址符bit24~bit26应为0:
“1”指针寄存器含地址符,地址符由bit24~bit26指定。
地址符(bit24~bit26):地址位(bit31)为“1”时用于指定存储器地址,地址的编码如下:
000:地址p:
001:地址i;
010:地址q;
011:地址m;
100:地址dbx;
101:地址dix;
111:地址l。
字节编号(bit18~bit3):指定存储器的字节地址,范围为0~65535。
位编号(bit2~bit0):指定存储器的位地址,范围为0~7。
指针寄存器可以不含地址符,此时,指针寄存器只需要写入二进制的字节与位数据,地址由逻辑运算指令指定。
【例2】通过指针寄存器偏移二进制位22.2后,将i32.3读入,与io.o进行“与”运算,结果输出到qo.1的程序如下:
lp#22.2 ∥二进制位数据22.2读入累加器1:
lari //累加器l的内容读入指针寄存器arl:
ai[arl,p#10.1] //将二进制位数据10.1与指针寄存器ari内容相加,进行间接寻址:
aio.o //与io.o进行“与”运算:
qo.1 //结果输出到qo.1;
以上指令等效于指令:
ai32.3
aio.o
=qo.1
在使用二进制位数据时应注意,开关量输入/输出的单位为字节,因此,进行指针寄存器偏移时应利用8进制数进行计算。
【例3】通过指针寄存器偏移二进制位数据10.5后,将i21.4读入,与io.o进行“与”运算,结果输出到qo.1的程序如下:
lp#10.5 ,/将二进制位数据10.5读入累加器1:
lari //将累加器l的内容写入指针寄存器arl;
ai[ari, p#10.7] //将二进制位数据10.7与指针寄存器ari内容相加,进行间接寻址;
aio.o ∥与io.o进行“与”运算;
=qo.i //结果输出到qo.1:
以上指令等效于指令:
ai21.4
aio.o
=qo.l
指针寄存器可以含地址符,此时,指针寄存器需要同时写入地址、二进制的字节与位数据,逻辑运算指令不再需要指定地址。
【例4]将m6.0作为地址指针,将输入iw10的内容写入到mw56中的程序如下:
l p#m6.0 //将地址数据m6.0读入累加器l; ’
l ar1 ∥将累加器l的内容写入指针寄存器ari;
l iwio //将iwio的内容读入累加器1:
t w[ari,p#50.0】 /将累加器l的内容写入到mw56(目标地址利用间接寻址方式)
由于本例属于存储器区域内部寻址,且指针寄存器已经包含了地址m,逻辑运算指令不再需要指定地址。以上指令等效于指令:
liw10
tmw56