详解西门子间接寻址
S7-200SMART间接寻址

S7-200 SMART 间接寻址一、间接寻址概念:1、间接寻址是指用指针来访问存储区的数据。
指针以双字的形式存储其它存储区的地址,只能将V 存储单元、L 存储单元或累加器寄存器(AC1、AC2、AC3)用作指针。
注意:S7-200 SMART CPU 允许指针访问下列存储区:I、Q、V、M、S、AI、AQ、SM、T(仅限当前值)和C(仅限当前值)。
不能使用间接寻址访问单个位或访问HC、L 或累加器存储区。
2、指针存储的就是存储器的内存地址或编号,如下所示,VB0表示的是一个存储器,而内存地址:16#08000000则就是VB0这个存储区所对应的内存地址,通过对这个内存地址的改变就可以实现对不同的存储区的访问,这就是间接寻址的过程。
3、间接寻址的使用过程主要分为建立指针,改变指针,通过指针实现存储器三步骤。
二、建立指针:要创建指针,用“&”符号加上要访问的存储区地址可建立一个指针,必须使用“移动双字”指令,将间接寻址的存储单元地址移至指针位置。
注意:修改指针的值时,请记住调整所访问数据的大小:访问字节时,指针值加1;访问定时器或计数器的字或当前值时,指针值加2;访问双字时,指针值加4。
三、修改指针:对指针中的数据进行修改,可以实现对存储地址的改变,如图所示通过对指针进行加法操作来改变指针中的所存的数据,该数据指向的是PLC中存储器的内存地址。
四、通过指针对数据进行存取:当指针的内容修改完后,需要根据修改后的指针的内容访问对应的存储区的数据,此时指令中的操作数是指针是,应该在操作数前面加上“*”号。
例程1.通过指针访问数据表所实现的功能:索引号VW1008=0时,将指定的配方0(VB100~VB104) 数据传送到(VB1500~VB1504) 索引号VW1008=1时,将指定的配方1(VB105~VB109) 数据传送到(VB1500~VB1504) 索引号VW1008=2时,将指定的配方2(VB110~VB114) 数据传送到(VB1500~VB1504) 索引号VW1008=3时,将指定的配方3(VB115~VB119) 数据传送到(VB1500~VB1504)例程2.通过指针存储数据表所实现的功能:索引号VW1008=0时,将(VB1500~VB1504)数据传送到指定的配方0(VB100~VB104) 索引号VW1008=1时,将(VB1500~VB1504)数据传送到指定的配方1(VB105~VB109) 索引号VW1008=2时,将(VB1500~VB1504)数据传送到指定的配方2(VB110~VB114) 索引号VW1008=3时,将(VB1500~VB1504)数据传送到指定的配方3(VB115~VB119)例程3.通过地址偏移量来访问V存储区数据所实现的功能:本例程可以实现对区任意字节数据的访问。
图文详解S7-200SMART间接寻址方法

图文详解S7-200SMART间接寻址方法PLC寻址分为直接和间接两种,前面已经介绍了直接寻址使用方法,本文介绍间接寻址如何使用,间接寻址类似于地球上经纬度定位方式,地球上任意一个地方都有一个与之相对于的经度和纬度值,这样定位不再分区域,可以延伸到全球。
间接寻址也是如此,PLC中只有一个存储数据的硬件(硬盘),所谓的I,Q,M,V等区只是西门子开发人员定义出来的逻辑分区,类似电脑C,D,E,F盘,其实都处在一个硬盘中,并且都有相对应得一个编号,如果能找到地址的编号,同样可以对其进行寻址,并且不再受存储区的限制,能够大批量的访问连续或有一定规律的地址,这就是间接寻址。
间接寻址分三步:1.建立指针,即获取需要访问存储区起始地址对应编号。
&为地址符号,是S7-200SMART中特殊的编程写法,&VB0代表VB0处在整个存储区的地址编号(指针),可以理解成我们的身份证号码,是一个很大的数值,必须存储在32位存储器中,如VD100,LD0,AC1(AC0不能做指针)等。
2. 间接访问。
通过访问指针指向地址来进行寻址。
间接寻址支持字节,字,双字方式访问,如下图所示:*为访问指针符号,*AC1代表AC1所指向地址的数值,以字节访问则代表一个字节,字访问代表一个字,双字访问代表一个双字。
3.指针偏移。
访问完一个地址后可以以该地址为起始,通过加/减方式对指针进行偏移,从而实现其它地址的访问。
通常字节偏移1,字偏移2,双字偏移4(位不支持间接寻址)总结:间接寻址与直接寻址各有千秋,直接寻址直观简单,适合单个或少量的寻址,不管有没有规律都可以使用,可以满足大部分寻址要求。
间接寻址适合批量且连续或有一定规律的地址,当寻址量较大时,可以将数据设计成有规律,用间接方式寻址可以少写很多步程序,使编程更加简单。
S7-1200 间接寻址

