与存储器间接寻址不同,寄存器间接寻址使用CPU内部集成的两个32位地址寄存器AR1、AR2存储地址指针。使用地址寄存器指令可以对AR1、AR2地址寄存器进行操作,指令如下所示:
寄存器间接寻址分为32位内部区域指针和32位交叉区域指针。
1.32位内部区域指针
32位内部区域指针用于I、Q、M、L数据块等存储器中位、字节、字及双字的寻址,与32位存储器指针的使用相同,不同之处在于指针存储的位置不同。32位内部区域地址指针的格式如下:
第0位~第2位作为寻址操作的位地址,第3位~第18位作为寻址操作的字节地址,第19位~第30位没有定义,第31位为内部区域与交叉区域指针标识,0表示内部区域指针,1表示交叉区域指针。
32位内部区域指针地址寻址表示格式为:地址存储器标识符[地址寄存器,地址偏移常量],例如装载M存储器一个字节表示为:
指针指向地址=地址寄存器存储地址+地址偏移常量,如果AR1装载的地址为P#8.0,实际装载的地址为MB18。32位内部区域指针的使用方法参考下面的示例程序:
2.32位交叉区域指针
32位交叉区域指针与32位内部指针相比,地址指针中带有存储区域标识符,如I、Q、M等,32位交叉区域地址指针的格式如下:
第0位~第2位作为寻址操作的位地址,第3位~第18位作为寻址操作的字节地址,第24位~第26位为地址标识符,表示的地址区域如下:
000表示没有地址区,例如P#12.0;
001表示输入地址区I,例如P#I12.0;
010表示输出地址区Q,例如P#Q12.0;
011表示标志位地址区M,例如P#M12.0;
100表示数据块(DB)中的数据,例如P#DB1.DBX12.0;
101表示数据块(DI)中的数据,例如P#DI1.DIX12.0;
110表示区域地址区L,例如P#L12.0;
111表示调用程序块的区域地址区V,例如P#V12.0。
第31位为内部区域与交叉区域指针标识,0表示内部区域指针,1表示交叉区域指针。使用交叉区域指针的表示方法(例如装载M存储器一个字节)为:
(www.xing528.com)
指针指向地址=地址寄存器存储地址+地址偏移常量,上例中实际装载的地址为MB30。如果访问一个位信号,则没有访问宽度。32位交叉区域指针的使用方法参考下面的示例程序:
3.地址寄存器AR1、AR2的监控
存储于存储器的地址指针可以直接通过变量监控表监控,存储于AR1、AR2中的地址指针则需要使用STL程序“Monitor”进行监控,监控之前必须在程序块中的菜单进行设置,点击菜单“Options”→“Customize”→“STL”界面中,选择“Address Register1”和“Address Register2”选项,在程序监控中可以显示AR1、AR2的内容,如图8-2所示。
图8-2 监控AR1、AR2
4.地址寄存器AR1、AR2的限制
存储区间接寻址和寄存器间接寻址具有相同的功能,在一些特殊条件下,使用地址寄存器AR1、AR2会有下列的限制:
1)在形参的传递中,STEP7使用地址寄存器AR1访问函数(FC)接口及函数块(FB)“INOUT”接口中定义的复合类型参数,如ARRAY、STRUCT、DATE_AND_TIME等,AR1和DB寄存器中的内容将被覆盖,例如在FC1中“IN”接口中定义一个数组变量,在OB1中调用,使用OB1的L区域数据进行赋值,调用关系如图8-3所示。
如果在FC1中访问数组变量的元素,如ARR_TEST[1],地址寄存器AR1及DB寄存器会发生变化,示例程序如图8-4所示。
图8-3 调用关系
图8-4 访问FC中复合数据类型数据
图8-4示例程序中前两条语句中打开DB1,并将P#20.0装载到AR1中,在第三条语句访问数组的一个元素后,AR1存储的地址指针变为P#V20.0(指向OB1中实参ARR_TEST的地址,参考图8-3),DB寄存器中存储的值为0,程序下传到CPU后将出现故障报警。将程序的执行次序进行修改,CPU即可运行,修改后的程序如下:
执行次序修改后可能会造成不必要的错误,访问复合变量时建议使用存储区间接寻址。访问FC、FB区域变量L,不会覆盖AR1、DB寄存器。
2)AR2和DI寄存器分别包含FB背景数据块的块号及在背景数据中偏移地址(多重背景数据块),在FB中,使用AR2和DI寄存器将会覆盖系统存储的内容。如果必须在FB中使用AR2和DI寄存器,建议使用下面的方法处理AR2和DI寄存器,首先保存AR2和DI寄存器中的数据,程序如下:
然后编写用户程序,可以对AR2和DI寄存器进行操作,但是在程序中不能访问FB参数或静态变量。使用完成后恢复AR2和DI寄存器的系统值,程序如下:
3)P#<地址>可以直接指向布尔型变量,例如P#M20.0、P#DBX12.0等,也可以指向程序块中接口参数区、区域数据区L及静态变量,例如P##PARA(参数)指向PARA参数的开始地址。将指向函数FC的IN、OUT、INOUT类型参数的指针装载到地址寄存器中不可以直接操作,例如:
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。