找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4957|回复: 0
收起左侧

S7-300和S7-400寻址

[复制链接]
ID:106101 发表于 2016-2-22 22:13 | 显示全部楼层 |阅读模式
Addressing for S7-300 and S7-400
Single - FAQ                                                           Edition (2010-9)


摘    本文对S7-300, S7-400 PLC编程过程中,所涉及的寻址方式方法,做了简单介绍及简单示例。
关键词  STEP7, 编程,寻址,间接寻址,S7-300, S7-400
Key Words  STEP7, Programming, Addressing, Indirection addressing, S7-300,S7-400

S7-300S7-400寻址
1.S7-300/400系统存储区域                  
2. S7-300/400 PLC寻址方式                 
      2.1直接寻址      
            2.1.1绝对地址:         
            2.1.2符号寻址:                  
      2.2间接寻址                       
            2.2.1存储器间接寻址                    
            2.2.2寄存器间接寻址               
            2.2.3 FB/FC的指针参数传递            

1 S7-300/400系统存储区域
S7 CPU的系统存储区域分为下表中列出的地址区域。在程序中可以根据相应的地址直接读取数据。
地址区域
可以访问的地址单位
S7符号
(IEC)
描述
过程映像输入表
输入(位)
I
循环扫描周期开始时,CPU从输入模板读输入值并记录到该区域
输入(字节)
IB
输入(字)
IW
输入(双字)
ID
过程映像输出表
输出(位)
Q
在循环扫描周期中,程序计算输出值并记录到该区域。循环扫描周期结束时,CPU将计算结果写入相应的输出模板
输出(字节)
QB
输出(字)
QW
输出(双字)
QD
位存储器
存储器(位)
M
该区域用于存储程序的中间计算结果
存储器(字节)
MB
存储器(字)
MW
存储器(双字)
MD
定时器
定时器 (T)
T
该区域提供定时器的存储
计数器
计数器 (C)
C
该区域提供计数器的存储
数据块
数据块,用"OPN DB"打开
DB
数据块中包含了程序的信息。可以定义为所有逻辑块共享 (shared DBs) 或指定给一个特定的 FB或 SFB 做背景数据块(instance DB)。
数据位
DBX
数据字节
DBB
数据字
DBW
数据双字
DBD
数据块,用"OPN DI"打开
DI
数据位
DIX
数据字节
DIB
数据字
DIW
数据双字
DID
局部数据
局部数据位
L
该区域包含块执行时该块的临时数据。L堆栈还提供用于传递块参数及记录梯形逻辑网络中间结果的存储器
局部数据字节
LB
局部数据字
LW
局部数据双字
LD
外设地址 (I/O)
外设输入字节
PIB
主站及分布式从站(DP)外设输入输出区域允许直接存取
输入
外设输入字
PIW
外设输入双字
PID
外设地址 (I/O)
外设输出字节
PQB
输出
外设输出字
PQW
外设输出双字
PQD

2S7-300/400 PLC寻址方式
2.1直接寻址
在STEP7程序中可以使用输入输出信号(I/O),位存储区(M),计数器(C),计时器(T),数据块(DB)以及功能块(FB)等地址。你可以直接访问这些绝对地址,但是如果给绝对地址以符号(助记符)程序将更易读懂(例如Motor_A_On, 或者根据你的公司或者工程中的代码使用别的标识符),而一个你的用户程序中的地址也就可以用一个符号来访问。
2.1.1绝对地址:
绝对地址由一个地址标识符和存储器位置组成。
例如I 0.0,Q 1.7,PIW 256,PQW 512,MD 20,T 15,C 16,DB1.DBB 10,L1 0.0等。
2.1.2符号寻址:
如果给绝对地址分配符号可使程序易读而简化故障查找。
STEP7能自动翻译符号名为要求的绝对地址。如果你准备用符号名访问 数组,结构,数据块,局部变量,逻辑块及用户自定义数据类型,那么你必须在此之前先分配符号名给绝对地址。
例如, 你可以分配符号名’Motor_On’给地址Q 4.0,然后在程序语句中使用符名’Motor_On’作为地址。
如需在程序中显示DB里所定义的符号,可以给该DB块定义一个符号。不能在符号表给DB块中某地址单独定义符号。
2.2间接寻址
间接寻址分为存储器间接寻址和寄存器间接寻址,间接寻址的指针分为16位指针和32位指针,而32位指针又分为内部区域寻址与交叉区域寻址。
2.2.1存储器间接寻址
16位指针:16位地址指针用于定时器、计数器、程序块(DB、FC、FB)的寻址,16位指针被看作一个无符号整数(0~65535),它表示定时器(T)、计数器(C)、数据块(DB、DI)或程序块(FB、FC)的号,16位指针的格式如下:
图1

