打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
【干货分享】S7-300PLC间接寻址介绍
在PLC寻址可以分为直接寻址间接寻址两部分,直接寻址是在程序中通过指令直接对地址进行访问,地址通常是一个常数,如定时器T0,地址为“0”。而间接寻址,地址存储与地址指针中,地址是一个变量,程序执行时才能确定实际的地址,如定时器T[MW0]。若MW0的值等于0,则表示为T0,若MW0的值等于1,则表示T1。

在S7-300中间接寻址可以分为以下几类:

1、 存储器间接寻址
1)16位指针寻址
2)32位指针内部区域寻址

2、 寄存器间接寻址
1)32位指针内部区域寻址
2)32位指针交叉区域寻址

接下来就分别介绍下这几种间接寻址的指针格式、访问时地址寻址格式以及每种间接寻址的使用方式。
存储器间接寻址
存储器于存储器的地址指针分为16位地址指针和32为地址指针,允许存储地址指针的存储器为位存储器(M)、局部变量存储器(L)和数据块(DB)。

16位指针寻址:
16位地址指针的应用主要针对的是定时器(T)、计数器(C)、程序块(OB、FB、FC、DB)的编号寻址,该类间接寻址方式在实际应用的过程中相对较少。

指针格式为:

该指针为一个16位的存储空间,根据该存储空间的值为多少,则表示对应的地址编号为多少。

地址寻址格式表示为:区域表示符 [16位地址指针],如DB [MW0],若MW0的值等于10,则表示的是DB块为DB10。

如下程序所示,描述的使用16位寄存器的寻址方式对定时器进行访问:

      L     10
      T     'MW10'     //把数字10装在到16位存储器中做作为指令
      A     'I0.0'        //取起动触点的常开信号状态
      L     s5t#10s
      SD  T [ 'MW10']     //使用16位存储器指针作为定时器的编号,定时器的设定时间为10s.
      A  T ['MW10']   
      =     'Q0.0'        //取定时器常开触点状态输出一个输出信号。

从例子中可以看出,地址指针存储与MW10中,使用中只需要对MW10中的数据进行修改,就可以实现访问不同编号的定时器。
32位指针内部区域寻址
32位指针用于I、Q、M、L数据块等存储器中的位、字节、字、双字的寻址,32指针寻址,指针需要使用一个双字的存储器空间进行存储。在这个存储器空间中的第0位到第2位对应的是位寻址的格式,第3位到第8位对应的是字节的寻址格式,第19位到第31位未作任何定义。

地址指针格式如下所示:

访问时地址寻址格式表示为:

地址标识符 访问宽度 [32位地址指针]  如:MB [LD20]
地址表示符:M,位存储器
访问宽带:B,以字节的方式进行访问

32位地址指针:LD20

在使用过程中,32位的指针也可以使用常数来进行表示,如P#4.1,其中,P表示指针, 字节地址为4,位号地址为1。

P#4.1的指针格式表示为:

根据表示格式,在使用常数时也可以不用使用P#这种表示符号,可以安装32位指针的格式直接进行表示。如此列中的P#4.1也可以用L#33表示。

L   P#4.1             等价与     L   L#33
T  MD 10                        T   MD10

32位指针的寻址方式在使用的过程中使用的相对比较多,比如要求从连续地址的几个数中找出最大值,并记录最大值的所在位置,则此时就需要是使用到存储器间接寻址中的32位指针的寻址方式。接下来我们就依次为例说明存储器间接寻址中的32位指针的使用方式。

在该列中除了会设计到指针的应用外还会涉及到跳转/循环等指令的使用,若不了解请自行查找相应的指令说明手册,这里面另做说明。如下例说是,表示从DB1.DBW0开始的连续的5个存储器中找出最大值,并记录那个地址的数据为最大值。

      A     I0.0
      FP    M5.0
      JCN   _001   //判断I0.0是否产生上升沿,若未产生上升沿跳转到标签_001处执行程序。
      L     0
      T     MW20(最大值)
      T     MD10(32位指针)
      T     MD30(最大值位置) //清零操作
      OPN   DB1    //打开DB1数据块
      L     5
NEXT: T     MW22(循环次数存储器)   //装载循环次数5次
      L     MW20   
      L     DBW [MD10](表示DB1.DBW0) //最大值与第一个数据比较
      >I
      JC    _002        //若比较成立跳转到标签_002段程序执行
      JCN   _003       //若比较不成立则跳转到标签_003段程序执行