S7-1200的间接寻址需要通过数据块中的数组来实现。
指令FieldRead通过索引(又称为下标)变量从数组中读取数值,指令FieldWrite 通过索引变量向数组中写数值,使用这两条指令可以实现间接寻址。
索引变量是间接寻址中的地址指针,它的值是要读写的数组元素的索引值。
地址指针就像收音机调台的指针,改变指针的位置,指针指向不同电台。
改变地址指针中的索引值,指针“指向”数组不同的元素。
间接寻址的优点是可以在程序处理期间,通过改变指针的值动态地修改指令中的地址。
首先生成一个名为“数据块1”的全局数据块DB2,在数据块中生成名为“数组1”的数组Array[1..10] of Int,其元素的数据类型为Int。
这两条指令没有列入指令列表和高级指令列表,编程时将收藏夹中的空逻辑框插入程序,点击其中红色的“??”,打开下拉式列表框,可以看到列表框底部的指令FieldWrite或FieldRead。
点击生成的指令框中的“???”,用列表设置要写入或读取的数据类型为Int(见下图)。
两条指令的参数MEMBER的实参必须是数组的第一个元素“数据块1”.数组1[1]。
指令的输入参数索引值“INDEX”是要读写的数组中的元素的下标,数据类型为DINT(双整数)。
参数“VALUE”是要写入数组元素的值或要读取的数组元素的值。
下图中的FieldWrite指令将常数25写入数组1中的元素“数组1[3]”。
FieldRead指令读取数组元素“数组1[3]”的值,将它保存到MW20。
改变INDEX 的值,可以读写别的数组元素的值。
循环程序用来完成大量的重复的操作。
S7-1200没有像S7-300的LOOP那样的循环程序专用的指令,为了编写循环程序,可以用FieldRead指令实现间接寻址,用普通指令来编写循环程序。
生成一个名为“循环程序”的项目。
首先生成全局数据块DB1,在DB1中生成有10个字节元素的数组,设置各数组元素的初始值。
西门子PLC指令寻址方式

西门子PLC指令寻址方式西门子S7-200编程语言的基本单位是语句,而语句的构成是指令,每条指令有两部分:一部分是操作码,另一部分是操作数。
操作码指出这条指令的功能是什么,操作数则指明操作码所需要的数据所在。
所谓寻址,就是寻找操作数的过程。
S7-200 CPU的寻址分为三种:立即寻址、直接寻址和间接寻址。
1)立即寻址在一条指令中,如果操作码后面的操作数就是操作码所需要的具体数据,这种指令的寻址方式就叫立即寻址。
例如,在传送指令MOV IN OUT中,操作码“MOV”指出该指令的功能是把IN中的数据传送到OUT中,其中IN 为源操作数,OUT为目标操作数。
若该指令为MOVD 2505 VD500,则其功能为:将十进制数2505传送到VD500中,这里2505就是源操作数。
因这个操作数的数值已经在指令中,不用再去寻找,这个操作数即为立即数。
这个寻址方式就是立即寻址方式。
而目标操作数的数值在指令中并未给出,只给出了要传送到的地址VD500,这个操作数的寻址方式就是直接寻址。
2)直接寻址在一条指令中,如果操作码后面的操作数是以操作数所在地址的形式出现的,这种指令的寻址方式就叫直接寻址。
例如:MOVD VD400 VD500功能:将VD400中的双字数据传给VD500。
3)间接寻址在一条指令中,如果操作码后面的操作数是以操作数所在地址的地址形式出现的,这种指令的寻址方式就叫间接寻址。
例如:MOVD 2505 *VD500*VD500是指存放2505地址的地址。
若VD500中存放的是VDO,则VDO是存放2505的地址。
该指令的功能:将十进制数2505传送给VDO地址中。
西门子S7-1200的间接寻址功能(2)

西门子S7-1200的间接寻址功能(2)
前面介绍了读取和写入数组中元素值的指令Field Read和Field Write两条指令,同时给大家简单的分析了程序的设计思路。
接下来就使用Field Read来实现本功能,在程序的设计过程中可能还需要用到循环跳转指令。
例子说明:
假设需要从一组数据中找出一个最大值,并记录这个最大值是这组数据中的第几个数据。
第一步:
添加一个全局DB块,并在DB块中建立一个变量名为data_1#,数据类型为数组的变量,用于存储需要找出最大的数据,同时建立一些相应的变量,如下图所示。
第二步:
初始化相应的存储器并把存储最大值的存储器的值设置为最小值。
程序如下所示:
第三步:
编写判断数据的挨个比较是否完成,当执行的次数与设定的次数相等时,则表示完成,可以跳出最大值查找的程序,让程序跳转到最后执行。
程序如下所示:
第四步:
编写读取数组中元素的值,然后与存储最大值的存储器中的值做比较,用于判断数据存储器存储的值是否是最大值,若不是最大值进行数据交换,同时记录位置,然后INDEX的值加1,同时记录执行次数并与设定次数做比较,如未达到设定次数,则跳转换前面继续通过Field Read指令读取数据出来继续做比较。
程序仅供参考,希望对大家在以后使用此功能上时有所帮助。
详解西门子间接寻址 (2)