寻址格式表示为:   区域标识符 [ 16位地址指针 ]
例如使一个计数器向上计数表示为:
CU         C [ MW ]
上述指令中,’C’为区域标识符,而’MW20’为一个16位指针。

16位指针存储器间接寻址举例:

//用于定时器
L    1
T    MW0                    //将1传送到MW0
A    I0.0               //如果I0.0 = True
L    S5T#10S
SD T[MW0]         //T1开始计时
//            上述指令可等同于:
A    I0.0
L    S5T#10S
SD T1

//用于打开DB块
L    20
T    LW20
OPN       DB[LW20]            //打开DB20

//程序调用
L     2
T    LW20
UC  FC[LW20]            //调用FC2

L     41
T    DBW30
UC        FB[DBW30]          //调用FB41

32位指针:32位地址指针用于I、Q、M、L、数据块等存储器中位、字节、字及双字的寻址,32位的地址指针可以使用一个双字表示,第0位~第2位作为寻址操作的位地址,第3位~第18位作为寻址操作的字节地址,第19位~第31位没有定义,32位指针的格式如下:

图 2

存储器32指针仅用于内部区域寻址。
寻址格式表示为:   地址存储器标识符  [ 32位地址指针 ]

例如写入一个M的双字表示为:
T     MD [ LD0 ]
‘MD’为区域标识符及访问宽度,而LD0为一个32位指针。

32位内部区域指针可用常数表示, 表示为P# 字节. 。如常数
       P#   10.3
为指向第10个字节第3位的指针常数。
若把一个32位整型转换为字节指针常数,从上述指针格式可以看出,应要把该数左移3位(或是乘8)即可。
如:       L     L#100           //Accu0装入32位整形100
SLD       3                   //左移3位
T     LD0               //LD0得到P#100.0指针常数

32位存储器间接寻址举例:

//DB块间接寻址举例
OPN       DB  1            //打开DB1。
OPN       DI    3            //打开DB3,最多可以同时打开两个DB块。
L     4                   //装载4到累加器1中。
SLD       3                   //累加器1中数值左移3位。
T     MD  20          //将逻辑操作结果传送到MD20中,MD20                     
                                               //包含地址指针为P#4.0。
L     P#20.0                 //将地址指针P#20.0装载到MD24中。
T     MD    24
L     320               //320转换指针为P#40.0并装载到MD28中。
T        MD      28
L        DBW     [MD 20]                //装载DB1.DBW4。
L        DBW     [MD 24]                //装载DB1.DBW20。
+I                                      //相加
L        DIW       [MD 28]                //装载DB3.DBW40。
-I                                  //相减。
T        DIW    2                     //将运算结果传送到DB3.DBW2中。
JZ       m1

//M存储器连续区域操作
L        0                            //初始化MW100和MD4。
T        MW      100
T        MD            4
OPN   DB     1                //打开DB1。
L    100                           //循环操作的次数,100次。
NEXT:    T        MW      100 //将循环100次装载到MW100中,固定格式。                           L            MW       2            //进行比较的数值存储于MW2。
L     DBW     [MD 4]           //与DB块中存储的值进行比较,开始地址为DBW0。
==I                           //如果数值相等跳到m1。
JC   m1
L        MD            4                //将地址指针加2(每个相邻的字地址相差2)。
L        P#2.0
+D   
T        MD            4
L        MW      100               //次数减1,跳回next,如果MW100等于0,跳
LOOP    NEXT                   //出循环操作LOOP指令,LOOP指令固定格式。
m1:      FP   M    10.0           //如果数值相当,记录MD4指针的数据,将转换为数组                     
JCN     m2                          //的位置((地址值/P#2.0)+1)值存储于MD8中。
L        MD      4
L        P#2.0
/D   
+     L#1
T        MD            8
m2:      NOP   0

2.2.2寄存器间接寻址
通过CPU的地址寄存器AR1和AR2寻址方式称为寄存器间接寻址,分为内部区域间接寻址和交叉区域寻址。使用寄存器间接寻址方式的程序语句包含以下部分:

