SIEMENS PLC间接寻址及地址寄存器指令.ppt
间接寻址及地址寄存器指令,LW[AR1,P200.0],,,,,----,,,,1,2,9,10,,,,Ini_Value,Par_Pointer,,,Counter,,,,STEP7中可能的寻址方式,,寻址方式,直接寻址,间接寻址,绝对寻址,符号寻址,存储器间接寻址,寄存器间接寻址,,,,,,,示例AI4.0A“Mot_on“OPNDB[MW10]AI[MD30]AI[AR1,P0.0]A[AR1,P0.0]LIW10LNumSPT[“runtime“]LIW[“Number“]LID[AR1,P5.0]TW[AR1,P0.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中地址标识符直接寻址,打开的数据块,在数据块中装载和传递,OPNDB19OPN“Values“OPNDI20组合指令(包含OPNDDB..),LDBB1装载数据字节1LDBW2装载数据字2(字节2/3)L5装载数字5TDBW4传递到字4L‘A’装载ASCII字符ALDIB28装载数据字节28I比较ADBX0.0从0字节的第0位开始扫描LDB19.DBW4从DB19中装载数据字4L“Values”.Number_1符号访问变量Number_1.DB19具有变量名“Values”ADB10.DBX4.7从DB10的第4个字节的第7位开始扫描,,用于DB寄存器的指令CDB交换DB寄存器内容将DB寄存器内容装载到ACCU1中LDBNO(将打开的DB号装载到ACCU1中)LDINO(将打开的DI号装载到ACCU1中)装载数据块长度LDBLG(将打开的DB的长度/字节装载到ACCU1中)LDILG(将打开的DI的长度/字节装载到ACCU1中),在程序中分析数据块DB相关信息,指令执行前,指令执行后,,,CDB,,123,24,,,24,123,,DB寄存器,DI寄存器,字格式的16位指针(用于对DB、T、C进行寻址)L11TMW60OPNDB[MW60]OPNDB11双字格式的32位指针(用于对I、Q、M...进行寻址)LP24.0TMD50LIW[MD50]LIW24存储访问地址区域宽度,,存储器间接寻址,,,,,,,用于存储器间接寻址的指针结构,,16位指针的结构为0...65535之间的无符号整数,,0,,0,,0,,0,,0,,0,,0,,0,1,,0,,0,,1,0,,0,,1,,0,,,1514131211109876543210,20,215,27,146,32位指针的结构(内部区域),B,,,B,,B,,B,,B,,B,,B,,B,B,,B,,B,,B,B,,X,,X,,X,,,1514131211109876543210,0,,0,,0,,0,,0,,0,,0,,0,0,,0,,0,,0,0,,B,,B,,B,,,,31302928272625242322212019181716,20,22,位地址,字节地址(无符号整数),20,215,未定义,装载32位指针常量(内部区域)LP25.3(P指针,字节地址25,位地址3),,存储器间接寻址的特性,用于存储16位和32位指针的地址区域位(Bit)存储区(绝对寻址或符号寻址例如OPNDB[MW30],OPNDI[“Motor_1”]等。AI[MD30],TQD[“Speed_1“],等)本地数据堆栈(绝对寻址或符号寻址,例如OPNDB[LW10],OPNDI[DB_NO]等。AI[LD10],TQD[Par_Pointer],等。)全局(共享)数据块(只能进行绝对寻址,DB必须预先打开,例如OPNDB[DBW0](覆盖掉DB寄存器内容),OPNDI[DBW22]等。AI[DBD10],TQD[DBD22],等。)背景数据块(只能进行绝对寻址,DI必须预先打开,例如OPNDB[DIW20],OPNDI[DIW0](覆盖掉DI寄存器内容),等。AI[DID10],TQD[DID22]等。)向FB和FC传递指针的特点在参数里传递的指针不能直接用于存储器间接寻址。用于存储器间接寻址而传递的指针,在访问之前必须拷贝到临时变量里去,间接寻址示例,FC30间接寻址示例Network(段)1使用间接寻址方式打开DBLdbnumber//将DB号拷贝到MW100TMW100//OPNDB[MW100]//打开DBNetwork(段)2循环删除LP18.0//将终端地址(DBW18)作为指针TMD40//传送到MD40;L10//将循环计数器值设置为10nextTMB50//传到MB50中;L0//装载初始值TDBW[MD40]//传到DB50中;LMD40//装载指针LP2.0//并减去2个字节-D//然后再传回TMD40//到MD40;LMB50//装载循环计数器LOOPnext//减去2个字节,条件满足则跳转;,,练习4.1用间接寻址的方法进行循环编程,,,,----,,,,Meas_Value[1],Meas_Value[2],Meas_Value[9],Meas_Value[10],Meas_Value[11],,,Ini_Value,1.0,2.0,9.0,10.0,11.0...,等等。,DB41,0,4,32,36,40,DB中指向地址的指针,Par_Pointer,,,Counter,,字节地址,内部区域,寄存器间接寻址,,,,LAR1P10.0//设置AR1AR100000000000000000000000001010000200LMW[AR1,P200.0]存储区域访问地址偏移扩展指令LMW210宽度寄存器常量,,,,,,,AR1或AR2中的内部区域指针,B,,,B,,B,,B,,B,,B,,B,,B,B,,B,,B,,B,B,,X,,X,,X,,,1514131211109876543210,0,,0,,0,,0,,0,,0,,0,,0,0,,0,,0,,0,0,,B,,B,,B,,,,31302928272625242322212019181716,20,22,位地址,字节地址(无符号整数),20,215,未定义,指令语法规则,交叉区域,寄存器间接寻址,,,,LAR1PI10.0//设置AR1AR110000001000000000000000001010000LW[AR1,P200.0]200访问地址偏移扩展指令LIW210宽度寄存器常量,,,,,,AR1或AR2中的交叉区域指针,B,,,B,,B,,B,,B,,B,,B,,B,B,,B,,B,,B,B,,X,,X,,X,,,1514131211109876543210,1,,0,,0,,0,,0,,R,,R,,R,0,,0,,0,,0,0,,B,,B,,B,,,,31302928272625242322212019181716,位地址,字节地址(无符号整数),地址标识符,指令语法规则,,Bit310内部区域Bit311交叉区域,地址标识符000I/O001输入(PII)010输出(PIQ)011位(Bit)存储器100DB寄存器中的数据101DB寄存器2中的数据(DI)110自有本地数据111调用块的LD(本地数据),用于装载地址寄存器的指令,装载地址寄存器LARn(n1or2)将ACCU1中的内容装载到ARnLARn将中的内容装载到ARnLARnP将中的地址装载到ARn处理器寄存器AR1,AR2(比如LAR1AR2及LAR2AR1)32位变量MD,LD,DBD,DID(比如LDBD5等)32位符号变量32位全局变量(比如LAR1“索引”,等)(全局和局域的)以及OB,FB及FC的TEMP(临时)变量(比如LAR1Address,等)P指向布尔型绝对地址En.m,An.m,Mn.m,Ln.m,DBXn.m,DIXn.m指针(比如LAR1PM5.3,LAR2PI3.6,等)指向本地、符号地址OBTEMP(临时)变量(比如LAR1PPar_Pointer,等FBIN-,OUT-,INOUT-,STAT-及TEMP-FCTEMP(临时)变量(LAR1PLoop,等),其它用于地址寄存器的指令,传送出地址寄存器内容TARn(n1or2)从Arn传送到ACCU1TARn从Arn传送到处理器寄存器AR2(比如TAR1AR2)32位绝对地址变量MDn,LDn,DBDn,DIDn(如TAR2MD5等)32位符号变量32位全局变量(比如TAR1“Index”,等)(全局和局域的)及OB,FB及FC的TEMP(临时)变量(比如TAR1Address等)地址寄存器内容交换(Swap)指令TAR将地址寄存器AR1和AR2的内容相互交换地址寄存器加指令ARn将ACCU1-L内容加到ARnARnPn.m将内部区域指针Pn.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,,,,----,,,,Number[1],Number[2],Number[9],Number[10],Number[11],1,2,9,10,11...,等等。,DB42,0,4,32,36,40,,字节地址,练习4.2用寄存器间接寻址进行循环编程,POINTER类型和ANY类型数据的块参数,,,地址声明名称类型0.0输入参数DB_NumWORD2.0输入参数Area_PointerDWORD6.0输入参数LengthWORD...LDB_NumTI_DB_NumOPNDB[I_DB_Num].LArea_PointerLAR1LLength...,FC...,分别传送实际地址的各个信息(STEP5里的方式)DB号起始地址区域长度,等。缺点程序员必须进行拆分在调用期间,不能使用实际地址的符号名一个地址(区域)需要好几个参数无一致性检查纠正,,地址声明.名称类型0.0输入Measure_1POINTER...8.0输入Measure_2ANY...LPMeasure_1LAR1LW[AR1,P0.0]TI_DB_NumOPNDB[I_DB_Num]LD[AR1,P2.0]LAR1....,FC...,使用POINTER或ANY类型参数传递(STEP7方式)调用时,程序员可以使用实际地址的符号名由LAD/FBD/STL编辑器拆分成单个信息一个地址只需要一个参数进行一致性检查纠正,POINTER类型的结构和参数赋值,,Byten,,,,,Byten2,Byten4,Byten1,Byten3,Byten5,DB号(INT),1OOO_ORRR_OOOO_OBBB(32位交叉区域指针),BBBB_BBBB_BBBB_BXXX,POINTER类型参数赋值指针显示PDBn.DBXx.y其中nDB号,x字节数,y位数PDIn.DIXx.y(比如PDB5.DBX3.4,PDI2.DIX10.0,等)PZx.y其中Z区域,比如P,I,Q,M及L(比如PI5.3,PM10.0,等)地址声明MD30(这种情况下,DB号区域标识符及位地址自动输入Motor_on到POINTER参数中)“Motor_1“.speed,数据类型结构POINTER,ANY数据类型的结构,ANY数据类型指针,Byten,,,,Byten2,Byten4,DB号,1OOO_ORRR_OOOO_OBBB,BBBB_BBBB_BBBB_BXXX,,,,1610,Datatype,复制系数,Byten6,Byten8,数据类型标识符VOID00BOOL01BYTE02CHAR03WORD04INT05DWORD06DINT07REAL08DATE09TOD0ATIME0BS5TIME0CDT0ESTRING13参数类型标识符BLOCK_FB17BLOCK_FC18BLOCK_DB19BLOCK_SDB1ACOUNTER1CTIMER1D,ANY参数类型指针,Byten,,,,Byten2,Byten4,160000,定时器,计数器或块的号,,,,1610,参数类型,160001,Byten6,Byten8,160000,ANY数据类型的参数赋值,指针显示P[数据块.]位地址类型号PDB10.DBX12.0REAL20指向DB10中的一个区域从Byte12开始的20个REAL类型的地址(ARRAY[1..20]OFREAL)PI10.0BOOL8指向IB10里的一个8位区域地址声明绝对地址DB5.DBD10数据类型DWORD,复制系数1DB号5,指针PDB5.DBX10.0IW32类型WORD,WF1,DB号0,指针PI32.0T35类型TIMER,编号35符号地址Motor_1.speed使用基本数据类型,编译器建立正确“Pump”.Start的数据类型,复制系数1以及指针注意事项符号(ARRAY、STRUCT、STRING、UDT)赋值时,数据类型标识符02(BYTE)以及区域字节长度只能由编译器来建立,并输入到ANY指针。,ANY类型间接参数分配,使用临时变量对ANY数据类型进行实际参数赋值在调用块中声明ANY数据类型临时变量例如tempaux_pointerANY用指针信息对ANY临时变量进行赋值例如LAR1Paux_pointer//装载辅助指针地址LB1610//装载标识符10TLB[AR1,P0.0]//并传送到Offset0L......使用变量辅助指针对ANY块参数进行赋值例如CALLFC111Targetfieldaux_pointer优点在运行期间,对ANY指针参数进行动态重复赋值,评估ANY型指针传递,,,,,地址声明名称类型初始值注释0.0inPar_PointerANYoutin_out0.0tempData_typeBYTE2.0tempWFWORD4.0tempDB_NrWORD6.0tempArea_PointerDWORD,,,,,,,,,,,,,,Network1创建数据类型、复制系数、DB号及区域指针LPPar_Pointer//将Pointer地址装载到ACCU1LAR1//并从ACCU1中将其装载到AR1;LB[AR1,P1.0]//从指针创建数据类型TData_type//并装载到临时变量中;LW[AR1,P2.0]//建立复制系数TWF//并装载到临时变量中;LW[AR1,P4.0]//建立DB号TDB_Nr//并装载到临时变量中;LD[AR1,P6.0]//建立区域指针TArea_Pointer//并装载到临时变量中;,,练习4.3用于求和及计算平均值的功能,,FC43,,EN,ENO,,,Measured_values,Sum,,Mean_value,,声明名称类型输入参数Measured_valuesANY输出参数SumREAL输出参数Mean_valueREAL,,DB43,103.45,2086.5,1.7895,....,....,PDB43.DBX0.0REAL8,,,名称类型STRUCTMeasurementARRAY[1..8]REALEND_STRUCT,,,,,,