STEP 7 中可能的寻址方式中可能的寻址方式 寻址方式直接寻址间接寻址绝对寻址 符号寻址存储器间接寻址寄存器间接寻址示例:A I 4.0A Mot_onOPN DBMW10 A IMD30A IAR1,P#0.0A AR1,P#0.0L IW10L#NumSP Truntime L IWNumber L IDAR1,P#5.0T WAR1,P#0.016位指针(DB,T,C)32位指针内部区域32位指针内部区域32位指针交叉区域第1页/共23页变量直接寻址变量直接寻址存储单元位置(示例)I37.4地址附加访问宽度字节,字,双字含义输入Q27.7字节,字,双字输出PIB655字节,字,双字外设输入PQB653字节,字,双字外设输出M55.0字节,字,双字位(Bit)存储器T114-定时器C13-计数器DBX2001.6字节(DBB),字(DBW),双字(DBD)通过DB寄存器寻址的数据DIX406.1字节(DIB),字(DIW),双字(DID)通过DI寄存器寻址的数据L88.5字节(LB),字(LW),双字(LD)本地数据堆栈第2页/共23页DB中地址标识符直接寻址中地址标识符直接寻址打开的数据块在数据块中装载和传递OPN DB 19OPN ValuesOPN DI 20组合指令(包含OPN D DB.)L DBB 1装载数据字节1L DBW 2装载数据字2(字节2/3)L 5装载数字5T DBW 4传递到字4L A装载ASCII字符AL 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位开始扫描第3页/共23页用于DB寄存器的指令:l CDB:交换DB寄存器内容l 将DB寄存器内容装载到ACCU1中 L DBNO(将打开的DB号装载到ACCU1中)L DINO(将打开的DI号装载到ACCU1中)l 装载数据块长度 L DBLG(将打开的DB的长度/字节装载到ACCU1中)L DILG(将打开的DI的长度/字节装载到ACCU1中)在程序中分析数据块在程序中分析数据块DB相关信息相关信息 指令执行前:指令执行后:CDB1232424123DB寄存器DI寄存器第4页/共23页l字格式的16位指针(用于对DB、T、C进行寻址)L 11T MW 60OPN DBMW 60 OPN DB 11l双字格式的32位指针(用于对I、Q、M.进行寻址)L P#24.0 T MD 50 L I W MD50 L IW 24 存储 访问 地址 区域 宽度存储器间接寻址存储器间接寻址第5页/共23页用于存储器间接寻址的指针结构用于存储器间接寻址的指针结构l16位指针的结构:为0.65 535 之间的无符号整数0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 015 14 13 12 11 10 9 8 7 6 5 4 3 2 1 02021527146l32位指针的结构(内部区域):B B B B B B B B B B B B B X X X15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 00 0 0 0 0 0 0 0 0 0 0 0 0 B B B31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 162022位地址字节地址(无符号整数)20215未定义l装载32位指针常量(内部区域):L P#25.3(P=指针,字节地址=25,位地址:3)第6页/共23页存储器间接寻址的特性存储器间接寻址的特性用于存储16位和32位指针的地址区域:l 位(Bit)存储区(绝对寻址或符号寻址)例如:OPN DBMW30,OPN DI“Motor_1”等。
A IMD30,T QDSpeed_1,等)l 本地数据堆栈(绝对寻址或符号寻址,例如:OPN DBLW10,OPN DI#DB_NO等A ILD10,T QD#Par_Pointer,等l 全局(共享)数据块(只能进行绝对寻址,DB必须预先打开,例如:OPN DBDBW0(覆盖掉DB寄存器内容!),OPN DIDBW22等A IDBD10,T QDDBD22,等l 背景数据块(只能进行绝对寻址,DI必须预先打开,例如:OPN DBDIW20,OPN DIDIW0(覆盖掉DI寄存器内容!),等A IDID10,T QDDID22等向FB和FC传递指针的特点l 在参数里传递的指针不能直接用于存储器间接寻址l 用于存储器间接寻址而传递的指针,在访问之前必须拷贝到临时变量里去第7页/共23页间接寻址示例间接寻址示例FC30:间接寻址示例Network(段)1:使用间接寻址方式打开DB L#dbnumber/将DB号拷贝到MW100TMW100/OPN DBMW 100/打开DBNetwork(段)2:循环删除LP#18.0/将终端地址(DBW18)作为指针TMD40/传送到MD 40;L10/将循环计数器值设置为10next:TMB50/传到MB 50中;L0/装载初始值TDBWMD 40/传到DB50中;LMD40/装载指针LP#2.0/并减去2个字节-D/然后再传回TMD40/到MD 40;LMB50/装载循环计数器LOOPnext/减去2个字节,条件满足则跳转;第8页/共23页练习练习4.1:用间接寻址的方法进行循环编程:用间接寻址的方法进行循环编程-Meas_Value1Meas_Value2Meas_Value9Meas_Value10Meas_Value11#Ini_Value1.02.09.010.011.0 .等等。
DB4104323640DB中指向地址的指针#Par_Pointer#Counter字节地址第9页/共23页内部区域,寄存器间接寻址内部区域,寄存器间接寻址LAR1 P#10.0 /设置AR1 AR1:00000000 0000 0000 0000 0000 0101 0000 +200L M W AR1,P#200.0存储区域访问 地址 偏移扩展指令:L MW 210 宽度寄存器 常量lAR 1或AR2中的内部区域指针:B B B B B B B B B B B B B X X X15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 00 0 0 0 0 0 0 0 0 0 0 0 0 B B B31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 162022位地址字节地址(无符号整数)20215未定义l指令语法规则:第10页/共23页交叉交叉区域,寄存器间接寻址区域,寄存器间接寻址LAR1 P#I10.0 /设置AR1 AR1:10000001 0000 0000 0000 0000 0101 0000L W AR1,P#200.0 +200 访问 地址 偏移扩展指令:L IW 210 宽度 寄存器 常量lAR 1或AR 2中的交叉区域指针:B B B B B B B B B B B B B X X X15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 01 0 0 0 0 R R R 0 0 0 0 0 B B B31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16位地址字节地址(无符号整数)地址标识符l指令语法规则:Bit 31=0:内部区域Bit 31=1:交叉区域l地址标识符:000 I/O001输入(PII)010 输出(PIQ)011位(Bit)存储器 100 DB寄存器中的数据101 DB寄存器2中的数据(DI)110 自有本地数据111调用块的LD(本地数据)第11页/共23页用于装载地址寄存器的指令用于装载地址寄存器的指令装载地址寄存器l LARn(n=1 or 2):将ACCU1中的内容装载到ARnl LARn 将中的内容装载到ARnl LARn P#将中的地址装载到ARn:l 处理器寄存器:AR1,AR2(比如:LAR1 AR2 及LAR2 AR1)l 32位变量:MD,LD,DBD,DID(比如:L DBD5等)l 32位符号变量:32位全局变量(比如:LAR1“索引”,等)(全局和局域的)以及OB,FB及FC的TEMP(临时)变量(比如:LAR1#Address,等)P#l 指向布尔型绝对地址 En.m,An.m,Mn.m,Ln.m,DBXn.m,DIXn.m 指针:(比如:LAR1 P#M5.3,LAR2 P#I3.6,等)l 指向本地、符号地址OB:TEMP(临时)变量(比如:LAR1 P#Par_Pointer,等)FB:IN-,OUT-,INOUT-,STAT-及TEMP-FC:TEMP(临时)变量(LAR1 P#Loop,等)第12页/共23页其它用于地址寄存器的指令其它用于地址寄存器的指令传送出地址寄存器内容l TARn(n=1 or 2):从Arn传送到ACCU1l TARn 从Arn传送到:l 处理器寄存器:AR2(比如:TAR1 AR2)l 32位绝对地址变量:MDn,LDn,DBDn,DIDn(如TAR2 MD5等)l 32位符号变量:32位全局变量(比如TAR1“Index”,等)(全局和局域的)及OB,FB及FC的TEMP(临时)变量(比如TAR1#Address等)地址寄存器内容交换(Swap)指令l TAR将地址寄存器AR1和AR2的内容相互交换地址寄存器加指令l+ARn将ACCU1-L内容加到ARnl+ARn P#n.m将内部区域指针P#n.m加到AR1或AR2中去第13页/共23页寄存器间接寻址的特性寄存器间接寻址的特性 在STL/LAD/FBD编辑器内使用AR1l 当访问FC中的参数时,如果参数为复杂数据类型(ARRAY、STRUCT、DATE_AND_TIME),则AR1寄存器和DB寄存器内容将会被覆盖掉。
l 当访问FB中的INOUT参数时,如果该INOUT参数是复杂数据类型(ARRAY、STRUCT、DATE_AND_TIME),则AR1寄存器和DB寄存器内容将会被覆盖掉在装载地址寄存器和对目标变量进行寄存器间接寻址的时候,不允许 访问局部参数在STL/LAD/FBD编辑器内使用AR2 l 在对FB内部所有参数和静态变量进行寻址的时候,AR2寄存器和DI寄存器均用作基址寄存器如果用户在FB内部将 AR2或DI覆盖了,之后就可以访问该FB专用参数或静态变量也就是说,未恢复两个寄存器时不可访问l 在FC内,对AR2寄存器和DI寄存器没有限制 第14页/共23页#ACCU1DB中指向地址的指针#AR1#ACCU2-Number1Number2Number9Number10Number111291011 .等等DB4204323640字节地址练习练习4.2:用寄存器间接寻址进行循环编程:用寄存器间接寻址进行循环编程第15页/共23页POINTER类型和类型和ANY类型数据的块参数类型数据的块参数地址声明名称类型0.0 输入参数 DB_NumWORD2.0 输入参数 Area_PointerDWORD6.0 输入参数 LengthWORD.L#DB_NumT#I_DB_NumOPNDBI_DB_Num.L#Area_PointerLAR1L#Length.FC.分别传送实际地址的各个信息(STEP 5里的方式):DB号 起始地址 区域长度,等。
缺点:程序员必须进行拆分 在调用期间,不能使用实际地址的符号名 一个地址(区域)需要好几个参数 无一致性检查纠正地址声明.名称类型0.0输入Measure_1POINTER.8.0输入Measure_2ANY.L P#Measure_1LAR1LWAR1,P#0.0T#I_DB_NumOPNDBI_DB_NumLDAR1,P#2.0LAR1.FC.使用POINTER或ANY类型参数传递 (STEP 7方式):调用时,程序员可以使用实际地址的符号名 由LAD/FBD/STL编辑器拆分成单个信息 一个地址只需要一个参数 进行一致性检查纠正第16页/共23页POINTER类型的结构和参数赋值类型的结构和参数赋值Byte nByte n+2Byte n+4Byte n+1Byte n+3Byte n+5DB号(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类型参数赋值l指针显示P#DBn.DBX x.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,等)l地址声明:MD30 (这种情况下,DB号区域标识符及位地址自动输入#Motor_on 到POINTER参数中)lMotor_1.speed 数据类型结构:POINTER第17页/共23页ANY数据类型的结构数据类型的结构lANY数据类型指针Byte nByte n+2Byte n+4DB号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 X16#10Data type复制系数Byte n+6Byte n+8数据类型标识符VOID00BOOL01BYTE02CHAR03WORD04INT05DWORD06DINT07REAL08DATE09TOD0ATIME0BS5TIME0CDT0ESTRING13参数类型标识符BLOCK_FB 17BLOCK_FC 18BLOCK_DB 19BLOCK_SDB 1ACOUNTER1CTIMER1DlANY参数类型指针Byte nByte n+2Byte n+416#0000定时器,计数器或块的号16#10参数类型16#0001Byte n+6Byte n+816#0000第18页/共23页 ANY数据类型的参数赋值数据类型的参数赋值指针显示:lP#数据块.位地址 类型号P#DB10.DBX12.0 REAL 20指向DB10中的一个区域:从 Byte 12开始的20个REAL类型的地址(ARRAY1.20 OF REAL)P#I 10.0 BOOL 8指向IB10里的一个8位区域地址声明:l绝对地址:DB5.DBD10数据类型:DWORD,复制系数:1 DB号:5,指针:P#DB5.DBX10.0IW32类型:WORD,WF:1,DB 号:0,指针:P#I 32.0T35类型:TIMER,编号:35l符号地址:#Motor_1.speed使用基本数据类型,编译器建立正确“Pump”.Start的数据类型,复制系数1以及指针注意事项符号(ARRAY、STRUCT、STRING、UDT)赋值时,数据类型标识符02(BYTE)以及区域字节长度只能由编译器来建立,并输入到ANY指针。
第19页/共23页ANY类型间接参数分配类型间接参数分配使用临时变量对ANY数据类型进行实际参数赋值l在调用块中声明ANY数据类型临时变量例如:temp aux_pointer ANY l用指针信息对ANY临时变量进行赋值例如:LAR1P#aux_pointer/装载辅助指针地址L B#16#10/装载标识符10TLB AR1,P#0.0/并传送到Offset 0L.l使用变量辅助指针对ANY 块参数进行赋值例如:CALL FC 111 Targetfield:=#aux_pointer优点l在运行期间,对ANY指针参数进行动态重复赋值第20页/共23页评估评估ANY型指针传递型指针传递地址声明名称类型初始值注释0.0inPar_PointerANYoutin_out0.0tempData_typeBYTE2.0tempWFWORD4.0tempDB_NrWORD6.0tempArea_PointerDWORDNetwork 1:创建数据类型、复制系数、DB号及区域指针LP#Par_Pointer/将#Pointer地址装载到ACCU1LAR1/并从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/并装载到临时变量中;第21页/共23页练习练习4.3:用于求和及计算平均值的功能:用于求和及计算平均值的功能FC 43ENENOMeasured_values SumMean_value声明名称类型输入参数Measured_valuesANY输出参数SumREAL输出参数Mean_valueREALDB43103.452086.51.7895.P#DB43.DBX0.0 REAL 8名称类型STRUCTMeasurement ARRAY1.8REALEND_STRUCT第22页/共23页感谢您的观看!第23页/共23页。