一个具有20位地址和32位字长的存储器_详解西门子间接寻址之存储器间接寻址...

【地址的概念】

完整的一条指令,应该包含指令符+操作数(当然不包括那些单指令,比如 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 Q[MD100] ,A T[DBW100]。程序语句中用方刮号 [ ] 标明的内容,间接的指明了指令要进行的地址,这两个语句中的 MD100 和 DBW100 称为指针Pointer,它指向它们其中包含的数值,才是指令真正要执行的地址区域的确切位置。间接由此得名。

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

【存储器间接寻址】

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

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

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

e8a977c4cd4d125e7808036e88af41d2.png

16位指针举例:

ec558a370faf17b630e17ef5a387a04d.png
275057d64d606d0c82da3c644e3bdea5.png

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

7d780b3d2510bf06a43d0cc89c17c996.png

指针可以存放在 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 DBW[MW100] //打开 DBW10。这里的[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 这种具体位结构来说,只能用双字指针。这是它们的第一个区别,单字指针的另外一个限制

就是,它只能对 T、C、DB、FC 和 FB 进行寻址,通俗地说,单字指针只可以用来指代这些存储区域的编号。

相对于单字指针,双字指针就没有这样的限制,它不仅可以对位地址进行寻址,还可以对 BYTE、WORD、

DWORD 寻址,并且没有区域的限制。不过,有得必有失,在对非位的区域进行寻址时,必须确保其 0-2bit 为全 0!

总结一下:

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

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

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

47cf793a4ea7d0b8868a5b16ec687ad7.png

当作为双字指针时,就应该按照 3-18bit 指定 byte,0-2bit 指定 bit 来确定最终指令要操作的地址,因此:

0000 0000 0000 0000 0000 0000 0000 1010 = 1.2

那么上述例子中的= Q[MD2] //赋值给 Q6.5,为什么时对Q6.5进行操作呢?

同样的道理通过指令L DW#16#35 我们MD2中的值为16进制数的35,为32位指针,MD2中的值如下图所示

9ce96fdf893b3579a2ef38d0d7a5aadf.png

电气相关知识和经验是用来分享,希望本文能对你有帮助。与人玫瑰,手留余香。

欢迎大家关注,点赞,评论及转发。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值