【地址的概念】

完整的一条指令,应该包含指令符+操作数(当然不包括那些单指令,比如 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 的数值,这个数值就是被寻址的存储区域的编号。

16位指针举例:

双字指针是一个 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 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 中的值应该是:

当作为双字指针时,就应该按照 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中的值如下图所示

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

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

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

  1. 一个具有20位地址和32位字长的存储器_step7编程之地址概念详解

    完整的一条指令,应该包含指令符+操作数(当然不包括那些单指令,比如NOT等).其中的操作数是指令要执行的目标,也就是指令要进行操作的地址. 我们知道,在PLC中划有各种用途的存储区,比如物理输入输出区 ...

  2. 一个具有20位地址和32位字长的存储器_存储器层次结构(三):高速缓存

    一.高速缓存存储器组织结构 假设一个计算机系统每个存储器地址有m位,形成M=2^m个不同的地址.这样一个机器的高速缓存被组织成一个有S=2^s个高速缓存组(cache set).每个高速缓存组包含E个 ...

  3. 给定一个最多包含40亿个随机排列的32位整数的顺序文件,找出一个不在文件中的32位整数

    给定一个最多包含40亿个随机排列的32位整数的顺序文件,找出一个不在文件中的32位整数.            1.在文件中至少存在这样一个数?            2.如果有足够的内存,如何处理? ...

  4. 64位windows与32位windows的区别

    64位windows与32位windows的区别 2010-07-19 15:46 64位windows与32位windows的区别 http://www.zeroplace.cn/article.a ...

  5. 计算机组成原理---32位的CPU64位CPU与32位os64os的区别与联系

    基本概念 32位的CPU与64位CPU 以下内容摘自维基百科: 64 位 CPU 是指 CPU 内部的通用寄存器的宽度为 64 比特,支持整数的 64 比特宽度的算术与逻辑运算.那么 32 位 CPU ...

  6. 64位进程调用32位dll的解决方法 / 程序64位化带来的问题和思考

    最近做在Windows XP X64,VS2005环境下做32位程序编译为64位程序的工作,遇到了一些64位编程中可能遇到的问题:如内联汇编(解决方法改为C/C++代码),long类型的变化,最关键的 ...

  7. linux 进程映射空间 libc,为什么不能在64位内核的32位Linux进程中映射(MAP_FIXED)最高虚拟页面?...

    尝试测试时是否允许访问跨越x86中零边界的内存?在Linux的用户空间中,我编写了一个32位测试程序,该程序试图映射32位虚拟地址空间的低和高页. 之后echo 0 | sudo tee /proc/ ...

  8. 8位十六进制转换32位十六进制_网络中的数制系统--二进制十六进制与十进制之间的相互转换...

    网络中计算机的32位IPv4地址以二进制显示,也会以点分十进制显示.而IPv6的地址是128位,是由数字和A-F组成的十六进制系统.因此,了解并且学会在其三者之间相互转换是非常重要的,让我们能够更好的 ...

  9. 64位进程调用32位DLL详解

    64位进程调用32位DLL------探索 相关资料: 微软公司的官方网站针对这个问题描述如下: 在64位的windows系统中,一个64位进程不能加载一个32位dll,同理一个32位进程也不能加载一 ...

最新文章

  1. X@X.X域名转向的实现
  2. Linux课程第六天学习笔记
  3. python图像拼接过渡自然_python实现图像拼接功能
  4. 计组第三章系统总线自我总结
  5. 哎~~~又是RichTextBox
  6. Redis基础知识之————如何处理客户端连接
  7. flash写保护原理_为什么固态会掉盘?著名的30分钟大法修复是什么原理?
  8. 我想solo自己一个人!
  9. 谷歌排名第一的编程语言,收下这份资料,小白也能学的会!
  10. python里default_新手对python default不是很理解它有什么用途
  11. 阶段5 3.微服务项目【学成在线】_day04 页面静态化_20-页面静态化-静态化测试-填写页面DataUrl...
  12. 狂神说的全部笔记_聪明人的方格笔记术
  13. python大数据运维常用脚本_python大数据运维
  14. 第五章 我来帮你(一)
  15. C++基于MFC课程设计——学习公社
  16. c++中atan2函数_atan2()函数以及C ++中的示例
  17. 1wifi 简介(框架)
  18. 2019年数学建模国赛赛前讲座收获
  19. 戈泽尔matlab_泽尔将军说硅谷是精英人士,他们能否建立一个新系统
  20. 7星彩随机N注选号程序

热门文章

  1. MySQL日志及主从复制实现
  2. B - Cube HDU - 1220 (数学计数)
  3. 解决Oracle错误ORA-15061一例
  4. 解决在Windows 2003的 IIS 6.0 中无法上传超过200K的附件以及无法下载超过4M的附件问题...
  5. 使用Dom4j进行XML解析
  6. GraphX的三大图算法
  7. Sql server在另一台服务器,在Visual Studio 中没问题,IIS中 提示“在与 SQL Server 建立连接时出现与网络相关的或特定于实例的错误。。。。”...
  8. 腾讯技术运营岗实习面试面经
  9. QT 创建鼠标右键菜单
  10. 软件开发从需求分析开始