PLC 地址与寻址地址与寻址 【地址的概念】. 3 【间接寻址的概念】.4 【存储器间接寻址】.4 【地址寄存器间接寻址】.7 【AR 的格式】8 【P#指针】. 9 【指针偏移运算法则】.11 【AR 的地址数据赋值】11 【存储器间接寻址应用实例】.13 【示例程序的结构分析】.14 【数据对象尺寸的划分规则】.15 【循环的结构】. 15 【将 DB100 中的 1-11 数据字,传送到 MW1-11 中】16 【将 DB1-10 中的 1-11 数据字,传送到 MW1-11 中】.17 【地址的概念【地址的概念】】 完整的一条指令,应该包含指令符+操作数(当然不包括那些单指 令,比如 NOT 等) 其中的操作数是指令 我们知道,在 PLC 中划有各种用途的存储区,比如物理输入输出 区 P、映像输入区 I、映像输出区 Q、位存同时我们还知道,每个区 域可以用位(BIT) 、字节(BYTE) 、字(WORD) 、双字(DWORD)来衡 量,或者说来指这种衡量体制,它们仅用位来衡量由此我们可以得 到,要描述一个地址,至少应该包含两个要素:1、存储的区域 2、 这个区域中具体的位置比如: A Q2.0 其中的 A 是指令符,Q2.0 是 A 的操作数,也就是地址。
这 个地址由两部分组成: Q:指的是映像输出区 2.0:就是这个映像输出区第二个字节的第 0 位 由此,我们得出,一个确切的地址组成应该是: 〖存储区符〗 〖存 储区尺寸符〗 〖尺寸数值〗.〖位数值〗 ,例如:DBX200.0 DBX200.0 其中,我们又把〖存储区符〗 〖存储区尺寸符〗这两个 部分合称为:地址标识符这样,一个确切的地址组地址标识符+确 切的数值单元 【间接寻址的概念】【间接寻址的概念】 寻址,就是指定指令要进行操作的地址给定指令操作的地址的 方法,就是寻址方法 在谈间接寻址之前,我们简单的了解一下直接寻址所谓直接寻 址, 简单的说, 就是直接给出指令的确切操对于 A 这个指令来说, Q2.0 就是它要进行操作的地址 这样看来,间接寻址就是间接的给出指令的确切操作数对,就 是这个概念 比如:A Q[MD100] ,A T[DBW100]程序语句中用方刮号 [ ] 标 明的内容,间接的指明了指令要进行的地 pointer,它指向它们其中 包含的数值,才是指令真正要执行的地址区域的确切位置间接由此 得名 西门子的间接寻址方式计有两大类型:存储器间接寻址和寄存器 间接寻址 【存储器间接寻址】【存储器间接寻址】 存储器间接寻址的地址给定格式是:地址标识符+指针。
指针所指 示存储单元中所包含的数值, 就是地址的存储器间接寻址具有两个 指针格式:单字和双字 单字指针是一个 16bit 的结构,从 0-15bit,指示一个从 0-65535 的数值, 这个数值就是被寻址的存储区域双字指针是一个 32bit 的 结构,从 0-2bit,共三位,按照 8 进制指示被寻址的位编号,也就 是 0-7;而从 3 这个数值就是被寻址的字节编号 指针可以存放在 M、DI、DB 和 L 区域中,也就是说,可以 用这些区域的内容来做指针单字指针和双字指针在使 用上有很大区别下面举例说明: L DW#16#35 //将 32 位 16 进制数 35 存入 ACC1 T MD2//这个值再存入 MD2,这是个 32 位的位存储区域(MD2=35H)(1000 0000 0000 0000 0000 0000 0 L +10//将 16 位整数 10 存入 ACC1,32 位 16 进制数 35 自动移动到 ACC2 T MW100//这个值再存入 MW100,这是个 16 位的位存储区域(MW100=10) OPN DBW[MW100] //打开 DBW10这里的[MW100]就是个单字指针,存放指针的区域是 M 区,MW100 中的值 10,就是指针间接指定 的地址,它是个 16 位的值! L L#+10//以 32 位形式,把 10 放入 ACC1,此时,ACC2 中的内容为:16 位整数 10(1000 0000 0000 0000 T MD104//这个值再存入 MD104,这是个 32 位的位存储区域(MD104=10) 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,而字指针这是它们的第一个区别,单字指针的另外一个 限制就是,它只能对 T、C、DB、FC 和 FB 进行寻址,通俗的编号 相对于单字指针,双字指针就没有这样的限制,它不仅可以对位 地址进行寻址,还可以对 BYTE、WORD、DW 有失,在对非位的区域进 行寻址时,必须确保其 0-2bit 为全 0! 总结一下: 单字指针的存储器间接寻址只能用在地址标识符是非位的 场合; 双字指针由于有位格式存在, 所以对地址标有位的指针, 因此, 当对字节、字或者双字存储区地址进行寻址时,必须确保双字指针的 内容是 8 或者 8 的倍数现在,我们来分析一下上述例子中的 A I[MD104] 为什么最后是对 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〗 ,比如: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 是这个存储区域的尺寸符,指的是 X 只是指定了存储区域 的尺寸符,那么存储区域符在哪里呢?毫无疑问,在 AR1 中! DIX [AR1,P#1.5] 这个例子,要寻址的地址区域事先已经确定, AR1 可以改变的只是这个区域内的确切地址寻址方式,相应的,这里 的[AR1,P#1.5] 就叫做区域内寻址指针 X [AR1,P#1.5] 这个例子,要寻址的地址区域和确切的地址数值 单元,都未事先确定,只是确定了存储大小同地址数值单元以给定的 区域大小进行寻址,所以称之为:区域间寄存器间接寻址方式,相应 的,这里的[AR1, 既然有着区域内和区域间寻址之分,那么,同样的 AR1 中,就存有不同的内容,它们代表着不同的含义 【【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:1000 0YYY 0000 0BBB BBBB BBBB BBBB BXXX 比较一下两种格式的不同,我们发现,这里的第 31bit 被固定为 1, 同时,第 24、25、26 位有了可以取值指定存储区域的对,bit24-26 的取值确定了要寻址的区域,它的取值是这样定义的: 区域标识符26、 25、 24 位P (外部输入输出)000I (输入映像区)001Q(输出映像区)010M(位存 储区)011DB(数据块)100DI(背景数据块) 101L(暂存数据区,也叫局域数据)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 区中 00-840FFFFF 指明了要寻址 的范围是:DB 区的 0.0——65535.7。
例如:当 AR=840000D4(hex)=1000 0100 0000 0000 0000 0000 1101 0100(b) ,实际上就是等于 DBX26我们看到,在寄存器寻址指针 [AR1/2,P#byte.bit] 这种结构中,P#byte.bit 又是什么呢? 【【P#指针】指针】 P#中的 P 是 Pointer,是个 32 位的直接指针所谓的直接,是指 P# 中的#后面所跟的数值或者存储单元,是被用来在指令寻址中,作为 一个“常数”来对待,这个“常数”可以包含或不包含存储区域例 如: ● L P#Q1.0 //把 Q1.0 这个指针存入 ACC1,此时 ACC1 的内容 =82000008(hex)=Q1.0 ★ L P#1.0 //把 1.0 这个指针存入 ACC1, 此时 ACC1 的内容=00000008 (hex)=1.0 ● L P#MB100 //错误!必须按照 byte.bit 结构给定指针 ● L P#M100.0 //把 M100.0 这个指针存入 ACC1,此时 ACC1 的内容 =83000320(hex)=M100.0 ● L P#DB100.DBX26.4 //错误!DBX 已经提供了存储区域,不能重 复指定。
● L P#DBX26.4 //把 DBX26.4 这个指针存入 ACC1,此时 ACC1 的内 容=840000D4(hex)=DBX26.4 我们发现,当对 P#只是指定数值时,累加器中的值和区域内寻址指 针规定的格式相同(也和存储器间接寻区域时,累加器中的内容和区 域间寻址指针内容完全相同事实上,把什么样的值传给 AR,就决 定了是以什么样我们正是利用 P#的这种特点,根据不同的需要,指 定 P#指针,然后,再传递给 AR,以确定最终的寻址方式在寄存 器寻址中,P#XXX 作。