资源描述
Hauptteiltext,Zweite Ebene,Dritte Ebene,Folientitel,Date:,2024/9/29,File:PRO2_04E.,23,SIMATIC S7,Siemens AG 2001. All rights reserved.,SITRAIN,Training for,Automation and Drives,间接寻址及地址寄存器指令,L W AR1, P#200.0,-,-,-,-,1,2,9,10,#,Ini_Value,#,Par_Pointer,#,Counter,?,?,?,STEP 7,中可能的寻址方式,寻址方式,直接寻址,间接寻址,绝对寻址,符号寻址,存储器间接寻址,寄存器间接寻址,示例:,A I 4.0A Mot_onOPN DBMW10A IMD30A IAR1,P#0.0A AR1,P#0.0,L IW10L #NumSP Truntime,L IWNumber,L IDAR1,P#5.0T WAR1,P#0.0,16位指针,(DB, T, C),32位指针,内部区域,32位指针,内部区域,32位指针,交叉区域,变量直接寻址,存储单元位置 (示例),I,37.4,地址,附加访问宽度,字节,字,双字,含义,输入,Q,27.7,字节,字,双字,输出,PIB,655,字节,字,双字,外设输入,PQB,653,字节,字,双字,外设输出,M,55.0,字节,字,双字,位(,Bit),存储器,T,114,-,定时器,C,13,-,计数器,DBX,2001.6,字节(,DBB),字(,DBW),双字(,DBD),通过,DB,寄存器寻址的数据,DIX,406.1,字节(,DIB),字(,DIW),双字(,DID),通过,DI,寄存器寻址的数据,L,88.5,字节(,LB),字(,LW),双字 (,LD),本地数据堆栈,DB,中地址标识符直接寻址,打开的数据块,在数据块中装载和传递,OPN DB 19,OPN Values,OPN DI 20,组合指令,(,包含,OPN D DB.),L DBB 1,装载数据字节1,L DBW 2,装载数据字,2(,字节,2/3),L 5,装载数字,5,T DBW 4,传递到字,4,L A,装载,ASCII,字符,A,L DIB28,装载数据字节,28,=I,比较,A DBX 0.0,从0字节的第0位开始扫描,L DB19.DBW4,从,DB 19,中,装载数据字,4,L “Values”.Number_1,符号访问变量,Number_1. DB19,具有变量名,“,Values,”,A DB10.DBX4.7,从,DB 10,的第4个字节的第7位开始扫描,用于,DB,寄存器的指令:,CDB,:,交换,DB,寄存器内容,将,DB,寄存器内容装载到,ACCU1,中,L DBNO,(,将打开的,DB,号装载到,ACCU1,中),L DINO,(,将打开的,DI,号装载到,ACCU1,中),装载数据块长度,L DBLG,(,将打开的,DB,的长度/字节装载到,ACCU1,中),L DILG,(,将打开的,DI,的长度/字节装载到,ACCU1,中),在程序中分析数据块,DB,相关信息,指令执行前:,指令执行后:,CDB,123,24,24,123,DB,寄存器,DI,寄存器,字格式的16位指针,(,用于对,DB、T、C,进行寻址,),L 11,T MW 60,OPN DBMW 60 OPN DB 11,双字格式的32位指针,(,用于对,I、Q、M.,进行寻址,),L P#24.0,T MD 50,L I W MD50 L IW 24,存储 访问,地址,区域,宽度,存储器间接寻址,用于存储器间接寻址的指针结构,16,位指针的结构:,为,0 . 65 535,之间的无符号整数,0,0,0,0,0,0,0,0,1,0,0,1,0,0,1,0,15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0,2,0,2,15,2,7,146,32,位指针的结构,(,内部区域):,B,B,B,B,B,B,B,B,B,B,B,B,B,X,X,X,15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0,0,0,0,0,0,0,0,0,0,0,0,0,0,B,B,B,31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16,2,0,2,2,位地址,字节地址,(,无符号整数,),2,0,2,15,未定义,装载,32,位指针常量,(,内部区域,):,L P#25.3 (P =,指针,字节地址,= 25,,位地址:,3),存储器间接寻址的特性,用于存储16位和32位指针的地址区域:,位(,Bit,)存储区,(,绝对寻址或符号寻址),例如:,OPN DBMW30,,,OPN DI“Motor_1”,等。,A IMD30,,,T QDSpeed_1,,,等,),本地数据堆栈,(,绝对寻址或符号寻址,,例如:,OPN DBLW10,,,OPN DI#DB_NO,等。,A ILD10,,,T QD#Par_Pointer,,,等。,),全局,(,共享,),数据块(只能进行绝对寻址,,DB,必须预先打开,,例如:,OPN DBDBW0,(,覆盖掉,DB,寄存器内容!),,OPN,DIDBW22,等。,A IDBD10,,,T QDDBD22,,,等。,),背景数据块(只能进行绝对寻址,,DI,必须预先打开,,例如:,OPN DBDIW20,,,OPN DIDIW0,(,覆盖掉,DI,寄存器内容,!),,,等。,A IDID10,T QDDID22,等。,),向,FB,和,FC,传递指针的特点,在参数里传递的指针不能直接用于存储器间接寻址。,用于存储器间接寻址而传递的指针,在访问之前必须拷贝到临时变量里去,间接寻址示例,FC30,:,间接寻址示例,Network(,段) 1:使用间接寻址方式打开,DB,L#,dbnumber,/,将,DB,号拷贝到,MW100,TMW100/,OPNDBMW 100/,打开,DB,Network (,段),2:,循环删除,LP#18.0/,将终端地址(,DBW18),作为指针,TMD40/,传送到,MD 40,;,L10/,将循环计数器值设置为10,next:TMB50/,传到,MB 50,中;,L0/,装载初始值,TDBWMD 40/,传到,DB50,中;,LMD40/,装载指针,LP#2.0/,并减去2个字节,-D/,然后再传回,TMD40/,到,MD 40,;,LMB50/,装载循环计数器,LOOPnext/,减去2个字节,条件满足则跳转;,练习4.1:用间接寻址的方法进行循环编程,-,-,-,-,Meas_Value1,Meas_Value2,Meas_Value9,Meas_Value10,Meas_Value11,#,Ini_Value,1.0,2.0,9.0,10.0,11.0,. . .,等等。,DB41,0,4,32,36,40,DB,中指向地址的指针,#,Par_Pointer,#,Counter,字节地址,内部区域,寄存器间接寻址,LAR1 P#10.0 /,设置,AR1,AR1:,0,0000,000,0000 0,000 0000 0000 0101 0,000 +,200,L M W AR1, P#200.0,存储区域,访问 地址 偏移扩展指令:,L MW 210,宽度寄存器 常量,AR 1,或,AR2,中的内部区域指针:,B,B,B,B,B,B,B,B,B,B,B,B,B,X,X,X,15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0,0,0,0,0,0,0,0,0,0,0,0,0,0,B,B,B,31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16,2,0,2,2,位地址,字节地址,(,无符号整数,),2,0,2,15,未定义,指令语法规则:,交叉,区域,寄存器间接寻址,LAR1 P#I10.0 /,设置,AR1,AR1:,1,0000,001,0000 0,000 0000 0000 0101 0,000,L W AR1, P#200.0,+,200,访问,地址,偏移,扩展,指令,:,L IW 210,宽度,寄存器,常量,AR 1,或,AR 2,中的交叉区域指针:,B,B,B,B,B,B,B,B,B,B,B,B,B,X,X,X,15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0,1,0,0,0,0,R,R,R,0,0,0,0,0,B,B,B,31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16,位地址,字节地址,(,无符号整数,),地址标识符,指令语法规则:,Bit 31=0:,内部区域,Bit 31=1:,交叉区域,地址标识符:,000I/O,001,输入(,PII,),010,输出(,PIQ,),011,位,(,Bit),存储器,100DB,寄存器中的数据,101DB,寄存器2中的数据,(DI),110,自有本地数据111调用块的,LD,(,本地数据),用于装载地址寄存器的指令,装载地址寄存器,LARn,(n =1 or 2):,将,ACCU1,中的内容装载到,ARn,LARn,将,中的内容装载到,ARn,LARn,P#,将,中的地址装载到,ARn,:,处理器寄存器:,AR1,,,AR2 (,比如:,LAR1 AR2,及,LAR2 AR1,),32,位变量:,MD,,,LD,,,DBD,,,DID (,比如:,L DBD5,等),32,位符号变量:,32,位全局变量,(,比如:,LAR1,“,索引”,等,) (,全局和局域的) 以及,OB,,,FB,及,FC,的,TEMP,(,临时)变量,(比如:,LAR1 #Address,,,等),P#,指向布尔型绝对地址,En.m,,,An.m,,,Mn,.m,,,Ln,.m,,,DBXn,.m,,,DIXn,.m,指针,:,(,比如:,LAR1 P#M5.3,LAR2 P#I3.6,,,等),指向本地、符号地址,OB,:,TEMP,(,临时)变量,(,比如:,LAR1 P#Par_Pointer,等),FB,:,IN-,,,OUT-,,,INOUT-,,,STAT-,及,TEMP-,FC,:,TEMP,(,临时)变量,(,LAR1 P#Loop,,,等),其它用于地址寄存器的指令,传送出地址寄存器内容,TARn,(,n =1 or 2,):,从,Arn,传送到,ACCU1,TARn,从,Arn,传送到,:,处理器寄存器:,AR2,(,比如:,TAR1 AR2,),32,位绝对地址变量:,MDn,,,LDn,,,DBDn,,,DIDn,(,如,TAR2 MD5,等),32,位符号变量:,32,位全局变量,(,比如,TAR1,“Index,”,,等,),(,全局和局域的),及,OB,,,FB,及,FC,的,TEMP,(,临时)变量,(,比如,TAR1 #Address,等),地址寄存器内容交换,(,Swap),指令,TAR,将,地址寄存器,AR1,和,AR2,的内容相互,交换,地址寄存器加指令,+,ARn,将,ACCU1-L,内容加到,ARn,+,ARn,P#n.m,将内部区域指针,P#n.m,加到,AR1,或,AR2,中去,寄存器间接寻址的特性,在,STL/LAD/FBD,编辑器内使用,AR1,当访问,FC,中的参数时,如果参数为复杂数据类型,(,ARRAY,、,STRUCT,、,DATE_AND_TIME,),,则,AR1,寄存器,和,DB,寄存器,内容将会被覆盖掉。,当访问,FB,中的,INOUT,参数时,如果该,INOUT,参数是复杂数据类型,(,ARRAY,、,STRUCT,、,DATE_AND_TIME,),,则,AR1,寄存器,和,DB,寄存器,内容将会被覆盖掉。,在装载地址寄存器和对目标变量进行寄存器间接寻址的时候,不允许,访问局部参数,在,STL/LAD/FBD,编辑器内使用,AR2,在对,FB,内部所有参数和静态变量进行寻址的时候,,AR2,寄存器,和,DI,寄存器,均用作基址寄存器。,如果用户在,FB,内部将,AR2,或,DI,覆盖了,之后就可以访问该,FB,专用参数或静态变量。也就是说,未恢复两个寄存器时不可访问。,在,FC,内,对,AR2,寄存器和,DI,寄存器没有限制,#,ACCU1,DB,中指向地址的指针,#,AR1,#,ACCU2,-,-,-,-,Number1,Number2,Number9,Number10,Number11,1,2,9,10,11,. . .,等等。,DB42,0,4,32,36,40,字节地址,练习4.2:用寄存器间接寻址进行循环编程,POINTER,类型和,ANY,类型数据的块参数,地址,声明,名称,类型,0.0,输入参数,DB_NumWORD,2.0,输入参数,Area_PointerDWORD,6.0,输入参数,LengthWORD,. . .,L #DB_Num,T #I_DB_NumOPNDBI_DB_Num,.,L#Area_Pointer,LAR1,L#Length,.,FC.,分别传送实际地址的各个信息,(STEP 5,里的方式):,DB,号,起始地址,区域长度,等。,缺点:,程序员必须进行拆分,在调用期间,不能使用实际地址的符号名,一个地址,(区域)需要好几个参数,无一致性检查纠正,地址,声明,.,名称,类型,0.0,输入,Measure_1POINTER,. . .,8.0,输入,Measure_2ANY,. . .,L P#Measure_1,LAR1LWAR1,P#0.0,T#I_DB_Num,OPNDBI_DB_Num,LDAR1,P#2.0,LAR1,.,FC.,使用,POINTER,或,ANY,类型参数传递,(STEP 7,方式):,调用时,程序员可以使用实际地址的符号名,由,LAD/FBD/STL,编辑器拆分成单个信息,一个地址只需要一个参数,进行一致性检查纠正,POINTER,类型的结构和参数赋值,Byte n,Byte n+2,Byte n+4,Byte n+1,Byte n+3,Byte n+5,DB,号(,INT),1,O O O _ O R R R _ O O O O _ O B B B,(32,位交叉区域指针,),B B B B _ B B B B _ B B B B _ B X X X,POINTER,类,型参数赋值,指针显示,P#,DBn,.DBXx.y,其中:,n= DB,号,,x=,字节数,,y=,位数,P#,DIn,.DIXx.y(,比如,P#DB5.DBX3.4,,,P#DI2.DIX10.0,,,等),P#,Zx,.y,其中:,Z=,区域,比如:,P,,,I,,,Q,,,M,及,L(,比如,P#I5.3,,,P#M10.0,,,等),地址声明:,MD30 (,这种情况下,,DB,号区域标识符及位地址自动输入,#Motor_on,到,POINTER,参数中),Motor_1.speed,数据类型结构:,POINTER,ANY,数据类型的结构,ANY,数据类型指针,Byte n,Byte n+2,Byte n+4,DB,号,1,O O O _ O R R R _ O O O O _ O B B B,B B B B _ B B B B _ B B B B _ B X X X,16#10,Data type,复制系数,Byte n+6,Byte n+8,数据类型标识符,VOID00BOOL01BYTE02CHAR03WORD04INT05DWORD06DINT07REAL08DATE09TOD0ATIME0BS5TIME0CDT0ESTRING13,参数类型标识符,BLOCK_FB17BLOCK_FC18BLOCK_DB19BLOCK_SDB1ACOUNTER1CTIMER1D,ANY,参数类型指针,Byte n,Byte n+2,Byte n+4,16#0000,定时器,计数器或块的号,16#10,参数类型,16#0001,Byte n+6,Byte n+8,16#0000,ANY,数据类型的参数赋值,指针显示:,P#,数据块.位地址 类型号,P#DB10.DBX12.0 REAL 20,指向,DB10,中的一个区域:从,Byte 12,开始的20个,REAL,类型的地址,(ARRAY1.20 OF REAL),P#I 10.0 BOOL 8,指向,IB10,里的一个8位区域,地址声明:,绝对地址:,DB5.DBD10,数据类型:,DWORD,,,复制系数:,1 DB,号:5,指针:,P#DB5.DBX10.0,IW32,类型:,WORD,,,WF: 1,,,DB,号:0,指针:,P#I 32.0T35,类型:,TIMER,,,编号:35,符号地址:,#Motor_1.speed,使用基本数据类型,编译器建立正确,“Pump”.Start,的数据类型,复制系数1以及指针,注意事项,符号,(ARRAY,、,STRUCT,、,STRING,、,UDT),赋值时,数据类型标识符02,(BYTE),以及区域字节长度,只能由,编译器来建立,并输入到,ANY,指针。,ANY,类型间接参数分配,使用临时变量对,ANY,数据类型进行实际参数赋值,在调用块中声明,ANY,数据类型临时变量,例如:,temp aux_pointerANY,用指针信息对,ANY,临时变量进行赋值,例如:,LAR1P#aux_pointer/,装载辅助指针地址,L B#16#10/,装载标识符,10TLB AR1,P#0.0/,并传送到,Offset 0,L.,使用变量辅助指针对,ANY,块参数进行赋值,例如:,CALL FC 111,Targetfield,:=#aux_pointer,优点,在运行期间,对,ANY,指针参数进行动态重复赋值,评估,ANY,型指针传递,地址声明名称类型初始值注释,0.0inPar_PointerANY,out,in_out,0.0tempData_typeBYTE,2.0tempWFWORD,4.0tempDB_NrWORD,6.0tempArea_PointerDWORD,Network,1:创建数据类型、复制系数、,DB,号及区域指针,LP#Par_Pointer/,将,#Pointer,地址装载到,ACCU1,LAR1/,并从,ACCU1,中将其装载到,AR1,;,LB AR1,P#1.0/,从指针创建数据类型,T#Data_type/,并装载到临时变量中;,LW AR1,P#2.0/,建立复制系数,TWF/,并装载到临时变量中;,LW AR1,P#4.0/,建立,DB,号,T#DB_Nr/,并装载到临时变量中;,LD AR1,P#6.0/,建立区域指针,T#Area_Pointer/,并装载到临时变量中;,练习4.3:用于求和及计算平均值的功能,FC 43,EN,ENO,Measured_values,Sum,Mean_value,声明名称类型,输入参数,Measured_valuesANY,输出参数,SumREAL,输出参数,Mean_valueREAL,DB43,103.45,2086.5,1.7895,.,.,P#DB43.DBX0.0 REAL 8,名称类型,STRUCT,Measurement ARRAY1.8,REAL,END_STRUCT,
展开阅读全文