详解西门子间接寻址【地址的概念】完整的一条指令,应该包含指令符+操作数(当然不包括那些单指令,比如NOT 等)。
其中的操作数是指令要执行的目标,也就是指令要进行操作的地址。
我们知道,在PLC中划有各种用途的存储区,比如物理输入输出区P、映像输入区I、映像输出区Q、位存储区M、定时器T、计数器C、数据区DB和L等,同时我们还知道,每个区域可以用位(BIT)、字节(BYTE)、字(WORD)、双字(DWORD)来衡量,或者说来指定确切的大小。
当然定时器T、计数器C不存在这种衡量体制,它们仅用位来衡量。
由此我们可以得到,要描述一个地址,至少应该包含两个要素:1、存储的区域2、这个区域中具体的位置比如:A其中的A是指令符,是A的操作数,也就是地址。
这个地址由两部分组成:Q:指的是映像输出区:就是这个映像输出区第二个字节的第0位。
由此,我们得出,一个确切的地址组成应该是:〖存储区符〗〖存储区尺寸符〗〖尺寸数值〗.〖位数值〗,例如:。
DB X 200 . 0其中,我们又把〖存储区符〗〖存储区尺寸符〗这两个部分合称为:地址标识符。
这样,一个确切的地址组成,又可以写成:地址标识符+ 确切的数值单元【间接寻址的概念】寻址,就是指定指令要进行操作的地址。
给定指令操作的地址方法,就是寻址方法。
在谈间接寻址之前,我们简单的了解一下直接寻址。
所谓直接寻址,简单的说,就是直接给出指令的确切操作数,象上面所说的,A ,就是直接寻址,对于A这个指令来说,就是它要进行操作的地址。
这样看来,间接寻址就是间接的给出指令的确切操作数。
对,就是这个概念。
比如:A Q[MD100] ,A T[DBW100]。
程序语句中用方刮号[ ] 标明的内容,间接的指明了指令要进行的地址,这两个语句中的MD100和DBW100称为指针Pointer,它指向它们其中包含的数值,才是指令真正要执行的地址区域的确切位置。
间接由此得名。
西门子的间接寻址方式计有两大类型:存储器间接寻址和寄存器间接寻址。
详解西门子间接寻址完整版

详解西门子间接寻址HEN system office room [HEN 16H-HENS2AHENS8Q8-HENH1688] 详解西门子间接寻址【地址的概念】完整的一条指令,应该包含指令符+操作数(当然不包括那些单指令,比如\0T 等)。
其中的操作数是指令要执行的LI标,也就是指令要进行操作的地址。
我们知道,在PLC中划有各种用途的存储区,比如物理输入输出区P、映像输入区I、映像输出区Q、位存储区M、定时器T、计数器C、数据区DB和L等,同时我们还知道,每个区域可以用位(BIT)、字节(BYTE)、字(WORD)、双字(DWORD)来衡量,或者说来指定确切的大小。
当然定时器T、计数器C不存在这种衡量体制,它们仅用位来衡量。
山此我们可以得到,要描述一个地址,至少应该包含两个要素:1、存储的区域2、这个区域中具体的位置比如:A其中的A是指令符,是A的操作数,也就是地址。
这个地址由两部分组成:Q:指的是映像输出区:就是这个映像输出区第二个字节的笫0位。
由此,我们得出,一个确切的地址组成应该是:[[存储区符K存储区尺寸符K尺寸数值)]・K位数值》,例如:。
DB X 200 . 0其中,我们乂把K存储区符1 K存储区尺寸符』这两个部分合称为:地址标识符。
这样,一个确切的地址组成,又可以写成:地址标识符+确切的数值单元【间接寻址的概念】寻址,就是指定指令要进行操作的地址。
给定指令操作的地址方法,就是寻址方法。
在谈间接寻址之前,我们简单的了解一下直接寻址。
所谓直接寻址,简单的说,就是直接给出指令的确切操作数,象上面所说的,A ,就是直接寻址,对于A 这个指令来说,就是它要进行操作的地址。
这样看来,间接寻址就是间接的给出指令的确切操作数。
对,就是这个概念。
比如:A QEMD100] , A T[DBW100]o程序语句中用方刮号[]标明的内容,间接的指明了指令要进行的地址,这两个语句中的MD100和DBW100称为指针Pointer,它指向它们其中包含的数值,才是指令真正要执行的地址区域的确切位置。
西门子S7-1200 PLC的间接寻址功能及实例

