首页 资讯 应用 高压 设计 行业 低压 电路图 关于

PLC

旗下栏目: PLC 嵌入式 单片机 DCS

详解西门子PLC间接寻址

PLC | 发布时间:2018-07-09 | 人气: | #评论# | 本文关键字:西门子,PLC,间接寻址
摘要:完整一条指令,应该包含指令符 + 操作数(当然不包括那些单指令,比如 NOT 等)。其中操作数是指令要执行目标,也就是指令要进行操作址。 我们知道, PLC 中划有各种用途存储区,比如物理

完整一条指令,应该包含指令符+操作数(当然不包括那些单指令,比如NOT等)。其中操作数是指令要执行目标,也就是指令要进行操作址。我们知道,PLC中划有各种用途存储区,比如物理输入输出区P、映像输入区I、映像输出区Q、位存储区M、定时器T、计数器C、数据区DBL等,同时我们还知道,每个区域可以用位(BIT)、字节(BYTE)、字(WORD)、双字(DWORD)来衡量,说来指定确切大小。当然定时器T、计数器C不存这种衡量体制,它们仅用位来衡量。由此我们可以到,要描述一个址,至少应该包含两个要素:

1、存储区域

2、这个区域中具体位置

  比如:A Q2.0

  其中A是指令符,Q2.0A操作数,也就是址。这个址由两部分组成:

Q:指是映像输出区

2.0:就是这个映像输出区第二个字节第0位。

  由此,我们出, 一个确切址组成应该是:

  〖存储区符〗〖存储区尺寸符〗〖尺寸数值〗.〖位数值〗,例如:DBX200.0

DB X 200 . 0

  其中,我们又把〖存储区符〗〖存储区尺寸符〗这两个部分合称为:址标识符。这样,一个确切址组成,又可以写成:

  址标识符 + 确切数值单元

  【间接寻址概念】

  寻址,就是指定指令要进行操作址。给定指令操作址方法,就是寻址方法。

  谈间接寻址之前,我们简单了解一下直接寻址。所谓直接寻址,简单说,就是直接给出指令确切操作数,象上面所说,A Q2.0,就是直接寻址,A这个指令来说,Q2.0就是它要进行操作址。

  这样看来,间接寻址就是间接给出指令确切操作数。对,就是这个概念。

  比如:A Q[MD100] A T[DBW100]。程序语句中用方刮号 [ ] 标明内容,间接指明了指令要进行址,这两个语句中MD100DBW100称为指针Pointer,它指向它们其中包含数值,才是指令真正要执行址区域确切位置。间接由此名。

  西门子间接寻址方式计有两大类型:存储器间接寻址和寄存器间接寻址。

  【存储器间接寻址】

  存储器间接寻址址给定格式是:址标识符+指针。指针所指示存储单元中所包含数值,就是址确切数值单元。

  存储器间接寻址具有两个指针格式:单字和双字。

  单字指针是一个16bit结构,从0-15bit,指示一个从0-65535数值,这个数值就是被寻址存储区域编号。

  双字指针是一个32bit结构,从0-2bit,共三位,8进制指示被寻址位编号,也就是0-7;而从3-18bit,共16位,指示一个从0-65535数值,这个数值就是被寻址字节编号。

  指针可以存放MDIDBL区域中,也就是说,可以用这些区域内容来做指针。

  单字指针和双字指针使用上有很大区别。下面举例说明:

L DW#16#35 //3216进制数35存入ACC1

T MD2 //这个值再存入MD2,这是个32位位存储区域

L +10 //16位整数10存入ACC13216进制数35自动移动到ACC2

T MW100 //这个值再存入MW100,这是个16位位存储区域

OPN DB[MW100] //打开DB10。这里[MW100]就是个单字指针,存放指针区域是M区,

MW100中值10,就是指针间接指定址,它是个16位值!

--------

L L#+10 //32位形式,把10放入ACC1,此时,ACC2中内容为:16位整数10

T MD104 //这个值再存入MD104,这是个32位位存储区域

A I[MD104] //I1.2进行与逻辑操作!

=DIX[MD2] //赋值背景数据位DIX6.5

--------

A DB[MW100].DBX[MD2] //读入DB10.DBX6.5数据位状态

=Q[MD2] //赋值给Q6.5

