
1334编号详解西门子间接寻址(讲解+案例分析).pdf
10页详解西门子间接寻址详解西门子间接寻址 等级:弓剑手 威望:0 发贴:116 经验:416 财产:407 魅力:411 注册:2005-5-21 【地址的概念】 【地址的概念】 完整的一条指令,应该包含指令符+操作数(当然不包括那些单指令,比如 NOT 等) 其 中的操作数是指令要执行的目标,也就是指令要进行操作的地址 我们知道,在 PLC 中划有各种用途的存储区,比如物理输入输出区 P、映像输入区 I、 映像输出区 Q、位存储区 M、定时器 T、计数器 C、数据区 DB 和 L 等,同时我们还知道,每 个区域可以用位(BIT) 、字节(BYTE) 、字(WORD) 、双字(DWORD)来衡量,或者说来指定 确切的大小当然定时器 T、计数器 C 不存在这种衡量体制,它们仅用位来衡量由此我们 可以得到,要描述一个地址,至少应该包含两个要素: 1、存储的区域 2、这个区域中具体的位置 比如:A Q2.0 其中的 A 是指令符,Q2.0 是 A 的操作数,也就是地址这个地址由两部分组成: Q:指的是映像输出区 2.0:就是这个映像输出区第二个字节的第 0 位。
由此,我们得出, 一个确切的地址组成应该是: 存储区符存储区尺寸符尺寸数值.位数值,例如:DBX200.0 DB X 200 . 0 其中,我们又把存储区符存储区尺寸符这两个部分合称为 : 地址标识符这样, 一个确切的地址组成,又可以写成:地址标识符 + 确切的数值单元 【间接寻址的概念】 【间接寻址的概念】 寻址,就是指定指令要进行操作的地址给定指令操作的地址方法,就是寻址方法 在谈间接寻址之前,我们简单的了解一下直接寻址所谓直接寻址,简单的说,就是直接给 出指令的确切操作数,象上面所说的,A Q2.0,就是直接寻址,对于 A 这个指令来说, Q2.0 就是它要进行操作的地址 这样看来,间接寻址就是间接的给出指令的确切操作数对,就是这个概念 比如 : A QMD100 ,A TDBW100程序语句中用方刮号 标明的内容,间接的指明了 指令要进行的地址,这两个语句中的 MD100 和 DBW100 称为指针 Pointer,它指向它们其中 包含的数值,才是指令真正要执行的地址区域的确切位置间接由此得名 西门子的间接寻址方式计有两大类型:存储器间接寻址存储器间接寻址和寄存器间接寻址寄存器间接寻址。
【存储器间接寻址】【存储器间接寻址】 存储器间接寻址的地址给定格式是:地址标识符+指针指针所指示存储单元中所包含 的数值,就是地址的确切数值单元 存储器间接寻址具有两个指针格式:单字和双字 单字指针是一个 16bit 的结构,从 0-15bit,指示一个从 0-65535 的数值,这个数值就 是被寻址的存储区域的编号 双字指针是一个 32bit 的结构,从 0-2bit,共三位,按照 8 进制指示被寻址的位位编号, 也就是 0-7; 而从 3-18bit,共 16 位,指示一个从 0-65535 的数值,这个数值就是被寻址的 字节字节编号 指针可以存放在 M、DI、DB 和 L 区域中,也就是说,可以用这些区域的内容来做指针 单字指针和双字指针在使用上有很大区别下面举例说明: L DW#16#35 //将 32 位 16 进制数 35 存入 ACC1 T MD2 //这个值再存入 MD2,这是个 32 位的位存储区域 L +10 //将 16 位整数 10 存入 ACC1,32 位 16 进制数 35 自动移动到 ACC2 T MW100 //这个值再存入 MW100,这是个 16 位的位存储区域 OPN DBWMW100// 打开DBW10。
这里的MW100就是个单字指针,存放指针的区域是M 区,MW100 中的值 10,就是指针间接指定的地址,它是个 16 位的值! -------- L L#+10 //以 32 位形式,把 10 放入 ACC1,此时,ACC2 中的内容为:16 位整数 10 T MD104 //这个值再存入 MD104,这是个 32 位的位存储区域 A IMD104 //对 I1.2 进行与逻辑操作!MD14 0000 0000 0000 0000 0000 0000 0000 1010 =DIXMD2 //赋值背景数据位 DIX6.5! -------- A DBMW100.DBXMD2 //读入 DB10.DBX6.5 数据位状态 =QMD2 //赋值给 Q6.5 -------- A DBMW100.DBXMD2 //读入 DB10.DBX6.5 数据位状态 =QMW100 //错误!!没有 Q10 这个元件 ------------------------------------------------------------------------------ 从上面系列举例我们至少看出来一点: 单字指针只应用在地址标识符是非位的情况下。
的确,单字指针前面描述过,它确定的 数值是 0-65535,而对于 byte.bit 这种具体位结构来说,只能用双字指针这是它们的第 一个区别,单字指针的另外一个限制就是,它只能对 T、C、DB、FC 和 FB 进行寻址,通俗地 说,单字指针只可以用来指代这些存储区域的编号 相对于单字指针,双字指针就没有这样的限制,它不仅可以对位地址进行寻址,还可以 对 BYTE、WORD、DWORD 寻址,并且没有区域的限制不过,有得必有失,在对非位的区域进 行寻址时,必须确保其 0-2bit 为全 0! 总结一下: 单字指针的存储器间接寻址只能用在地址标识符是非位的场合 ; 双字指针由于有位格式 存在,所以对地址标识符没有限制也正是由于双字指针是一个具有位的指针,因此,当对 字节、字或者双字存储区地址进行寻址时,必须确保双字指针的内容是 8 或者 8 的倍数 现在,我们分析一下上述例子中的 A IMD104 为什么最后是对 I1.2 进行与逻辑操作 通过 L L#+10 ,我们知道存放在 MD104 中的值应该是: MD104:0000 0000 0000 0000 0000 0000 0000 1010 当作为双字指针时,就应该按照 3-18bit 指定 byte,0-2bit 指定 bit 来确定最终指令 要操作的地址,因此: 0000 0000 0000 0000 0000 0000 0000 1010 = 1.2 详解西门子间接寻址详解西门子间接寻址 【地址寄存器间接寻址】【地址寄存器间接寻址】 在先前所说的存储器间接寻址中,间接指针用 M、DB、DI 和 L 直接指定,就是说,指针 指向的存储区内容就是指令要执行的确切地址数值单元。
但在寄存器间接寻址中, 指令要执 行的确切地址数值单元,并非寄存器指向的存储区内容,也就是说,寄存器本身也是间接的 指向真正的地址数值单元从寄存器到得出真正的地址数值单元,西门子提供了两种途径: 1、区域内寄存器间接寻址 2、区域间寄存器间接寻址 地址寄存器间接寻址的一般格式是: 地址标识符寄存器,P#byte.bit,比如:DIXAR1,P#1.5 或 MAR1,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 的格式】【AR 的格式】 地址寄存器是专门用于寻址的一个特殊指针区域,西门子的地址寄存器共有两个:AR1 和 AR2,每个 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=D4(hex)=0000 0000 0000 0000 0000 0000 1101 0100(b) ,实际上就是等 于 26.4。
而在区域间寄存器间接寻址中, 由于要寻址的区域也要在 AR 中指定, 显然这时的 AR 中 内容肯定于寄存器区域内间接寻址时,对 AR 内容的要求,或者说规定不同 AR: 1000 0YYY 0000 0BBB BBBB BBBB BBBB BXXX 比较一下两种格式的不同, 我们发现, 这里的第 31bit 被固定为 1, 同时, 第 24、 25、 26 位有了可以取值的范围 聪明的你, 肯定可以联想到, 这是用于指定存储区域的 对, bit24-26 的取值确定了要寻址的区域,它的取值是这样定义的: 区域标识符 26、25、24 位 P(外部输入输出) 000 I(输入映像区) 001 Q(输出映像区) 010 M(位存储区) 011 DB(数据块) 100 DI(背景数据块) 101 L(暂存数据区,也叫局域数据) 111 如果我们把这样的 AR 内容,用 HEX 表示的话,那么就有: 当是对 P 区域寻址时,AR=800 xxxxx 当是对 I 区域寻址时,AR=810 xxxxx 当是对 Q 区域寻址时,AR=820 xxxxx 当是对 M 区域寻址时,AR=830 xxxxx 当是对 DB 区域寻址时,AR=840 xxxxx 当是对 DI 区域寻址时,AR=850 xxxxx 当是对 L 区域寻址时,AR=870 xxxxx 经过列举, 我们有了初步的结论 : 如果 AR 中的内容是 8 开头, 那么就一定是区域间寻址 ; 如果要在 DB 区中进行寻址,只需在 8 后面跟上一个 40。
84000000-840FFFFF 指明了要寻址 的范围是: DB 区的 0.065535.7 例如:当 AR=840000D4(hex)=1000 0100 0000 0000 0000 0000 1101 0100(b) ,实际上 就是等于 DBX26.4 我们看到,在寄存器寻址指针 AR1/2,P#byte.bit 这种结构中,P#byte.bit 又是什么 呢? 【P#指针】【P#指针】 P#中的 P 是 Pointer,是个 32 位的直接指针所谓的直接,是指 P#中的#后面所跟的数 值或者存储单元,是 P 直接给定的这样 P#XXX 这种指针,就可以被用来在指令寻址中,作 为一个“常数”来对待,这个“常数”可以包含或不包含存储区域例如: L P#Q1.0 //把 Q1.0 这个指针存入 ACC1,此时 ACC1 的内容=82000008(hex)=Q1.0 L 。












