北岛夜话
原创工业智能控制领域(PLC、单片机/嵌入式、机器人、通信、机器视觉)的技术及经验分享。
文章545 浏览8637535

西门子S7系列PLC的寻址方式(2)

上一篇文章我们介绍了西门子S7系列PLC(300/400/1500)的寻址方式,讲解了直接寻址(绝对寻址和符号寻址)及间接寻址的一种——存储器间接寻址,今天这篇文章我们介绍下另一种间接寻址方式:寄存器间接寻址。

cover.jpg所谓寄存器间接寻址,是指通过CPU的地址寄存器(Address Register)进行的寻址方式。S7-300/400系列PLC有两个地址寄存器,AR1和AR2,其长度均为32位,内部存放32位的地址指针,指针指向要寻址的存储单元。

我们先来看下寄存器间接寻址的指针格式(32位):

32_pointer_reg.png

其中,第0~2位是被寻址地址的位(bit)编号;第3~18位是被寻址地址的字节(Byte)编号;第24~26位,是被寻址地址的区域标识(编号);第31位是寻址的类型,“0”表示区域内间接寻址,“1”表示区域间间接寻址。

寄存器间接寻址可以分为两种:区域内寻址和区域间寻址,根据第31位的值来确定。

所谓区域内寻址,是指指针中仅包含寻址的存储区的字节编号和位编号,存储区的代码在指令中给出。寄存器区域内间接寻址的指针的第24~26位的区域标识符为0,第31位也为0;

所谓区域间寻址,是指指针中不仅包含了寻址的存储区的字节编号和位编号,还包含了存储区的标识符(第24~26)代码。存储区标识符用来指定寻址区域,比如:I、M、Q等,具体编号如下图:

reg_code.png

寄存器区域内寻址的表达方式:存储器标识符[ARx,地址偏移量];

比如下面这段代码:

address_in_one_reg.png

前两行将指针常数(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,地址偏移量]

比如下面这段代码:

address_in_another_reg.png

P#M6.0对应的二进制值为:1000 0011  0000 0000 0000 0000 0011 0000。

前两行代码将位存储器指针P#M6.0加载到AR1中,由于指针中包含了存储区代码(011),因此程序中不用写存储区标识符,只需要指定访问的宽度即可。上例中的第三行的代码会将MW8的内容装载到累加器1(ACCU1)中。

顺便说一句,如果要使用寄存器指针访问一个字节、字或者双字时,必须保证指针的位编号为0。寄存器间接寻址相对来说有些难度,建议在实践中使用以加深理解。

相关参考文章:

西门子S7系列PLC的寻址方式(1)

官网提供本文PDF版本下载


已经过安全软件检测无毒,请您放心下载。

取消

感谢您的支持,欢迎常来看看!

扫码支持
一点动力,多少随意

打开支付宝扫一扫,即可进行扫码打赏哦

发表评论