--------

A DB[MW100].DBX[MD2] //读入DB10.DBX6.5数据位状态

=Q[MW100] //错误!!没有Q10这个元件

---------------------------------------------------------------------------------------------------

  从上面系列举例我们至少看出来一点:

  单字指针只应用址标识符是非位情况下。确,单字指针前面描述过,它确定数值是0-65535,而byte.bit这种具体位结构来说,只能用双字指针。这是它们第一个区别,单字指针另外一个限制就是,它只能对TCDBFCFB进行寻址,通俗说,单字指针只可以用来指代这些存储区域编号。

  相单字指针,双字指针就没有这样限制,它可以对位址进行寻址,还可以对BYTEWORDDWORD寻址,没有区域限制。,有必有失,对非位区域进行寻址时,必须确保其0-2bit为全0

  总结一下:

  单字指针存储器间接寻址只能用址标识符是非位场合;双字指针有位格式存,对址标识符没有限制。也正是双字指针是一个具有位指针,,当对字节、字双字存储区址进行寻址时,必须确保双字指针内容是8倍数。

  现,我们来分析一下上述例子中A I[MD104] 为什么最后是对I1.2进行与逻辑操作。

L L#+10 ,我们知道存放MD104中值应该是:

MD1040000 0000 0000 0000 0000 0000 0000 1010

  当作为双字指针时,就应该3-18bit指定byte0-2bit指定bit来确定最终指令要操作址,:

0000 0000 0000 0000 0000 0000 0000 1010 = 1.2

  详解西门子间接寻址<2>

  【址寄存器间接寻址】

  先前所说存储器间接寻址中,间接指针用MDBDIL直接指定,就是说,指针指向存储区内容就是指令要执行确切址数值单元。但寄存器间接寻址中,指令要执行确切址数值单元,并非寄存器指向存储区内容,也就是说,寄存器本身也是间接指向真正址数值单元。从寄存器到出真正址数值单元,西门子提供了两种途径:

1、区域内寄存器间接寻址

2、区域间寄存器间接寻址

  址寄存器间接寻址一般格式是:

  〖址标识符〗〖寄存器,P#byte.bit〗,比如:DIX[AR1,P#1.5] 或 M[AR1,P#0.0] 

  〖寄存器,P#byte.bit〗统称为:寄存器寻址指针,而〖址标识符〗上帖中谈过,它包含〖存储区符〗+〖存储区尺寸符〗。但这里,情况有所变化。比较一下刚才例子:

