首页 理论教育 寻址方式与间接寻址详解

寻址方式与间接寻址详解

时间:2023-06-27 理论教育 版权反馈
【摘要】:操作数是指令操作或运算的对象,寻址方式是指令取得操作数的方式,操作数可以直接给出或者间接给出。间接寻址中用得最多的是存储器间接寻址。例如在指令“A M[LD20]”中,方括号表示间接寻址。用PLCSIM监控T3,令T3的启动信号I0.2为1状态,可以看到T3的剩余时间值开始变化,说明间接寻址的T[MW8]的确是T3。如果使用完整的数据格式进行间接寻址,该指令变为红色,表示有格式错误。

寻址方式与间接寻址详解

操作数是指令操作或运算的对象,寻址方式是指令取得操作数的方式,操作数可以直接给出或者间接给出。

1.立即寻址

S7-300/400有三种寻址方式:立即寻址、直接寻址和间接寻址(见图3-79)。间接寻址主要用于需要在程序中修改地址的场合。间接寻址中用得最多的是存储器间接寻址。

立即寻址的操作数直接在指令中,下面是使用立即寻址的装载指令的例子:

978-7-111-54209-4-Chapter03-146.jpg

978-7-111-54209-4-Chapter03-147.jpg

2.直接寻址

直接寻址在指令中直接给出存储器或寄存器的地址,地址包括区域、长度和位置信息,下面是使用直接寻址的指令的例子:

978-7-111-54209-4-Chapter03-148.jpg

图3-79 寻址方式

978-7-111-54209-4-Chapter03-149.jpg

3.存储器间接寻址

在存储器间接寻址指令中,要寻址的变量的地址称为指针,它存放在方括号表示的一个地址(存储单元)中。例如在指令“A M[LD20]”中,方括号表示间接寻址。如果LD20中的指针值为P#5.2,M[LD20]对应的地址为M5.2。

地址指针就像收音机调台的指针,改变指针的位置,指针指向不同的电台。改变地址指针值,指针“指向”不同的地址。

旅客入住酒店时,在前台办完入住手续,酒店就会给旅客一张房卡,房卡上面有房间号,旅客根据房间号使用酒店的房间。修改房卡中的房间号,旅客用同一张房卡就可以入住不同的房间。这里房间相当于存储单元,房间号就是地址指针值,房卡就是存放指针的存储单元。

间接寻址的优点是可以在程序运行期间,通过改变指针的值,动态地修改指令中操作数的地址。用循环程序来累加一片连续的地址区中的数值时,每次循环累加一个数值。累加后修改地址指针值,使指针指向下一个地址,为下一次循环的累加运算做好准备。没有间接寻址,就不能编写查表程序和循环程序。

值得注意的是间接寻址可能会使某些地址被同时重复使用,从而导致PLC的意外动作。

(1)16位指针的间接寻址

定时器、计数器、DB、FB和FC的编号范围小于65535,因此它们使用16位的指针。

图3-80给出了定时器的存储器间接寻址的例子(见随书光盘中的例程“存储器间接寻址”),用16位的MW8存放地址指针。MW8中的指针值为3,T[MW8]相当于T3。用PLCSIM监控T3,令T3的启动信号I0.2为1状态,可以看到T3的剩余时间值开始变化,说明间接寻址的T[MW8]的确是T3。改变MW8的值,可以改用其他定时器定时。

978-7-111-54209-4-Chapter03-150.jpg(www.xing528.com)

图3-80 定时器的间接寻址

运行时启动程序状态监控,用鼠标右键单击STANDARD(累加器1),执行出现的快捷菜单中的命令“显示”→“间接”,添加“INDIRECT”(间接)列,可以看到MW8中间接寻址的地址指针值为3。

(2)32位指针的存储器间接寻址

S7-300/400可以对I、Q、M、DB等地址区的位、字节、字和双字进行间接寻址,地址指针包含了地址中的字节和位的信息。这些地址区的间接寻址使用双字指针,指针格式如图3-81所示。第0~2位为被寻址地址中位的编号(0~7),第3~18位为被寻址地址的字节编号(0~65535)。32位指针的数值实际上是以位(bit)为单位的双字。

978-7-111-54209-4-Chapter03-151.jpg

图3-81 存储器间接寻址的双字指针格式

978-7-111-54209-4-Chapter03-152.jpg

图3-82 间接寻址的程序状态

如果要用双字格式的指针访问一个字节、字或双字存储器,必须保证指针的位编号为0,例如P#20.0。否则程序将会出错。只有MD、LD、DBD和DID能存储32位地址指针。

图3-82中“INDIRECT”(间接)列的监控值4.0是DBD10中的指针值P#4.0的简写,该行指令的地址QB[DBD10]为QB4。因为QB是字节地址,P#4.0的小数点后面的位编号必须为0。累加器1(STANDARD)的数据显示格式为十六进制,其中的20实际上是16#20。

P#4.0的值为2#00000000000000000000000000100000(16#20)。

P#4.3的值为2#00000000000000000000000000100011(16#23)。

用共享数据块中的字或双字存放指针值时,首先应打开该数据块。例如上例中用OPN指令打开了DB1,QB[DBD10]中的DBD10实际上是DB1.DBD10。

使用32位指针对数据块内的地址寻址时,首先必须用OPN指令打开要寻址的数据块,然后才能寻址,例如DBW[MD10]。如果使用完整的数据格式(例如DB2.DBW[LD20])进行间接寻址,该指令变为红色,表示有格式错误。改为指令“OPN DB2”和“L DBW[LD20]”就可以了。

【例3-5】某表格用MW60开始的20个字存放数据,表格的偏移量(表格中字的序号)在MD40中。第1个字MW60的序号为0,第2个字MW62的序号为1……在I0.0的上升沿,用间接寻址将表格中相对于偏移量的字的数值传送到MW110中去。

下面是满足要求的语句表程序(见随书光盘中的例程“存储器间接寻址”),LD28中是存储器间接寻址的地址指针值,它实际上是以位为单位的整数。相邻的一个字相差两个字节或16位,因此偏移量乘以指针常数P#2.0或乘以L#16,加上表格的起始地址指针值P# 60.0,便得到要读取的字的地址。

978-7-111-54209-4-Chapter03-153.jpg

用仿真软件调试程序时,用变量表设置MW60开始的数据区各个字的数值(见图3-83),设置MD40的值为L#2,表示要读取数据区中编号为2的字MW64。在I0.0的上升沿之后,可以看到MW110中读取的数据与MW64中的相同。改变MD40中字的序号,可以读取别的字的值。

978-7-111-54209-4-Chapter03-154.jpg

图3-83 变量表

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