1、使用存储器间接寻址,要寻址的变量的地址位于一个地址(存储单元)中。
使用存储器间接寻址的程序语句包含如下部分:
• 指令(比如:OPN, A, L, 等等。)
• 地址标识符(DB,C , T , I , QW , MD , 等等。)
• 以及一个[变量],该变量必须要用方括号括起来。
这个变量包含指令要访问的操作数地址(指针) 。
根据所使用的地址标识符,指令将以这种特定的[变量]格式,将所存储的数据看做成字指针或者双字指针。
带有16位指针的指令
可以使用16位指针来寻址定时器、计数器、或块(DB、FC、FB)。
所有的定时器和计数器指令都可以用间
2、接寻址访问。为了对定时器,计数器,或块寻址,需使用如T、C、DB、DI、FB、FC这些区域标识符。寻址的操作数的地址存储在一个字中。
一个数据块既可以用DB寄存器打开,也可以用DI寄存器打开。当间接打开数据块时(DB/DI),如发现指针内容为零,则DB/DI 寄存器也以值“0”装入,装入0值时不会触发错误。
逻辑块调用可以借助于UC或CC指令(而非CALL)直接进行寻址,但是这些块不能包含任何块参数或静态变量。
这种字指针被看作一个整数(0 ... 65 535),它指的是定时器(T)、计数器(C)、数据块(DB,DI)或逻辑块(FC,FB)的号。
直接寻址 使用
3、直接寻址,存储单元地址可以直接包含在指令中,也就是说,地址标识符指明了指令所要处理数值的地址。
符号寻址 在控制程序中,可以进行绝对地址寻址(比如:I 1.0)或进行符号地址寻址(
比如“开始信号”)。符号地址是使用名称来代替绝对地址。
使用有意义的名称使程序的可读性增强。不过,在使用符号寻址时,要注意区分局部符号(在块的声明部分)和全局符号(符号表)。
间接寻址 使用间接寻址,可以寻址那些只有在程序运行时才确定其地址的地址标识符。
4、 例如,通过间接寻址,可以对程序的一些部分进行反复扫描(循环编程),由此,每次扫描所用到的地址被赋予不同的地址数值。
关于间接寻址,要注意区分以下两种情况:
• 存储器间接寻址: 寻址的地址指针位于用户储存器存储单元里(比 如MD30)。
使用存储器间接寻址,也可以为位于保存寻址地址标识符指针的存储器中的变量赋予符号化名称。
• 寄存器间接寻址:在访问之前,要将指向寻址地址的指针装载到其中一 个S7处理器地址寄存器(AR1或AR2)中去。
警告 用于使用间接寻址时,只有在程序运行期间才
5、计算地址,所以,就会有这样的潜在的危险性,即存储器被意外覆盖,进而导致PLC的意外动作。
将DB寄存器内容装载到ACCU1中
§ L DBNO (将打开的DB号装载到ACCU1中)
§ L DINO (将打开的DI号装载到ACCU1中)
装载数据块长度
§ L DBLG (将打开的DB的长度/字节装载到ACCU1中)
§ L DILG (将打开的DI的长度/字节装载到ACCU1中)
l L DBLG,L DILG:这些指令的功能是以字节为单位读出当前所打开的数据块的 数据长度,。通过这种数据长度信息,用户程序就可以在访问数据块DB之前,测试数据块的长度
6、是否达到所要求的长度。
l L DBNO,L DINO:这些指令的功能是读出当前打开的数据块号。
用于存储16位和32位指针的地址区域:
l 位(Bit)存储区(绝对寻址或符号寻址)
例如: OPN DB[MW30],OPN DI[“Motor_1”] 等。
A I[MD30],T QD["Speed_1"],等)
l 本地数据堆栈(绝对寻址或符号寻址,
例如: OPN DB[LW10],OPN DI[#DB_NO]等。
A I[LD10],T QD[#Par_Pointer],等。)
l 全局(共享) 数据块(只能进行绝对寻址,DB必
7、须预先打开,
例如: OPN DB[DBW0] (覆盖掉DB寄存器内容!!!),OPN DI[DBW22]等。
A I[DBD10],T QD[DBD22],等。)
l 背景数据块(只能进行绝对寻址,DI必须预先打开,
例如: OPN DB[DIW20],OPN DI[DIW0] (覆盖掉DI寄存器内容!!!),等。
A I[DID10], T QD[DID22]等。)
向FB和FC传递指针的特点
l 在参数里传递的指针不能直接用于存储器间接寻址。
l 用于存储器间接寻址而传递的指针,在访问之前必须拷贝到临时变量里去
指针地址区 使用存储器间接寻址时
8、地址(存储单元位置)位于16位或32位地址中。
该地址可在下面某个区域中找到:
• 位存储器:作为绝对寻址操作数或作为变量通过符号表符号寻址。
• 本地数据堆栈:作为绝对寻址操作数或块的声明部分声明的临时变量。
• 全局(共享)数据块:作为绝对寻址操作数。当全局(共享)数据块DB 用作指针存储单元的时候,必须要考虑到:在进行访问之前,“合适的”数据块已经使用DB寄存器(比如:OPN DB)打开了。
• 背景数据块:作为绝对寻址操作数。 在使用背景数据的时候,要遵循如 下几点:
组织块和功能:在功能或组织块里,存储在背景数据块中的指针可以如 同存储在全局(共享)数据块中一样使用。只需记住的是,这里使用的 是DI寄存器而非DB寄存器。
功能块FB:通常在功能块中,背景数据,也即参数或静态变量,不能用 于符号性的存储器间接寻址。
原则上,可以使用在声明段中所输入的“地址”,来对FB内部的本地数据 进行绝对访问。但是,如果该FB用作多重背景模型,必须要注意,该地 址不是在背景DB中所指定的绝对地址,实际上是相对于AR2的地址。
注意事项 当您将存储器间接寻址指针传递到块中,或者想要在静态变量中永久保存该值,就必须要将该指针值从该静态变量中拷贝到临时变量中,然后使用这个临时变量来完成访问。
.