DIX [AR1,P#1.5]

X [AR1,P#1.5]

DIX可以认为是我们通常定义址标识符,DI是背景数据块存储区域,X是这个存储区域尺寸符,指是背景数据块中位。但下面一个示例中M呢?X指定了存储区域尺寸符,那么存储区域符哪里呢?毫无疑问,AR1中!

DIX [AR1,P#1.5] 这个例子,要寻址址区域事先已经确定,AR1可以改变这个区域内确切址数值单元,我们称之为:区域内寄存器间接寻址方式,相应,这里[AR1,P#1.5] 就叫做区域内寻址指针。

X [AR1,P#1.5] 这个例子,要寻址址区域和确切址数值单元,都未事先确定,确定了存储大小,这就是意味着我们可以不同区域间不同址数值单元以给定区域大小进行寻址,称之为:区域间寄存器间接寻址方式,相应,这里[AR1,P#1.5] 就叫做区域间寻址指针。

  既然有着区域内和区域间寻址之分,那么,同样AR1中,就存有不同内容,它们代表着不同含义。

  【AR格式】

  址寄存器是专门用于寻址一个特殊指针区域,西门子址寄存器共有两个:AR1AR2,每个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=D4hex=0000 0000 0000 0000 0000 0000 1101 0100b),实际上就是等于26.4

  而区域间寄存器间接寻址中,要寻址区域也要AR中指定,显然这时AR中内容肯定于寄存器区域内间接寻址时,对AR内容要求,说规定不同。

AR

1000 0YYY 0000 0BBB BBBB BBBB BBBB BXXX

  比较一下两种格式不同,我们发现,这里第31bit被固定为1,同时,第242526位有了可以取值范围。聪明你,肯定可以联想到,这是用于指定存储区域。对,bit24-26取值确定了要寻址区域,它取值是这样定义:

  区域标识符

262524

P(外部输入输出)

000

I(输入映像区)

001

Q(输出映像区)

010

M(位存储区)

011

DB(数据块)

100

DI(背景数据块)

101

L(暂存数据区,也叫局域数据)

111

  我们把这样AR内容,用HEX表示话,那么就有:

  当是对P区域寻址时,AR=800xxxxx

  当是对I区域寻址时,AR=810xxxxx

  当是对Q区域寻址时,AR=820xxxxx

  当是对M区域寻址时,AR=830xxxxx

  当是对DB区域寻址时,AR=840xxxxx

  当是对DI区域寻址时,AR=850xxxxx

  当是对L区域寻址时,AR=870xxxxx

  列举,我们有了初步结论:AR中内容是8开头,那么就一定是区域间寻址;要DB区中进行寻址,只需8后面跟上一个4084000000-840FFFFF指明了要寻址范围是:

DB0.0——65535.7

  例如:当AR=840000D4hex=1000 0100 0000 0000 0000 0000 1101 0100b),实际上就是等于DBX26.4

  我们看到,寄存器寻址指针 [AR1/2,P#byte.bit] 这种结构中,P#byte.bit又是什么呢?

  【P#指针】

P#PPointer,是个32位直接指针。所谓直接,是指P##后面所跟数值存储单元,是P直接给定。这样P#XXX这种指针,就可以被用来指令寻址中,作为一个“常数”来对待,这个“常数”可以包含或不包含存储区域。例如:

● L P#Q1.0 //Q1.0这个指针存入ACC1,此时ACC1内容=82000008hex=Q1.0

★ L P#1.0 //1.0这个指针存入ACC1,此时ACC1内容=00000008hex=1.0

● L P#MB100 //错误!必须byte.bit结构给定指针。

● L P#M100.0 //M100.0这个指针存入ACC1,此时ACC1内容=83000320hex=M100.0

● L P#DB100.DBX26.4 //错误!DBX已经提供了存储区域,不能重复指定。

● L P#DBX26.4 //DBX26.4这个指针存入ACC1,此时ACC1内容=840000D4hex=DBX26.4

  我们发现,当对P#指定数值时,累加器中值和区域内寻址指针规定格式相同(也和存储器间接寻址双字指针格式相同);而当对P#指定带有存储区域时,累加器中内容和区域间寻址指针内容完全相同。事实上,把什么样值传给AR,就决定了是以什么样方式来进行寄存器间接寻址。实际应用中,我们正是利用P#这种特点,不同需要,指定P#指针,然后,再传递给AR,以确定最终寻址方式。

  寄存器寻址中,P#XXX作为寄存器AR指针偏移量,用来和AR指针进行相加运算,运算结果,才是指令真正要操作确切址数值单元!

  是区域内区域间寻址,址所存储区域都有了指定,,这里P#XXX只能指定纯粹数值,如上面例子中★。

  【指针偏移运算法则】

  寄存器寻址指针 [AR1/2,P#byte.bit] 这种结构中,P#byte.bit如何参与运算,出最终址呢?

  运算法则是:AR1P#中数值,BYTE位和BIT位分类相加。BIT位相加按八进制规则运算,而BYTE位相加,则十进制规则运算。

  例如:寄存器寻址指针是:[AR1P#2.6],我们分AR1=26.4DBX26.4两种情况来分析。

  当AR1等于26.4

AR126.2

+ P#: 2.6

---------------------------

= 29.7 这是区域内寄存器间接寻址最终确切址数值单元

  当AR1等于DBX26.4

AR1DBX26.2

+ P#: 2.6

---------------------------

= DBX29.7 这是区域间寄存器间接寻址最终确切址数值单元

  

责任编辑:西门子PLC间接寻址

热门文章

首页 | 电气资讯 | 应用技术 | 高压电器 | 电气设计 | 行业应用 | 低压电器 | 电路图 | 关于我们 | 版权声明

Copyright 2017-2018 电气自动化网 版权所有 辽ICP备17010593号-1

电脑版 | 移动版 原创声明:本站大部分内容为原创,转载请注明电气自动化网转载;部分内容来源网络,如侵犯您的权益请发送邮件到[email protected]联系我们删除。