2022年step编程之地址概念详解2.docx

上传人:C****o 文档编号:12800478 上传时间:2022-04-26 格式:DOCX 页数:17 大小:36.71KB
返回 下载 相关 举报
2022年step编程之地址概念详解2.docx_第1页
第1页 / 共17页
2022年step编程之地址概念详解2.docx_第2页
第2页 / 共17页
点击查看更多>>
资源描述

《2022年step编程之地址概念详解2.docx》由会员分享,可在线阅读,更多相关《2022年step编程之地址概念详解2.docx(17页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、完整的一条指令,应当包含指令符 +操作数(当然不包括那些单指令,比如 NO T等);其中的操作数是指令要执行的目标,也就是指令要进行操作的地址;我们知道,在 PLC中划有各种用途的储备区,比如物理输入输出区 P、映像输入区I、映像输出区 Q、位储备区 M 、定时器 T、计数器 C、数据区 DB 和L等,同时我们仍知道,每个区域可以用位( BIT)、字节( BYTE)、字( WORD )、双字( DWORD )来衡量,或者说来指定准确的大小;当然定时器 T、计数器 C不存在这种衡量体制,它们仅用位来衡量;由此我们可以得到,要描述一个地址,至少应当包含两个要素:1、储备的区域2、这个区域中具体的位

2、置比如: AQ2.0其中的A是指令符, Q2.0是A 的操作数,也就是地址;这个地址由两部分组成: Q:指的是映像输出区2.0:就是这个映像输出区其次个字节的第 0位;由此,我们得出,一个准确的地址组成应当是:储备区符储备区尺寸符尺寸数值.位数值,例如: DBX200.0;DBX200.0其中,我们又把储备区符储备区尺寸符这两个部分合称为:地址标识符;这样,一个准确的地址组成,又可以写成:地址标识符+准确的数值单元【间接寻址的概念】寻址,就是指定指令要进行操作的地址;给定指令操作的地址方法,就是寻址方法;17 / 17在谈间接寻址之前,我们简洁的明白一下直接寻址;所谓直接寻址,简洁的说,就是直

3、接给出指令的准确操作数,象上面所说的,A Q2.0,就是直接寻址,对于 A这个指令来说, Q2.0就是它要进行操作的地址;这样看来,间接寻址就是间接的给出指令的准确操作数;对,就是这个概念;比如: A QMD100 , A TDBW100 ;程序语句中用方刮号 标明的内容,间接的指明白指令要进行的地址,这两个语句中的 MD100 和DBW 100称为指针 Pointer,它指向它们其中包含的数值,才是指令真刚要执行的地址区域的准确位置;间接由此得名;西门子的间接寻址方式计有两大类型:储备器间接寻址和寄存器间接寻址;【储备器间接寻址】储备器间接寻址的地址给定格式是:地址标识符+指针;指针所指示储

4、备单元中所包含的数值,就是地址的准确数值单元;储备器间接寻址具有两个指针格式:单字和双字;单字指针是一个 16bit的结构,从 0-15bit,指示一个从 0- 65535的数值,这个数值就是被寻址的储备区域的编号;双字指针是一个 32bit的结构,从 0-2bit,共三位,依据 8进制指示被寻址的位编号,也就是 0-7;而从 3-18bit,共16位,指示一个从 0-65535的数值,这个数值就是被寻址的字节编号;指针可以存放在 M、DI 、DB和L区域中,也就是说,可以用这些区域的内容来做指针;单字指针和双字指针在使用上有很大区分;下面举例说明:LDW#16#35/将32位16进制数 35

5、存入ACC1 TMD2/这个值再存入 MD2 ,这是个 32位的位储备区域L+10/将16位整数 10存入ACC1, 32位16进制数35自动移动到 ACC2 TMW100/ 这个值再存入 MW100 ,这是个 16位的位储备区域OPNDBWMW100/打开DBW10 ;这里的 MW100 就是个单字指针,存放指针的区域是 M 区, MW100 中的值 10,就是指针间接指定的地址,它是个16位的值!LL#+10/以32位形式,把 10放入ACC1 ,此时, ACC2中的内容为: 16位整数 10TMD104/ 这个值再存入 MD104 ,这是个 32位的位储备区域AIMD104/对I1.2进

6、行与规律操作!=DIXMD2 / 赋值背景数据位 DIX6.5 !ADBMW100.DBXMD2/ 读入DB10.DBX6.5 数据位状态=QMD2/赋值给Q6.5ADBMW100.DBXMD2/ 读入DB10.DBX6.5 数据位状态=QMW100/错误!没有 Q10这个元件从上面系列举例我们至少看出来一点:单字指针只应用在地址标识符是非位的情形下;的确,单字指针前面描述过, 它确定的数值是 0-65535,而对于 byte.bit这种具体位结构来说,只能用双字指针;这是它们的第一个区分,单字指针的另外一个限制就是,它只能对T、C、DB、FC和FB进行寻址,通俗地说,单字指针只可以用来指代这

7、些储备区域的编号;相对于单字指针,双字指针就没有这样的限制,它不仅可以对位地址进行寻址,仍可以对 BYTE、WORD 、DWORD 寻址,并且没有区域的限制;不过,有得必有失,在对非位的区域进行寻址时,必需确保其0-2bit为全0!总结一下:单字指针的储备器间接寻址只能用在地址标识符是非位的场合;双字指针由于有位格式存在,所以对地址标识符没有限制;也正是由于双字指针是一个具有位的指针,因此,当对字节、字或者双字储备区地址进行寻址时,必需确保双字指针的内容是 8或者8的倍数;现在,我们来分析一下上述例子中的 AIMD104为什么最终是对 I1.2进行与规律操作;通过LL#+10,我们知道存放在

8、MD104 中的值应当是: MD104 :00000000000000000000000000001010当作为双字指针时,就应当依据3-18bit指定byte,0- 2bit指定bit来确定最终指令要操作的地址,因此:00000000000000000000000000001010=1.2【地址寄存器间接寻址】在从前所说的储备器间接寻址中,间接指针用M、DB、DI 和L直接指定,就是说,指针指向的储备区内容就是指令要执行的准确地址数值单元;但在寄存器 间接寻址中,指令要执行的准确地址数值单元,并非寄存器指向的储备区内容,也就是说,寄存器本身也是间接的指向真正的地址数值单元;从寄存器到得出真正

9、的地址数值单元,西门子供应了两种途径:1、区域内寄存器间接寻址2、区域间寄存器间接寻址地址寄存器间接寻址的一般格式是:地址标识符寄存器 ,P#byte.bit,比如: DIXAR1,P#1.5或MAR1,P#0.0;寄存器 ,P#byte.bit统称为:寄存器寻址指针,而地址标识符在上帖中谈过,它包含储备区符 +储备区尺寸符;但在这里,情形有所变化;比较一下刚才的例子:DIXAR1,P#1.5XAR1,P#1.5DIX 可以认为是我们通常定义的地址标识符,DI 是背景数据块储备区域, X是这个储备区域的尺寸符,指的是背景数据块中的位;但下面一个示例中的M呢?X只是指定了储备区域的尺寸符,那么储

10、备区域符在哪里呢?毫无疑问,在AR 1中!DIXAR1,P#1.5这个例子,要寻址的地址区域事先已经确定,AR1可以转变的只是这个区域内的准确地址数值单元,所以我们称之为:区域内寄存器间接寻址方式,相应的,这里的 AR1,P#1.5就叫做区域内寻址指针;XAR1,P#1.5这个例子,要寻址的地址区域和准确的地址数值单元,都未事先确定,只是确定了储备大小,这就是意味着我们可以在不同的区域间的不同地址数值单元以给定的区域大小进行寻址,所以称之为:区域间寄存器间接寻址方式,相应的,这里的 AR1,P#1.5就叫做区域间寻址指针;既然有着区域内和区域间寻址之分,那么,同样的AR1 中,就存有不同的内容

11、,它们代表着不同的含义;【AR的格式】地址寄存器是特地用于寻址的一个特别指针区域,西门子的地址寄存器共有两个: AR1和AR2,每个 32位;当使用在区域内寄存器间接寻址中时,我们知道这时的AR中的内容只是指明数值单元,因此,区域内寄存器间接寻址时,寄存器中的内容等同于上帖中提及的储备器间接寻址中的双字指针,也就是:其0-2bit,指定 bit 位, 3-18bit指定byte字节;其第 31bit固定为 0;AR:0000000000000BBBBBBBBBBBBBBBBXXX这样规定,就意味着 AR的取值只能是: 0.0 65535.7例如:当 AR=D4 ( hex)=000000000

12、00000000000000011010100(b),实际上就是等于 26.4;而在区域间寄存器间接寻址中,由于要寻址的区域也要在AR中指定,明显这时的AR中内容确定于寄存器区域内间接寻址时,对AR内容的要求,或者说规定不同;AR:10000YYY00000BBBBBBBBBBBBBBBBXXX比较一下两种格式的不同,我们发觉,这里的第31bit被固定为 1,同时,第 24、25、26位有了可以取值的范畴;聪慧的你,确定可以联想到,这是用于指定储备区域的;对, bit24-26的取值确定了要寻址的区域,它的取值是这样定义的: 区域标识符26、25、24位P(外部输入输出) 000I(输入映像区

13、) 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开头,那么就

14、肯定是区域间寻址;假如要在 DB区中进行寻址,只需在 8后面跟上一个 40;84000000- 840FFFFF指明白要寻址的范畴是:DB区的0.0 65535.7;例如:当 AR=840000D4( hex) =1000 01000000 00000000 000011010100(b),实际上就是等于 DBX26.4 ;我们看到,在寄存器寻址指针AR1/2,P#byte.bit这种结构中, P#byte.bit又是什么呢?【P#指针】P#中的P是Pointer,是个 32位的直接指针;所谓的直接,是指 P#中的#后面所跟的数值或者储备单元,是 P直接给定的;这样 P#XXX 这种指针,就可

15、以被用来在指令寻址中,作为一个 “常数”来对待,这个 “常数”可以包含或不包含储备区域;例如: LP#Q1.0/把Q1.0这个指针存入 ACC1,此时ACC1的内容=82000008( hex)=Q1.0LP#1.0/把1.0这个指针存入 ACC1,此时ACC1的内容=00000008( hex)=1.0 LP#MB100/错误!必需依据 byte.bit结构给定指针; LP#M100.0/把M100.0这个指针存入 ACC1 ,此时ACC1的内容=83000320(hex)=M100.0 LP#DB100.DBX26.4/错误! DBX 已经供应了储备区域,不能重复指定; LP#DBX26.

16、4/把DBX26.4 这个指针存入 ACC1 ,此时ACC1的内容=840000D4(hex) =DBX26.4我们发觉,当对 P#只是指定数值时,累加器中的值和区域内寻址指针规定的格式相同(也和储备器间接寻址双字指针格式相同);而当对P#指定带有储备区域时,累加器中的内容和区域间寻址指针内容完全相同;事实上,把什么样的值传给AR,就打算了是以什么样的方式来进行寄存器间接寻址;在实际应用中,我们正是利用 P#的这种特点,依据不同的需要,指定 P#指针,然后,再传递给AR,以确定最终的寻址方式;在寄存器寻址中, P#XXX 作为寄存器 AR指针的偏移量,用来和 AR指针进行相加运算,运算的结果,

17、才是指令真刚要操作的准确地址数值单元!无论是区域内仍是区域间寻址,地址所在的储备区域都有了指定,因此,这里的P#XXX 只能指定纯粹的数值,如上面例子中的;【指针偏移运算法就】在寄存器寻址指针AR1/2,P#byte.bit这种结构中, P#byte.bit如何参加运算,得出最终的地址呢?运算的法就是: AR1和P#中的数值,依据 BYTE 位和BIT位分类相加; BIT 位相加按八进制规章运算,而 BYTE位相加,就依据十进制规章运算;例如:寄存器寻址指针是: AR1 ,P#2.6,我们分 AR1=26.4和DBX26.4 两种情形来分析;当AR1 等于26.4, AR1: 26.2+P#:

18、2.6=29.7这是区域内寄存器间接寻址的最终准确地址数值单元当AR1 等于DBX26.4 , AR1: DBX26.2+P#:2.6=DBX29.7这是区域间寄存器间接寻址的最终准确地址数值单元【AR的地址数据赋值】通过前面的介绍,我们知道,要正确运用寄存器寻址,最重要的是对寄存器AR的赋值;同样,区分是区域内仍是区域间寻址,也是看AR中的赋值;对AR的赋值通常有下面的几个方法:1、直接赋值法例如:LDW#16#83000320LAR1可以用 16进制、整数或者二进制直接给值,但必需确保是32位数据;经过赋值的AR1中既储备了地址数值,也指定了储备区域,因此这时的寄存器寻址方式 确定是区域间

19、寻址;2、间接赋值法例如:LMD100LAR1可以用储备器间接寻址指针给定3、指针赋值法AR1 内容;具体内容储备在MD100 中;例如:LAR1P#26.2使用P#这个32位“常数”指针赋值 AR;总之,无论使用哪种赋值方式,由于 AR储备的数据格式有明确的规定,因此, 都要在赋值前,确认所赋的值是否符合寻址规范;使用间接寻址的主要目的,是使指令的执行结果有动态的变化,简化程序是第一目的,在某些情形下,这样的寻址方式是必需的,比如对某储备区域数据遍历;此外,间接寻址,仍可以使程序更具柔性,换句话说,可以标准化;下面通过实例应用来分析如何敏捷运用这些寻址方式:【储备器间接寻址应用实例】我们先看

20、一段示例程序:L100TMW100/将16位整数 100传入MW100 LDW#16#8/加载双字 16进制数 8,当把它用作双字指针时,依据 BYTE.BIT 结构, 结果演化过程就是: 8H=1000B=1.0TMD2/MD2=8H OPNDBMW100/OPNDB100 LDBWMD2/LDB100.DBW1 TMWMD2/TMW1 ADBXMD2/ADBX1.0=MMD2/=M1.0在这个例子中,我们中心思想其实就是:将DB100.DBW1 中的内容传送到 MW1中;这里我们使用了储备器间接寻址的两个指针单字指针 MW100 用于指定 DB 块的编号,双字指针 MD2 用于指定 DBW

21、 和MW 储备区字地址;对于坛友提出的DBMW100.DBWMD2这样的寻址是错误的提法,这里做个说明:DBMW100.DBWMD2这样的寻址结构就寻址原理来说,是可以懂得的,但从SIEMENS程序执行机理来看,是非法的;在实际程序中,对于这样的寻址,程序语句应当写成:OPN DBWWM100 , L DBWMD2-事实上,从这个例子的中心思想来看,根本没有必要如此复杂;但为什么要用间接寻址呢?要澄清使用间接寻址的优势,就让我们从比较中,找答案吧;例子告知我们,它最终执行的是把 DB的某个具体字的数据传送到位储备区某个具体字中;这是针对数据块 100的1数据字传送到位储备区第 1字中的具体操作

22、;假如我们现在需要对同样的数据块的多个字(连续或者不连续)进行传送呢?直接的方法,就是一句一句的写这样的具体操作;有多少个字的传送,就写多少这样的语句;毫无疑问,即使不知道间接寻址的道理,也应当明白,这样的编程方法是不合理的;而假如使用间接寻址的方法,语句就简洁多了;【示例程序的结构分析】我将示例程序从结构上做个区分,重新输入如下:=输入1:指定数据块编号的变量|L100|TMW100= 输入2:指定字地址的变量|LDW#16#8|TMD2= 操作主体程序OPNDBMW100LDBWMD2TMWMD2明显,我们根本不需要对主体程序(红色部分)进行简洁而重复的复写,而只需转变 MW100 和MD

23、2 的赋值(绿色部分),就可以完成应用要求;结论:通过对间接寻址指针内容的修改,就完成了主体程序执行的结果变更, 这种修改是可以是动态的和静态的;正是由于对真正的目标程序(主体程序)不做任何变动,而寻址指针是这个程序中唯独要修改的地方,可以认为,寻址指针是主体程序的入口参数,就好比功能块的输入参数;因而可使得程序标准化,具有移植性、通用性;那么又如何动态改写指针的赋值呢?不会是另一种简洁而重复的复写吧;让我们以一个具体应用,来完善这段示例程序吧:将DB100中的1-11数据字,传送到 MW1-11 中在设计完成这个任务的程序之前,我们先明白一些背景学问;【数据对象尺寸的划分规章】数据对象的尺寸

24、分为:位( BOOL)、字节( BYTE )、字( WORD )、双字( DWORD );这好像是个简洁的概念,但假如,MW10=MB10+MB11 ,那么是不是说, MW11=MB12+MB13 ?假如你的回答是确定的,我建议你连续看下去,不要跳过,由于这里的疏忽,会导致最终的程序的错误;按位和字节来划分数据对象大小时,是以数据对象的bit 来偏移;这句话就是说, 0bit后就是 1bit,1bit后确定是 2bit,以此类推直到 7bit,完成一个字节大小的指定,再有一个 bit的偏移,就进入下一个字节的 0bit;而按字和双字来划分数据对象大小时,是以数据对象的BYTE来偏移!这就是 说

25、, MW10=MB10+MB11 ,并不是说, MW11=MB12+MB13 ,正确选项 MW11=MB11+MB12 ,然后才是 MW12=MB12+MB13 !这个概念的重要性在于,假如你在程序中使用了MW10 ,那么,就不能对 MW11进行任何的操作,由于, MB11 是MW10 和MW11 的交集;也就是说,对于 “将DB100中的1-11数据字,传送到 MW1-11中”这个具体任务而言,我们只需要对 DBW1 、DBW3 、DBW5 、DBW7 、DB W9、DBW11这6个字进行 6次传送操作即可;这就是单独分出一节,说明数据对象尺寸划分规章这个看似简洁的概念的目的所在;【循环的结

26、构】要“将DB100中的1-11数据字,传送到 MW1-11中”,我们需要将指针内容依据次序逐一指向相应的数据字,这种对指针内容的动态修改,其实就是遍历;对于遍历,最简洁的莫过于循环;一个循环包括以下几个要素:1、初始循环指针2、循环指针自加减2、连续或者退出循环体的条件判定被循环的程序主体必需位于初始循环指针之后,和循环指针自加减之前;比如:初始循环指针: X=0循环开头点 M被循环的程序主体: -循环指针自加减: X+1=X循环条件判定: X 10, False: GOTOM;True: GOTON循环退出点 N假如把X作为间接寻址指针的内容,对循环指针的操作,就等于对寻址指针内容的动态而

27、循环的修改了;【将DB100中的1-11数据字,传送到 MW1-11 中】LL#1/初始化循环指针;这里循环指针就是我们要修改的寻址指针TMD102M2:LMD102T#COUNTER_DOPNDB100LDBWMD102TMWMD102L#COUNTER_DLL#2/+2,是由于数据字的偏移基准是字节;+DT MD 102 /自加减循环指针,这是动态修改了寻址指针的关键L L#11 /循环次数 =n-1;n=6;这是由于,首次进入循环是无条件的, 但已事实上执行了一次操作;=DJCM2有关于T MD102 , L L#11, =D的具体分析,请依据前面的内容推导;【将DB1-10中的1-11

28、数据字,传送到 MW1-11 中】这里增加了对 DB数据块的寻址,使用单字指针MW100 储备寻址地址,同样使用了循环,嵌套在数据字传送循环外,这样,要完成“将DB1-10中的1-11数据字,传送到MW1-11中”这个任务,共需要 M1 循环10次M2 循环6次=60次;L1TMW100LL#1TMD102M1:LMW100T#COUNTER_WM2:对数据字循环传送程序,同上例L#COUNTER_WL1/这里不是数据字的偏移,只是编号的简洁递增,因此+1+ITMW100L=I9/循环次数 =n-1,n=10JCM1通过示例分析,程序是让寻址指针在对要操作的数据对象范畴内进行遍历来编程,完成这

29、个任务;我们看到,这种对储备器间接寻址指针的遍历是基于字节和字的,如何对位进行遍历呢?这就是下一个帖子要分析的寄存器间接寻址的实例的内容了;LMD100LAR1与LMD100LAR1有什么区分?当将MD100 以这种MD100形式表示时,你既要在对 MD100 赋值时考虑到所赋的值是否符合储备器间接寻址双字指针的规范,又要在使用这个寻址格式作为语句一部分时,是否符合语法的规范;在你给出第一个例程的第一句:L MD100 上,我们看出它犯了后一个错误;储备器间接寻址指针,是作为指定的储备区域的准确数值单元来运用的;也就是说,指针不包含区域标识,它只是指明白一个数值;因此,要在MD100 前加上区

30、域标识如:M、DB、I、Q、L 等,仍要加上储备区尺寸大小如: X、B、W、D等;在加储备区域和大小标识时,要考虑累加器加载指令L不能对位地址操作,因此,只 能指定非位的地址;为了对比下面的寄存器寻址方式,我们这里,修改为:LMDMD100 ;并假定 MD100=8Hex,同时我们也假定 MD1=85000018Hex;当把MD100 这个双字作为一个双字指针运用时,其储备值的0-18bit将会依据双字指针的结构 Byte.bit来重新 “翻译”, “翻译”的结果才是指针指向的地址,因而 MD100 中的8Hex=1000B=1.0,所以下面的语句:L MDMD100LAR1经过“翻译”就是:

31、LMD1LAR1前面我们已经假定了 MD1=85000018,同样道理, MD1 作为指针使用时,对 0- 18bit应当经过 Byte.bit结构的 “翻译”,由于是传送给 AR地址寄存器,仍要对 24-31bit进行区域寻址 “翻译”;这样,我们得出 LAR1 中最终的值 =DIX3.0 ;就是说,我们在地址寄存器 AR1 中储备了一个指针,它指向 DIX3.0 ;LMD100LAR1这段语句,是直接把 MD100 的值传送给 AR,当然也要经过 “翻译”,结果 AR1=1. 0;就是说,我们在地址寄存器 AR1中储备了一个指针,它指向 1.0,这是由 MD100直接赋值的;好像,两段语句,只是赋值给 AR1 的结果不同而已,其实不然;我们事先假定的值是考虑到对比的关系,特意指定的;假如MD100=CHex的呢?对于前一段,由于 CHex=1100,其0-3bit为非0,程序将立刻出错,无法执行;(由于没有MD1.4这种地址!) 后一段AR1的值经过翻译以后,等于 1.4,程序能正常执行;

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 高考资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