上一篇文章我们介绍了西门子S7系列PLC(300/400/1500)的寻址方式,讲解了直接寻址(绝对寻址和符号寻址)及间接寻址的一种——存储器间接寻址,今天这篇文章我们介绍下另一种间接寻址方式:寄存器间接寻址。
所谓寄存器间接寻址,是指通过CPU的地址寄存器(Address Register)进行的寻址方式。S7-300/400系列PLC有两个地址寄存器,AR1和AR2,其长度均为32位,内部存放32位的地址指针,指针指向要寻址的存储单元。
我们先来看下寄存器间接寻址的指针格式(32位):
其中,第0~2位是被寻址地址的位(bit)编号;第3~18位是被寻址地址的字节(Byte)编号;第24~26位,是被寻址地址的区域标识(编号);第31位是寻址的类型,“0”表示区域内间接寻址,“1”表示区域间间接寻址。
寄存器间接寻址可以分为两种:区域内寻址和区域间寻址,根据第31位的值来确定。
所谓区域内寻址,是指指针中仅包含寻址的存储区的字节编号和位编号,存储区的代码在指令中给出。寄存器区域内间接寻址的指针的第24~26位的区域标识符为0,第31位也为0;
所谓区域间寻址,是指指针中不仅包含了寻址的存储区的字节编号和位编号,还包含了存储区的标识符(第24~26)代码。存储区标识符用来指定寻址区域,比如:I、M、Q等,具体编号如下图:
寄存器区域内寻址的表达方式:存储器标识符[ARx,地址偏移量];
比如下面这段代码:
前两行将指针常数(P#5.0)加载到AR1中,第三行对M6.1进行与运算,结果存放到Q7.5中。指针常数P#5.0的二进制数为:2#0000 0000 0000 0000 0000 0000 0010 1000,可见它的第24~26位及第31位均为0。由于指针中不包含存储区标识符信息,所以必须在程序中指定。
再来看看寄存器区域间寻址,其表达方式为:访问宽度[ARx,地址偏移量];
比如下面这段代码:
P#M6.0对应的二进制值为:1000 0011 0000 0000 0000 0000 0011 0000。
前两行代码将位存储器指针P#M6.0加载到AR1中,由于指针中包含了存储区代码(011),因此程序中不用写存储区标识符,只需要指定访问的宽度即可。上例中的第三行的代码会将MW8的内容装载到累加器1(ACCU1)中。
顺便说一句,如果要使用寄存器指针访问一个字节、字或者双字时,必须保证指针的位编号为0。寄存器间接寻址相对来说有些难度,建议在实践中使用以加深理解。
相关参考文章:
官网提供本文PDF版本下载:
发表评论