S7-1200指针数据- 已解决问题看了这个问题的网友还看了∙西门子模拟量电压问题西门子博图V14安装步骤∙S7-200/S7-1200/S7-300 EPLAN宏下载S7-1200 怎么实现与上位机进行Modbus_TCP/TP通讯∙打开S7-PLCSIM V13就提示几个文件签名无效,然后报错退出。
关于博图软件怎样安装∙1200PLC编程时,同样是16个位,怎样把数组转换为INT?西门子plc1200编程软件下载∙wincc与s7-1200怎么通讯1200PLC不能与PC机链接,找不到设备,输入输出,如附件IF #EXCUTE = True THENPOKE_BLK(area_src:= #AREA_SRC, (* 源数据类型:16#81:I,16#82:Q,16#83:M,16#84:DB *) dbNumber_src:= #DB_NUM_SRC, (* 源数据块:非DB=0 *)byteOffset_src:= #START_BIT_SRC, (* 源数据起始位号 DB[#DB_NUM_SRC].DBB[#START_BIT_SRC] *)area_dest:= #AREA_TYPE, (* 目标存储类型:16#81:I,16#82:Q,16#83:M,16#84:DB *)dbNumber_dest:= #DB_NUM, (* 目标数据块:非DB=0 *)byteOffset_dest:= #START_BIT, (* 目标起始位位号 DB[#DB_NUM].DBB[#START_BIT] *)count:= #BYTE_COUNT); (* 复制长度字节 *)END_IF;图片说明:回答者:sunnic - 高级技术员第7级2016-08-14 17:08:21提问者对于答案的评价:谢谢已有1人评论展开6wenhua6:你好,我按照你做的,怎么不行西门子S7-1200循环程序间接寻址的方法循环程序的关键是间接寻址,西门子S7-1200的间接寻址离不开数组。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
详解西门子间接寻址【址概念】完整一条指令,应该包含指令符+操作数(当然不包括那些单指令,比如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数值,这个数值就是被寻址存储区域编号。
双字指针是一个32bit结构,从0-2bit,共三位,8进制指示被寻址位编号,也就是0-7;而从3-18bit,共16位,指示一个从0-65535数值,这个数值就是被寻址字节编号。
指针可以存放M、DI、DB和L区域中,也就是说,可以用这些区域内容来做指针。
单字指针和双字指针使用上有很大区别。
下面举例说明:L DW#16#35 //将32位16进制数35存入ACC1T MD2 //这个值再存入MD2,这是个32位位存储区域L +10 //将16位整数10存入ACC1,32位16进制数35自动移动到ACC2T MW100 //这个值再存入MW100,这是个16位位存储区域OPN DB[MW100] //打开DB10。
这里[MW100]就是个单字指针,存放指针区域是M区,MW100中值10,就是指针间接指定址,它是个16位值!--------L L#+10 //以32位形式,把10放入ACC1,此时,ACC2中内容为:16位整数10T 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倍数。
现,我们来分析一下上述例子中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详解西门子间接寻址<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是这个存储区域尺寸符,指是背景数据块中位。
但下面一个示例中M呢?X指定了存储区域尺寸符,那么存储区域符哪里呢?毫无疑问,AR1中!DIX [AR1,P#1.5] 这个例子,要寻址址区域事先已经确定,AR1可以改变这个区域内确切址数值单元,我们称之为:区域内寄存器间接寻址方式,相应,这里[AR1,P#1.5] 就叫做区域内寻址指针。
X [AR1,P#1.5] 这个例子,要寻址址区域和确切址数值单元,都未事先确定,确定了存储大小,这就是意味着我们可以不同区域间不同址数值单元以给定区域大小进行寻址,称之为:区域间寄存器间接寻址方式,相应,这里[AR1,P#1.5] 就叫做区域间寻址指针。
既然有着区域内和区域间寻址之分,那么,同样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内容要求,说规定不同。
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区中进行寻址,只需8后面跟上一个40。
84000000-840FFFFF指明了要寻址范围是:DB区0.0——65535.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是Pointer,是个32位直接指针。
所谓直接,是指P#中#后面所跟数值存储单元,是P直接给定。
这样P#XXX这种指针,就可以被用来指令寻址中,作为一个“常数”来对待,这个“常数”可以包含或不包含存储区域。
例如:●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#指定数值时,累加器中值和区域内寻址指针规定格式相同(也和存储器间接寻址双字指针格式相同);而当对P#指定带有存储区域时,累加器中内容和区域间寻址指针内容完全相同。