指令,地址标识符,地址寄存器标识符,偏移量

AR1,AR2均为32位寄存器,寄存器间接寻址只使用32位指针。
与ARx相关的指令有:

LAR1, LAR2, TAR1, TAR2, +AR1, +AR2, LAR1 AR2, CAR等。
以上指令使用请参考手册:开始 -> (所有)程序 -> SIMATIC -> Documentation -> English -> STEP 7 – Statement List for S7-300 and S7-400。
或点击下载该手册中文版

内部区域寄存器间接寻址
指针格式与存储器间接寻址的32位指针相同,第0位~第2位作为寻址操作的位地址,第3位~第18位作为寻址操作的字节地址,第19位~第31位没有定义,32位指针的格式如下:

图 3
间接寻址表示为:存储器标识符 [ ARx, 地址偏移量 ]
如:
L     MW [AR1, P#2.0]
‘MW’为被访问的存储器及访问宽度,’AR1’为地址寄存器1,P#2.0为地址偏移量。

内部区域寄存寻址举例:

//DB块寄存器内部寻址
OPN   DB     1            //打开DB1。
LAR1    P#10.0         //将指针P#10.0 装载到地址寄存器1中。
L        DBW      [AR1, P#12.0]     //将DBW22装载到累加器1中。
LAR1    MD      20                   //将存储于MD20中的指针装载到地址寄存器1中。                                               
L        DBW     [AR1, P#0.0] //将DBW装载到累加器1中,地址存储于MD20中。                                          
+I
LAR2    P#40.0                        //将指针P#40.0 装载到地址寄存器2中。
T        DBW     [AR2, P#0.0] //运算结果传送到DBW40中。

//DI、DO区寄存器内部寻址
L     P#8.7                   //装载指向第8字节第7位的指针值到累加器1
LAR1                                     //累加器1中的指针装载到AR1
A     I     [AR1, P#0.0] //查询I8.7的信号状态
=    Q    [AR1, P#1.1] //给输出位Q10.0赋值

交叉区域寄存器间接寻址
包含有存储器区域信息的指针,称为交叉区域指针。
同样,交叉区域指针为32位,寄存器间接寻址要使用地址寄存器AR1或AR2。
32位交叉区域指针,左起0~18位格式与32位内部区域指针相同,19~23位,27~30位未定义,31位为交叉区域指针标识位。
24~26位是存储区域地址标识,8中组合表示8种存储器区域:
000     表示没有地址区,例如P#12.0;
001     表示输入地址区I,例如P#I12.0;
010     表示输出地址区Q,例如P#Q12.0;
011     表示标志位地址区M,例如P#M12.0;
100     表示数据块(DB)中的数据,例如P#DB1.DBX12.0
101     表示数据块(DI)中的数据,例如P#DI1.DIX12.0
110     表示区域地址区L,例如P#L12.0;
111     表示调用程序块的区域地址区V,例如P#V12.0;
交叉区域指针格式如下:

图 4

交叉区域指针常数表达为:P#   存储器  字节 .

例如:    P#Q10.5              //指向Q区第10字节第5位的指针常
       P#DB1.DBX32.0  //指向DB1区域的第32字节第0位的指针常数

交叉区域寻址表示为:       访问宽度 [ ARx, 偏移量 ]
例如:    L     W [ AR2, P#1.0 ]
       ‘W’为访问宽度,AR2为地址寄存器2,P#1.0为偏移量。

交叉区域间接寻址举例:
//M存储区
L     P#M20.0
LAR1
L     1234
T     W [ AR1, P#2.0]

//I存储区
L     P#I0.0
LAR2
L     W[ AR2, P#0.0 ]
T     MW0

2.2.3 FB/FC的指针参数传递
在使用FB/FC形参传递指针参数时,16位、32位指针是可用的,但POINTER与ANY指针类型也是常见的类型,因为更方便。
16指针用于参数传递
例如:
//编写一个FC,作用是启动条件满足后延时3秒输出闭合信号
//定义FC的形参如下:
图 5
//程序如下:
L     #Pointer16
T     LW     0            //将16位指针装入LW0
A     #Start                   //Start参数 = True时
L     S5T#3S        //计时3秒
SD  T [LW 0]
A     T [LW 0]        //计时器计时到
=     #Motor                 //输出Motor = True   

*32指针用于参数传递
//编写一个FC,作用是将输入DB块指定的区域 (实数) 求出平均值
//定义形参如下:
图 6
//程序如下:
      L     #DB_No
      T     LW     0          //装载DB块号至LW0
      OPN   DB [LW 0]                //并打开该DB块

      L     #Data_1st
      T     LD     2                         //装载第一个要计算的实数的32指针至LD0

      L     0
      T     LD     8                         //将'和'初始为 0

      L     #Len                              //长度
NEXT:        T     LW     6             //实数的个数装载至LW6, 并且进入一个LOOP循环
      L     DBD [LD 2]              //读取LD2指针位置的实数
      L     LD     8
      +R                                      //与'和'相加
      T     LD     8                         //结果存到'和'中
      L     LD     2                          //装入指针
      L     P#4.0
      +D                                      //指针加4个字节
      T     LD     2                         //结果仍存入LD2,此时LD2指针指向下一个实数

      L     LW     6                         //循环计数
      LOOP  NEXT                        //LOOP循环的结束

      L     #Len                         //将实数个数由INT转成REAL
      ITD  
      DTR  
      T     LD    12
      L     LD     8                          //'和'除以实数格式的实数个数
      TAK
      /R   
      T     #Average_out            //得到平均值,通过Average_out输出

POINTER数据类型及参数传递
POINTER是一种用于传递指针的形参数据类型,长度为6个字节。用于向被调用的函数FC及函数块FB传递复合数据类型(如ARRAY、STRUCT及DT等)的实参。在被调用的函数FC及函数块FB内部可以间接访问实参的存储器。
格式如下:
图 7
POINTER参数中,数据区含义如下:
16进制代码
数据区
简单描述
B#16#81
I
输入区
B#16#82
Q
输出区
B#16#83
M
标志位
B#16#84
DB
数据块
B#16#85
DI
背景数据块
B#16#86
L
区域数据区
B#16#87
V
上一级赋值的区域数据
表 1
若数据区为B#16#84,那么表示该POINTER指针是一个DB块地址,DB块号区域应当是所指向的DB块号(INT类型)并且不为零。
(请参考ANY数据类型举例)
ANY数据类型及参数传递
ANY是一种用于传递指针的形参数据类型,可视为POINTER类型的扩展,较POINTER类型为复杂,长度为10个字节,增加的4字节,最高字节 (Byte 0) 固定为B#16#10,第二字节 (Byte 1) 为ANY指针所指向区域的数据类型,而接下来的2字节 (BYTE 3, 4) 组合为一个INT,为ANY指针所指定区域的长度,称为重复系数 (Repetition factor) 。其余6字节作用与POINTER类型相同。
格式如下
图 8

其中数据类型含义为:
数据类型代码
十六进制代码
数据类型
简单描述
B#16#00
NIL

B#16#01
BOOL

B#16#02
BYTE
8位字节
B#16#03
CHAR
8位字符
B#16#04
WORD
16位字
B#16#05
INT
16位整形
B#16#06
DWORD
32位双字
B#16#07
DINT
32位双整形
B#16#08
REAL
32位浮点
B#16#09
DATE
IEC日期
B#16#0A
TIME_OF_DAY(TOD)
24小时时间
B#16#0B
TIME
IEC时间
B#16#0C
S5TIME
SIMATIC时间
B#16#0E
DATE_AND_TIME(DT)
时钟
B#16#13
STRING
字符串
B#16#17
BLOCK_FB
FB号
B#16#18
BLOCK_FC
FC号
B#16#19
BLOCK_DB
DB号
B#16#1A
BLOCK_SDB
SDB号
B#16#1C
COUNTER
计数器
B#16#1D
TIMER
定时器
表 2

编程举例:
//冒泡排序程序,算法原理请参考相关资料
//此例程仅提供存于DB块中的INT类型数据排序
//结果为INT数据由小到大排列,保存于原DB块中
//FC3块,形参定义如下:
图 9

//输入参数Data(Any类型);输出参数Error(INT类型)
//若输出参数Error不为0, 则说明排序未进行,
//Error = 1, Data(ANY类型)输入指针无效
//Error = 2, Data(ANY类型)输入指针地址非DB地址
//Error = 3, Data(ANY类型)输入指针指定区域类型非INT类型


      SET  
      SAVE
      L     0
      T     #Error

//将输入ANY指针'Data_In'复制到LB0~LB9
      L     P##Data
      LAR1
      L     D [AR1,P#0.0]
      T     LD     0
      L     D [AR1,P#4.0]
      T     LD     4
      L     W [AR1,P#8.0]
      T     LW     8

//ANY指针BYTE0是B#16#10
      L     LB     0
      L     B#16#10
      ==I  
      JCN   ERR1

//输入数据区是否为DB块
      L     LB     6
      L     B#16#84
      ==I  
      JCN   ERR2

//类型为INT
      L     LB     1
      L     B#16#5
      ==I  
      JCN   ERR3

//打开输入DB块
      OPN   DB [LW 4]

//数据起始地址去掉数据区标识部分
      L     LD     6
      L     DW#16#FFFFFF
      AD   
      T     LD    10
//计算最后一个存储单元指针保存至LD10
      L     LW     2
      L     2
      *I   
      T     LD    14
      L     L#2
      -D   
      SLD   3
      L     LD    10
      +D   
      T     LD    10

//外循环计数LW20,循环次数为(数据个数-1)次
      L     LW     2
      L     1
      -I   
NXT2: T     LW    20
      L     LD    10
      LAR1
      L     LW    20

//嵌套循环计数LW18,循环次数为(LW20)次
NXT1: T     LW    18
      TAR1
      L     P#2.0
      -D   
      LAR1

//后一单元数据小于前一单元数据?
      L     DBW [AR1,P#2.0]
      L     DBW [AR1,P#0.0]
      <I   
      JCN   L1

//否,交换2单元数据
      L     DBW [AR1,P#2.0]
      L     DBW [AR1,P#0.0]
      T     DBW [AR1,P#2.0]
      POP  
      T     DBW [AR1,P#0.0]

L1:   L     LW    18
     LOOP  NXT1
      L     LW    20
     LOOP  NXT2
      JU    EXIT
//错误码1,ANY指针有错
ERR1: L     1
      T     #Error
      JU    EXIT

//错误码2,输入数据区不是DB块
ERR2: L     2
      T     #Error
      JU    EXIT

//错误码3,输入数据类型不是INT
ERR3: L     3
      T     #Error

EXIT:     SET
       SAVE

OB1程序中调用举例:
      A     M      0.0
      FP    M      0.1
      JCN   EXIT
      CALL  FC     3                 //FC3为上述排序程序
         Data  :=P#DB3.DBX 0.0 INT 64  //参数Data, DB3中64个INT排序
        Error  :=MW2
EXIT: NOP   0

如果您对该文档有任何建议,请将您的宝贵建议提交至下载中心留言板
该文档的文档编号:F0215


附录-推荐网址
自动化系统
西门子(中国)有限公司
工业自动化与驱动技术集团 客户服务与支持中心
自动化系统 下载中心http://www.ad.siemens.com.cn/dow ... Id=0&CatFirst=1   
自动化系统 全球技术资源http://support.automation.siemens.com/CN/view/zh/10805045/130000
“找答案”自动化系统版区:http://www.ad.siemens.com.cn/service/answer/category.asp?cid=1027


注意事项

应用示例与所示电路、设备及任何可能结果没有必然联系,并不完全相关。应用示例不表示客户的具体解决方案。它们仅对典型应用提供支持。用户负责确保所述产品的正确使用。这些应用示例不能免除用户在确保安全、专业使用、安装、操作和维护设备方面的责任。当使用这些应用示例时,应意识到西门子不对在所述责任条款范围之外的任何损坏/索赔承担责任。我们保留随时修改这些应用示例的权利,恕不另行通知。如果这些应用示例与其它西门子出版物(例如,目录)给出的建议不同,则以其它文档的内容为准。

声明

我们已核对过本手册的内容与所描述的硬件和软件相符。由于差错难以完全避免,我们不能保证完全一致。我们会经常对手册中的数据进行检查,并在后续的版本中进行必要的更正。欢迎您提出宝贵意见。
版权© 西门子(中国)有限公司2001-2008 版权保留
复制、传播或者使用该文件或文件内容必须经过权利人书面明确同意。侵权者将承担权利人的全部损失。权利人保留一切权利,包括复制、发行,以及改编、汇编的权利。

西门子(中国)有限公司




回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表