_003: L    DBW [MD10]
      T     MW20      //若比较不成立,则进行数据交换,保证存储器存储的为最大值
      L     MD10
      T     MD30       //把该指针转存,该指针指向最大数的地址
_002: L     MD10
      L     P#2.0
      +D
      T     MD10    //比较完后,指针加P#2.0,表示指向第二个数。
      L     MW22    
      LOOP   NEXT   //循环次数减1,跳回NEXT标签处继续执行,直到此时等于时,结束循环。
      L     MD30
      L     P#2.0
      /D
      +     1
      T     MD30    //根据指针算出是第几个数为最大值。
_001: NOP 0
S7-300间接寻址中的寄存器间接寻址
(1)寄存器间接寻址概述

寄存器间接寻址是通过使用CPU内部集成的两个地址寄存器AR1和AR2存储地址指针来实现的寻址方式,使用时分为内部区域间接寻址和交叉区域寻址两种寻址方式。

AR1,AR2均为32位寄存器,寄存器间接寻址只使用32位指针。对地址寄存器AR操作的相关指令有:

指令
说明
LAR1
将累加器1中的内容装入地址寄存器1
LAR2
将累加器1中的内容装入地址寄存器2
TAR1
将地址寄存器1中的内容传送到累加器1
TAR2
将地址寄存器2中的内容传送到累加器1
+AR1
加累加器1至地址寄存器1
+AR2
加累加器1至地址寄存器2
LAR1 AR2
将地址寄存器2中的内容装入地址寄存器1
CAR
交换地址寄存器1和地址寄存器2的内容

(2)寄存器寻址——内部区域寄存器间接寻址

内部区域寄存器间接寻址指针用于I、Q、M、L和数据块等存储器中的位、字节、字及双字的寻址,与32位存储器的使用方式相同,不同之处在于指针存储的位置不同。内部区域寄存器地址指针格式如下所示:


第0位至第2位作为寻址操作的位地址,第3位至第18位作为寻址操作的字节地址,第19位至第30位没有定义,第31位为内部区域与交叉区域指针标识符,0:内部区域指针,1:外部区域指针。

