S7-300、S7-400系列PLC地址寻址分为直接地址寻址和间接地址寻址两大类,直接地址寻址通过指令直接对地址进行访问;间接地址寻址时地址存储于地址指针中,地址是一个变量,程序执行时才能确定实际的地址。直接地址寻址相比间接地址寻址要简单,在这里重点讲一下间接地址寻址。
间接地址寻址分为存储区间接寻址和寄存器间接寻址,前者寻址的地址指针存储于存储器中,如M、L区等,后者存储于CPU的地址寄存器AR1或AR2中。
一、存储器间接寻址
存储于存储器中的地址指针分为16位地址指针和32位地址指针,允许存储地址指针的存储器为M(标志位)、L(区域数据)及数据块(DB或DI),下面分别介绍两种地址指针的使用。
1、16位地址指针
16位地址指针用于定时器、计数器、程序块(DB、FC、FB)的寻址,16位指针被看作是一个无符号整数(取值范围0~65535),它指向定时器(T)、计数器(C)、数据块(DB、DI)或程序块(FB、FC)的号,16位指针的格式如下:
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
2^15 2^7 2^0
所有的定时器、计数器及程序块都可以使用间接寻址访问,访问时需要使用T、C、DB、DI、FC、FB等区域标识符,寻址的指针存储于一个16位的字中,地址寻址表示格式为:区域标识符[16位地址指针],例如打开一个DB表示为:
OPN DB [MW20]
打开指令 区域标识符 地址指针
使用16位地址指针访问一个定时器和计数器的示例程序如下:
L 11 //将11传送到累加器1中
T MW20 //将累加器1中的数值传送到MW20中
A I2.1 //如果I2.1为1,将预置值10s装载到T11中
L S5T#10S
SE T[MW20]
L MW20
L 1
+I
T MW22 //MW20再加1
A I2.2 //如果I2.2为1,C12向上计数一次
CU C[MW22]
从上面的示例程序中,可以看出地址指针存储于MW20中,可以使用普通指令对MW20进行操作,MW20中存储数值的为化直接影响定时器、计数器的地址。
数据块可以使用DB打开,也可以使用DI打开,如果地址指针为0,CPU不会报错,使用16位地址指针访问数据块的示例程序如下:
L 20
T MW40
OPN DB[MW40] //打开DB20
L 1
+I
T MW42
OPN DI[MW42] //打开DI21
使用16位地址指针调用程序块(FB)、FC)时,只能使用UC(无条件调用)或CC(有条件调用),而不能使用CALL指令,函数块中不能带有任何接口参数或静态变量,使用指针调用函数及函数块的示例程序如下:
L 12
T LW20
UC FC[LW20] //无条件调用FC12
L 13
T MW20
A I2.3
CCFB[MW20] //如果I2.3为1,调用FB13
FC12和FB13不能带有任何形参,这是由CC或UC调用指令决定的。
未完,待续……