首页 理论教育 存储器间接寻址的仿真实验

存储器间接寻址的仿真实验

时间:2023-06-26 理论教育 版权反馈
【摘要】:立即寻址和直接寻址用得最多,间接寻址中用得最多的是存储器间接寻址。值得注意的是间接寻址可能会使某些地址被同时重复使用,从而导致PLC的意外动作。启动PLCSIM,将随书光盘中的例程“存储器间接寻址”下载到PLC,将PLC切换到RUN-P模式。图3-68是一个定时器的存储器间接寻址的例子。图3-69 存储器间接寻址的双字指针格式图3-70是例程“存储器间接寻址”的监控画面。

存储器间接寻址的仿真实验

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

1.立即寻址

S7-300/400有三种寻址方式:立即寻址、直接寻址和间接寻址(见图3-67)。立即寻址和直接寻址用得最多,间接寻址中用得最多的是存储器间接寻址。

978-7-111-53804-2-Chapter03-101.jpg

图3-67 寻址方式

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

978-7-111-53804-2-Chapter03-102.jpg

2.直接寻址

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

978-7-111-53804-2-Chapter03-103.jpg

3.存储器间接寻址

在存储器间接寻址指令中,要寻址的变量的地址称为指针,它存放在方括号表示的一个地址(存储单元)中。

例如在指令“A M[LD20]”中,方括号表示间接寻址。如果LD20中的指针值为P#5.2,M[LD20]对应的地址为M5.2。

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

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

间接寻址的优点是可以在程序运行期间,通过改变指针的值,动态地修改指令中操作数的地址。某发电机在计划发电时每个小时有一个有功功率给定值,从0时开始,这些给定值被依次存放在连续的24个字中。可以根据读取的PLC的实时时钟的小时值,用间接寻址读取出当时的功率给定值。

用循环程序来累加一片连续的地址区中的数值时,每次循环累加一个数值。累加后修改地址指针值,使指针指向下一个地址,为下一次循环的累加运算做好准备。没有间接寻址,就不能编写查表程序和循环程序。

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

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

定时器、计数器、DB、FB和FC的编号范围(即地址)小于65535,因此它们使用16位的指针。(www.xing528.com)

启动PLCSIM,将随书光盘中的例程“存储器间接寻址”下载到PLC,将PLC切换到RUN-P模式。

图3-68是一个定时器的存储器间接寻址的例子。用16位的MW8存放地址指针。MW8中的指针值为3,T[MW8]相当于T3。用PLCSIM监控T3,令T3的启动信号I0.2为1状态,可以看到T3的剩余时间值开始变化,说明间接寻址的地址“T[MW8]”的确是T3。将程序中第一条指令“L 3”中的常数值(即地址指针的值)改为5,下载后重复上述的实验,可以观察到“T[MW8]”对应的地址变成了T5。

978-7-111-53804-2-Chapter03-104.jpg

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

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

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

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

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

978-7-111-53804-2-Chapter03-105.jpg

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

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

978-7-111-53804-2-Chapter03-106.jpg

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

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

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

在PLCSIM中用十六进制格式监控QB4,给QB4赋值。执行间接寻址指令“L QB[DBD10]后,可以看到累加器中出现对应的值,证明了QB[DBD10]就是QB4。

用PLCSIM监控MB4和QB5,改变M4.3的状态,可以看到Q5.0的状态随之而变。证明了M[LD20]就是M4.3。

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

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

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

我要反馈