指令中给出的地址是存放数据的地址的地址称为间接寻址。间接寻址方式是,指令给出了存放操作数地址的存储单元的地址(也称地址指针),按照这一地址找到的存储单元中的数据才是所需要的操作数,相当于间接地取得数据。S7 - 200 PLC CPU以变量存储器(V)、局部存储器(L)或累加器(AC)的内容值为地址进行间接寻址。可间接寻址的存储器区域有:I、Q、V、M、S、T(仅当前值)和C(仅当前值)。对独立的位( BIT)值或模拟量值不能进行间接寻址。用间接寻址方式存取数据时遵循以下步骤:建立指针、使用指针来存取数据(间接存取)和修改指针。使用方法和C语言中的指针应用基本相同。
(1)建立指针。间接寻址前,应先建立指针。指针为双字长,是所要访问的存储单元的32位的物理地址。只能使用变量存储器(V)、局部存储器(L)或累加器(AC1、AC2、AC3)作为指针,AC0不能用做间接寻址的指针。为了建立指针,必须使用双字传送指令MOVD,将存储器区中某个位置的地址移入存储器的另一个位置或累加器作为指针,即将所要访问的存储器单元的地址装入用来作为指针的存储器单元或寄存器,装入的是地址而不是数据本身。下面这条指令创建了一个指向VB200的指针:
MOVD &VB200,AC1
“&”为地址符号,与单元组合表示所对应单元的32位物理地址,VB200只是一个直接地址编码,并不是它的物理地址。指令中的&-VB200如果改为&-VW200或&4VD200效果完全相同。
指令中的第二个地址数据长度必须是双字长,如AC、LD和VD。这里地址“VB200”要用32位表示,因而必须使用双字传送指令( MOVD)。
(2)间接存取。依据指针中的内容值作为地址存取数据。使用指针可存取字节、字、双字型的数据,下面两条指令是建立指针和间接存取的应用方法:
MOVD &VB200,AC1
MOVW *AC1,AC0
执行指令MOVW *AC1,AC0,把指针AC1中的内容值(VB200)作为地址,由于指令MOVW的标识符是“W”,因而指令操作数的数据长度应是字型,把地址VB200、VB201处2字节的内容(12 34)传送到AC0。指针处的值(即12 34),为字型数据,如图3-6所示,操作数(AC1)前面的“*”号表示该操作数( AC1)为指针。
创建和使用指针
图3-6 创建和使用指针
(3)修改指针。处理连续地址的存储单元中数据时,通过修改指针可以非常方便地存取数据。在S7 - 200 PLC中,指针的内容不会自动改变,可用自增或自减等指令修改指针值。这样就可连续地存取存储单元中的数据。指针中的内容为双字型数据,应使用双字指令来修改指针值。简单的数学运算指令,如加法指令“+D IN1,OUT”或自增指令“INCD OUT”可用于修改指针值。
图3-7中,用两次自增指令INCD AC1,将AC1指针中的值(VB200)修改为VB202后,指针即指向新地址VB202。执行指令MOVW* AC1,AC0,这样就可在变量存储器(V)中连续地存取数据,将VB202、VB203 2字节的数据(5678)传送到AC0。
修改指针
图3-7 修改指针
修改指针值时,应根据存取的数据长度来进行调整。若对字节进行存取,指针值加1(或。减1);若对字进行存取,或对定时器、计数器的当前值进行存取,指针值加2(或减2);若对双字进行存取,则指针值加4(或减4)。图3-7中,存取的数据长度是字型数据,因而指针值加2。
我来给你个通俗的解释吧
你住酒店的时候,如果有门牌号和钥匙,你可以直接住进那个房间。比如房间号是618房间,你可以直接去找这个房间,然后进去。这就是直接寻址。相当于把你存储在618这个寄存器里面了。
你也可以先上六楼服务台,她告诉你,从这儿走,第18个房间就是。这个18其实就是偏移地址。六楼服务台就是一个地址的寄存器。你是不能住进服务台的,也就是你不能存储在这个寄存器里面。但是你从这里可以拿到你的门牌号和钥匙,然后再根据门牌号(偏移地址)找到你真正的房间,那个才是存储你的寄存器。这就是间接寻址。
现在明白了吧。纯手打,给好评啊。