PLC中指针及间接寻址的应用

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

S7-200cpu允许使用指针对下述存储区进行间接寻址:I, Q, V, M, S, T和C。但不能对独立的位或模拟量进行间接寻址。指针为双字值,用来存放另一个存储器的地址,只能用V, L或累加器AC1,AC2和AC3作指针。为了生成指针,必须用双字传送指令(MOVD)将某个位置的地址移入另一个位置或累加器作为指针。

MOVD &VB200,AC1

MOVW *AC1,AC0

对指令的操作数的指定方式,我将其理解为“寻址”。

在程序中绝大部分的指令都带有操作数,所谓的操作数,是执行这一指令时被这一指令加以操作、处理的数值。对指令的操作数的指令方式大致的总结一下,可以概括为如下几个类型:1:指令的操作数为“立即数”,(如:15、16#F、2#1111等、、、、、、)。

LD M0.0

MOVW +255, VW0

+I +45, VW0

这是一条加法指令,被加数为:255、加数为45执行这条指令后计算出来的“和”存放在VW0这一存储器内。

LD M0.0

MOVB 15, VB0

这是一条传指令,译为:将15传送至存储器VB0内。

2:指令的操作数没有直接的给出,而是给出它所在的地址。

LD M0.0

MOVW VW0, VW4

-I VW2, VW4

这是一条减法指令,译为:将存储器VW0内的数值减去存储器VW2内的数值,将“差”存放在存储器VW4内。

3:指令的操作数没有直接的给出,而是给出它所在的地址的“地址”,在S7-200中,将这种寻址方式称之为“指针寻址”。

下面,我们一起来学习一下关于指针的使用方法:

在使用指针进行间接寻址的过程中,会涉及到的两个符号:

&:建立指针(进行间接访问的区域)

*:读取指针(读取指针间接指定的地址)

下面是使用指针的一般步骤:

1:建立指针

建立指针需要使用双字传送指令,如下所示:

LD M0.0

MOVD &MB0, VD10

译为:在VD10建立指针,指针指向被间接访问的首地址MB0。

在建立指针时需要注意如下几个问题:

①可以进行间接访问的区域,包括如下几个区域:I、Q、M、S、V、T(当前值)、C(当前

值)。在S7-200中位状态是不能进行间接指定的,所以这里特别强调只是访问定时器及计数器的当前值,而不是其位状态。

②可以作为建立指针的区域,包括如下几个区域:V、L、及累加器AC1至AC3。且只能是双字(32bit)类型的地址。

③在建立指针时在存储器前加“&”这个符号的表示进行间接访问的区域的首地址,所以除定时器T及计数器C外都必须是以字节的形式出现的。

2:读取指针

在读取指针时,有如下几种不同的情况出现:

①以字节的形式读取指针:

LD M0.0

MOVD &MB0, VD10

MOVB *VD10, VB30

译为:在VD10建立指针,指针指向以MB0为首地址的地址,读取在指针VD10所指向的首地址开始的一个字节(即以MB0开始的一个字节,很明显就是MB0本身),所以,读取指针时将MB0放到VB30。

②以字的形式读取指针:

LD M0.0

MOVD &MB0, VD10

MOVW *VD10, MW20

译为:在VD10建立指针,指针指向以MB0为首的地址,读取在指针VD10所指向的首地址开始的一个字(即以MB0开始的一个字,很明显就是MW0),所以,读取指针时将MW0放到MW20。

③以双字的形式读取指针:

LD M0.0

MOVD &VB0, VD10

MOVD *VD10, VD40

译为:在VD10建立指针,指针指向以VB0为首的地址,读取在指针VD10所指向的首地址开始的一个双字(即以VB0开始的一个双字,很明显就是VD0),所以,读取指针时将VD0放到VD40。

3:修改指针

修改指针是在使用指针寻址中关健的一部分,修改指针是将指针指向的首地址进行适当的偏移,使之指向我们需要访问的地址,这样我们可以比较方便的使用在这一存储区的某一具体地址,使程序的灵活性有所增加。

修改指针的方法大致的可以概括为如下几种:

①使用加法或减法指令,对指针进行指定常数作为偏移量的修改指针。

②使用加“1”或减“1”指令,对指针进行1个单位(字节)的偏移。

下面将以实际情况为例来说明修改批指针的方法:

例1:

网络1:

LD M0.0

MOVD &VB0, VD10

MOVD *VD10, VD40

+D 4, VD10

网络2:

LD M0.1

MOVD *VD10, VD44

译为:在VD10建立指针,指针指向以VB0为首的地址,读取在指针VD10所指向的首地址开始的一个双字(即以VB0开始的一个双字,很明显就是VD0),所以,读取指针时将VD0放到VD40。然后对指针进行修改,对其指定4个单位的偏移量,即指针此时指向的首地址为VB4。

在下一网络中又以双字的形式读取指针。所以,此时读取指针是将以VB4为首的一个双字传送至VD44(即VD4传送至VD44)。

例2:

网络1:

LD M0.0

MOVD &VB0, VD10

MOVB *VD10, MB0

INCD VD10

网络2:

LD M0.1

MOVB *VD10, MB1

译为:在VD10建立指针,指针指向以VB0为首的地址,读取在指针VD10所指向的首地址开始的一个字节(即以VB0开始的一个字节,很明显就是VB0),所以,读取指针时将VB0放到MB0。然后对指针进行修改,对其进行一个单位(字节)的偏移,即指针此时指向的首地址为VB1。

在下一网络中又以字节的形式读取指针。所以,此时读取指针是将以VB1为首的一个字节传送至MB1(即VB1传送至MB1)。

在程序中,如果希望以连续的形式去间接访问地址(即:读取VB0后希望下一次读取的是VB1、读取VW0后希望下一次读取的是VW2、读取VD0后希望下一次读取的是VD4),修改指针时,需要注意以下问题:

①读取下一个字节:

网络1:

LD M0.0

MOVD &VB0, VD10

MOVB *VD10, VB100

+D 1, VD10

网络2:

LD M0.1

MOVB *VD10, VB100

第一次读指针时,读取的是VB0。

相关文档
最新文档