内部寄存器间接寻址格式:地址存储器标识符 [地址寄存器,P#BYTE.BIT]。

如:MW [AR1,P#4.0]或DIX [AR2,P#0.0]

MW:表示访问的存储器及访问的长度,AR1:表示地址寄存器1,P#4.0为地址偏移量,

例如:

(3)寄存器寻址——交叉区域寄存器间接寻址

交叉区域寄存器寻址与内部区域寄存器寻址相比,地址指针中带有存储器标识符,如I、Q、M等,交叉区域地址指针格式如下:


第0位至第2位作为寻址操作的位地址,第3位至第18位作为寻址操作的字节地址,第24位至第26位为地址标识符,第31位为内部区域与交叉区域指针标识符,0:内部区域指针,1:外部区域指针。

地址标识符表示如下:

RRR

表示含义

举例

000

表示没有地址区

P#2.0

001

表示输入地址区I

P#I2.0

010

表示输出地址区Q

P#Q2.0

011

表示位存储区M

P#M2.0

100

表示数据块DB中的数据

P#DB1.DBX2.0

101

表示数据块DI中的数据

P#DI1.DIX2.0

110

表示区域地址区L

P#L2.0

111

表示调用程序块的区域地址V

P#V2.0

交叉区域寄存器寻址格式为:访问宽度 [地址寄存器,P#BYTE.BIT]。指针指向地址等于地址寄存器地址+地址偏移常量。

例如:


在S7-300中除了提供16位和32位存储器地址指针和32位寄存器地址指针外,在程序的FC和FB的接口参数中,还提供了48位(pointer数据类型)和80位(ANY数据类型)的地址指针。16位和32位地址指针可以直接装在到存储器或地址寄存器中,从而可以在程序块中使用间接寻址。“pointer”和“ANY”指针由于大于32位而不能装在到存储器或是寄存器中,所以不能在程序块中直接使用,必须进行拆分使用,这两种指针专用于功能(FC)和功能块(FB)接口参数的传递。如调用函数赋值形参时,都实参的完全寻址。
Pointer数据类型指针
使用参数类型pointer(指针),可以在调用块时,将变量的地址作为实参传送给声明的形参。Pointer可以直接指向一个数据块中的变量,例如P#DB1.DBX 4.0。使用是注意,pointer只能用于形参中的IN、OUT(不能用于FB)、IN_OUT变量。

Pointer占6个字节,格式如下所示:

字节0和字节1的数值用来存放数据块中的编号。如果指针不是用于数据块,DB块编号为0。

字节2为数据区,pointer指针可以指向的数据区,如下所示:

十六进制代码

数据区

描述

16#81

I

过程映像输入区

16#82

Q

过程映像输出区

16#83

M

位存储器

16#84

DB

全局数据块

16#85

DI

背景数据块

16#86

L

区域数据区

16#87

V

上一级赋值的区域数据

字节3到字节5的表示方式与前面说介绍的寄存器间接寻址的格式一样。

在调用FB或是FC时,对于pointer指针类型的形参进行赋值时,可以选择指针访问形式赋值,也可以选择地址声明或符号名。

如:指针显示方式:P#DB1.DBX0.0 ,P#M10.0
地址声明或符号名方式:DB1.DBX0.0 ,M10.0

在被调用的FB或是FC时,需要对pointer指针数据类型进行拆分,以便读出实参的地址。假设编写一个对MD10开始的五个实数取平均值的功能块程序。

添加 FC1,在FC1中编写程序块:

数据接口

名称

数据类型

地址

IN

In_Data

Pointer


NO

INT


OUT

OUT

REAL


TEMP

BLOCK_NO

INT

0.0

NO_TEMP

INT

2.0

ADD_TEMP

REAL

4.0

FC 程序如下所示:

L     0
T     #ADD_TEMP           //对存储器运算结果的存储器清零
L     P##In_Data
LAR1                         //装在存储地址的首地址到地址寄存器AR1中
L     0
L     W [AR1,P#0.0]            //判断给的地址是否是DB块
==I   
JC    _001                   //如果不是DB块,则跳转到标签_001处执行
T     #BLOCK_NO         //若为DB块,这把DB块的编号存储到临时变量中

OPN   DB [#BLOCK_NO]             // 打开对应编号的DB块
_001: L     D [AR1,P#2.0]     //找出需要计算数据区的开始地址,pointer的后四字节表示的是数据的地址
LAR1  
L     0
L     #NO
==I   
JC    _002                 /判断需要相加的数据的个数,如果个数为0,结束程序
NEXT: T     #NO_TEMP     //装载需要计算相加的数的个数到临时变量中
L     D [AR1,P#0.0]
L     #ADD_TEMP
+R    
T     #ADD_TEMP      //把第一个数据与存储结果的存储器相加,得到的结果放回

+AR1  P#4.0              //指针下移4个字节,指向第二个参与运算的数据
L     #NO_TEMP
LOOP  NEXT            //循环次数减1,在返回到NXET标签处继续执行
L     #ADD_TEMP
L     #NO
DTR   
/R    
T     #OUT_VAl            //计算平均值
_002: NOP   0

OB1中的程序:

ANY数据类型指针
在调用逻辑块时,参数数据类型ANY用于将任意的数据类型传递给声明的形参,ANY可用于实参的数据类型未知,或实参可以使用任意数据类型的情况,数据类型ANY主要用于为系统功能(SFC)和系统功能块(SFB)分配参数。用户也可以用于ANY作为逻辑块的接口参数来传递数据。

ANY由10个字节组成,格式如下所示:

第一个字节表示的是数据类型的编码,数据类型编码如下表所示:

第四个字节到第九个字节与pointer第零个到第五个字节的含义相同。
与Pointer指针相比,ANY指针可用来表示一片连续的数据区,例如P#DB2.DBX0.0 BYTE 10,表示的是从DB2.DBB0开始的连续的10个字节。在本例中重复因子(数据长度)为10。调用FB、FC时,对ANY指针数据类型形参进行赋值时,可以选择指针显示方式直接赋值,如P#DB2.DBX0.0 BYTE 10。也可以选择使用地址声明或符号名的方式进行赋值,例如DB2.DBB0,使用地址声明或是符号名时只能指向一个变量。

ANY指针使用举例:

编写一段功能块程序,控制要求为对连续一段字做异或运算,不是字则不进行运算。

编写FC程序:

(1)定义变量类型:

变量名称

变量类型

数据类型

注释

Anypoint

In

Any

Any指针

Result

OUT

Word

运算结果

Lenth

TEMP

INT

字的个数

DB_No

TEMP

INT

数据块编号

(2)程序:

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
寻址方式详解 朋友圈疯转!
西门子PLC学习笔记六-(Step7指令简介)
S7-200SMART系列PLC的间接寻址功能
80C51单片机存储器系统及操作方式
WS51F0030 系列物联网 MCU的架构和产品信息
寄存器间接寻址
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服