详解西门子间接寻址(讲解 案例分析)资料
西门子数据格式以及寻址,实例讲解清晰易懂,PLC编程必修课

西门子数据格式以及寻址,实例讲解清晰易懂,PLC编程必修课PLC在应用时需要处理各种各样的数据,因此为了应付这些数据,它的存储单元就需要有多种格式,今天带大家了解一下,西门子1200PLC 的数据格式.西门子S7-1200 CPU中可以按照位、字节、字和双字,对存储单元进行寻址。
二进制数的一位只有0或1两种不同的取值,可以用来表示数字量或称开关量的两种不同的状态,如触点的断开和接通线圈的通电和断电等。
八位二进制数组成一个字节,其中的第0位为最低位,第七位为最高位。
两个字节组成一个字,其中的第0位为最低位,第15位为最高位。
两个字组成一个双字,其中的第0位为最低位,第31位为最高位。
西门子S7-1200 CPU,不同的存储单元都是以字节为单位, 如图所示:对位数据的寻址由字节地址和位地址组成,如I3.2,其中的区域标识符I表示输入映像区,字节地址为3,位地址为2,这种存取方式称为字节位寻址方式。
对字节的寻址,如MB2,其中的区域标识符M表示为存储区,2表示寻址单元的起始字节地址,B表示寻址长度为一个字节,即寻址为存储区中的第二个字节。
对字的寻址,如MW2,其中的区域标识符M表示为存储区,2表示寻址单元的起始字节地址,W表示寻址长度为一个字,即两个字节,寻址为存储区中从第二个字节开始的一个字,即字节2和字节3。
请注意,两个字节组成一个字,遵循的是低地址、高字节的原则。
以MW2为例,MB2为MW2的高字节,MB3为MW2的低字节。
对双字的寻址,如MD0,其中的区域标识符M表示为存储区,0表示寻址单元的起始字节地址,D表示寻址长度为一个双字,即两个字四个字节,寻址为存储区中从第0个字节开始的一个双字,即字节0、字节1、字节2和字节3。
寻址方式详解分类:寻址方式从大的方面可以分成直接寻址和间接寻址。
直接寻址就像甲要和乙说话直接叫乙的名字就可以了,甲直接和乙建立联。
间接寻址就像甲要和乙说话,而乙在另外一个城市,甲就写了一封信通过邮递员送给乙,甲通过邮递员间接和乙建立联系,这就叫间接寻址。
西门子PLC指针寻址教学

SITRAIN Training for
Automation and Drives
在程序中分析数据块DB相关信息
用于DB寄存器的指令:
CDB:交换DB寄存器内容
DB寄存器 123 24
DI寄存器
24 指令执行前:
CDB
123 指令执行后:
将DB寄存器内容装载到ACCU1中 L DBNO (将打开的DB号装载到ACCU1中) L DINO (将打开的DI号装载到ACCU1中) 装载数据块长度 L DBLG (将打开的DB的长度/字节装载到ACCU1中) L DILG (将打开的DI的长度/字节装载到ACCU1中)
Automation and Drives
STEP 7 中可能的寻址方式
寻址方式
直接寻址
间接寻址
绝对寻址
符号寻址
存储器间接寻址
寄存器间接寻址
16位指针 (DB, T, C)
示例: A I 4.0 L IW10 A "Mot_on" L #Num OPN DB[MW10] SP T["runtime"]
附加访问宽度
字节,字,双字 字节,字,双字 字节,字,双字 字节,字,双字 字节,字,双字 ---
含义
输入 输出 外设输入 外设输出 位(Bit)存储器 定时器 计数器
字节(DBB), 字(DBW), 通过DB寄存器寻址的数据 双字(DBD) 字节(DIB), 字(DIW), 通过DI寄存器寻址的数据 双字(DID) 字节(LB), 字(LW), 双字 (LD) 本地数据堆栈
L DBB 1 L DBW 2 L5 T DBW 4 L „A‟ L DIB28 ==I A DBX 0.0
S7-1200 间接寻址

S7-1200的间接寻址需要通过数据块中的数组来实现。
指令FieldRead通过索引(又称为下标)变量从数组中读取数值,指令FieldWrite 通过索引变量向数组中写数值,使用这两条指令可以实现间接寻址。
索引变量是间接寻址中的地址指针,它的值是要读写的数组元素的索引值。
地址指针就像收音机调台的指针,改变指针的位置,指针指向不同电台。
改变地址指针中的索引值,指针“指向”数组不同的元素。
间接寻址的优点是可以在程序处理期间,通过改变指针的值动态地修改指令中的地址。
首先生成一个名为“数据块1”的全局数据块DB2,在数据块中生成名为“数组1”的数组Array[1..10] of Int,其元素的数据类型为Int。
这两条指令没有列入指令列表和高级指令列表,编程时将收藏夹中的空逻辑框插入程序,点击其中红色的“??”,打开下拉式列表框,可以看到列表框底部的指令FieldWrite或FieldRead。
点击生成的指令框中的“???”,用列表设置要写入或读取的数据类型为Int(见下图)。
两条指令的参数MEMBER的实参必须是数组的第一个元素“数据块1”.数组1[1]。
指令的输入参数索引值“INDEX”是要读写的数组中的元素的下标,数据类型为DINT(双整数)。
参数“VALUE”是要写入数组元素的值或要读取的数组元素的值。
下图中的FieldWrite指令将常数25写入数组1中的元素“数组1[3]”。
FieldRead指令读取数组元素“数组1[3]”的值,将它保存到MW20。
改变INDEX 的值,可以读写别的数组元素的值。
循环程序用来完成大量的重复的操作。
S7-1200没有像S7-300的LOOP那样的循环程序专用的指令,为了编写循环程序,可以用FieldRead指令实现间接寻址,用普通指令来编写循环程序。
生成一个名为“循环程序”的项目。
首先生成全局数据块DB1,在DB1中生成有10个字节元素的数组,设置各数组元素的初始值。
2.1.4 间接寻址_PLC职业技能培训及视频精讲——西门子STEP 7_[共2页]
![2.1.4 间接寻址_PLC职业技能培训及视频精讲——西门子STEP 7_[共2页]](https://img.taocdn.com/s3/m/b5a4a40476eeaeaad0f33035.png)
第2章 PLC
快速提高
189
图2.1.1 STEP 7管理界面
图2.1.2 全局符号表 图2.1.3 使用符号地址程序例 (2)局域符号
请参考本章功能和功能块相关内容。
2.1.4 间接寻址
1.存储器间接寻址
A I[MD10] //检测I 位的状态,I 的地址由MD10的值决定
= Q[MD10]
//驱动Q 位,Q 的地址由MD10的值决定 L QD[MD10] //装载QD 的数值到累加器1中,QD 的地址由MD10的值决定
上面程序中I[MD10]和Q[MD10],像这种使用存储器给定地址的寻址方式,称为存储器间接寻址。
I[MD10]和Q[MD10]中的MD10称为指针,其里面的数值代表地址,例如P#3.5。
能作为指针使用的存储器有MD 、LD 、DBD 和DID ,而且必须是双字。
存储器指针的格式如图2.1.4所示,其中0~2位是地址的位编号(0~7),3~18位是字节的编号(0~65535)。
例如在图2.1.5所示程序中,MD10 = 2#111011,0~2位的数值是3,3~18位的数值是7,所示MD10指针值是P#7.3。
使用存储器寻址,该存储器的值是操作数的地址,改变该储存器的值相当于改变了操作数的地址,在循环等程序中经常使用存储器间接寻址。
值得注意的是,如果操作数是字节、字或双字,使用存储器间接寻址时,需要确保指针代表位地址的值为零,否则会出现寻址错误。
详解西门子间接寻址 (2)

详解西门子间接寻址【地址的概念】完整的一条指令,应该包含指令符+操作数(当然不包括那些单指令,比如NOT 等)。
其中的操作数是指令要执行的目标,也就是指令要进行操作的地址。
我们知道,在PLC中划有各种用途的存储区,比如物理输入输出区P、映像输入区I、映像输出区Q、位存储区M、定时器T、计数器C、数据区DB和L等,同时我们还知道,每个区域可以用位(BIT)、字节(BYTE)、字(WORD)、双字(DWORD)来衡量,或者说来指定确切的大小。
当然定时器T、计数器C不存在这种衡量体制,它们仅用位来衡量。
由此我们可以得到,要描述一个地址,至少应该包含两个要素:1、存储的区域2、这个区域中具体的位置比如:A其中的A是指令符,是A的操作数,也就是地址。
这个地址由两部分组成:Q:指的是映像输出区:就是这个映像输出区第二个字节的第0位。
由此,我们得出,一个确切的地址组成应该是:〖存储区符〗〖存储区尺寸符〗〖尺寸数值〗.〖位数值〗,例如:。
DB X 200 . 0其中,我们又把〖存储区符〗〖存储区尺寸符〗这两个部分合称为:地址标识符。
这样,一个确切的地址组成,又可以写成:地址标识符+ 确切的数值单元【间接寻址的概念】寻址,就是指定指令要进行操作的地址。
给定指令操作的地址方法,就是寻址方法。
在谈间接寻址之前,我们简单的了解一下直接寻址。
所谓直接寻址,简单的说,就是直接给出指令的确切操作数,象上面所说的,A ,就是直接寻址,对于A这个指令来说,就是它要进行操作的地址。
这样看来,间接寻址就是间接的给出指令的确切操作数。
对,就是这个概念。
比如:A Q[MD100] ,A T[DBW100]。
程序语句中用方刮号[ ] 标明的内容,间接的指明了指令要进行的地址,这两个语句中的MD100和DBW100称为指针Pointer,它指向它们其中包含的数值,才是指令真正要执行的地址区域的确切位置。
间接由此得名。
西门子的间接寻址方式计有两大类型:存储器间接寻址和寄存器间接寻址。
西门子高级编程全集间接寻址及地址寄存器指令PPT课件

LAR1 P#I10.0 //设置AR1
AR1: 10000001 0000 0000 0000 0000 0101 0000
L W [AR1, + 200
P#200.0]
访问 地址 偏移
扩展指令:
L
第12页/共24页
用于装载地址寄存器的指令
装载地址寄存器 LARn (n =1 or 2): LARn <地址> LARn P#<地址>
地址标识符
Bit 31=0: 内部区域 Bit 31=1: 交叉区域
字节地址(无符号整数)
位地址
地址标识符: 指令语法规则:
000 I/O
001 输入(PII)
010 输出(PIQ)
011 位(Bit)存储器
100 DB寄存器中的数据 101 DB寄存器2中的数据(DI)
110 自有本地数据 111 调用块的LD(本地数据)
类型 WORD DWORD WORD
L T OPN . L LAR1 L ...
#DB_Num #I_DB_Num DB[I_DB_Num]
#Area_Pointer
#Length
FC...
地址 声明. 名称
类型
0.0
输入 Measure_1 POINTER
...
8.0
输入 Measure_2 ANY
间接寻址及地址寄存器指令
? ?
?
1
2
-
-
#Ini_Value
-
-
9
10
#Counter
L W [AR1,
P#200.0]
第1页/共24页
STEP 7 中可能的寻址方式
西门子 S7-300的寻址方式

在一条指令中,如果操作码后面的操作数是以操作数所在地址的形式出现的,这种指令的寻址方式就叫直接寻址。
如:MOVD VD400 VD500
功能:将VD400中的双字数据传给VD500
3.间接寻址
在一条指令中,如果操作码后面的操作数是以操作数所在地址的地址形式出现的,这种指令的寻址方式就叫间接寻址。
如:MOVD 2505 *VD500
*VD500是指存放2505的地址的地址。
如VD500中存放的是VB0,则VD0则是存放2505的地址。
该指令的功能:将十进制数2505传送给VD0地址中。
西门子 S7-300的寻址方式
S7-300编程语言的基本单位是语句,而语句的构成是指令,每条指令有两部分:一部分是操作码,另一部分是操作数。操作码是指出这条指令的功能是什么,操作数则指明了操作码所需要的数据所在。所谓寻址,就是寻找操作数的过程。S7-300 CPU的寻址分三种:立即寻址、直接寻址、间接寻址。
1.立即寻址
在一条指令中,如果操作码后面的操作数就是操作码所需要的具体数据,这种指令的寻址方式就叫立即寻址。
如:在传送指令中:MOV IN OUT——操作码“MOV”指出该指令的功能把IN中的数据传送到OUTD 2505 VD500
功能:将十进制数2505传送到VD500中,这里2505就是源操作数。因这个操作数的数值已经在指令中了,不用再去寻找,这个操作数即立即数。这个寻址方式就是立即寻址方式。而目标操作数的数值在指令中并未给出,只给出了要传送到的地址VD500,这个操作数的寻址方式就是直接寻址。
SIEMENS STEP7 间接寻址ppt课件

Date: File:
2021/3/23 SSP2_03C.24
Information and Training Center Knowledge for Automation
SIMATIC S7
Siemens AG 2000. All rights reserved.
Date: File:
2021/3/23 SSP2_03C.25
Information and Training Center Knowledge for Automation
SIMATIC S7
Siemens AG 2000. All rights reserved.
Date: File:
2021/3/23 SSP2_03C.22
Information and Training Center Knowledge for Automation
SIMATIC S7
Siemens AG 2000. All rights reserved.
Date: File:
2021/3/23 SSP2_03C.1
Information and Training Center Knowledge for Automation
立即寻址的例子
SIMATIC S7
SIMATIC S7
Siemens AG 2000. All rights reserved.
Date: File:
2021/3/23 SSP2_03C.23
Information and Training Center Knowledge for Automation
SIMATIC S7
Siemens AG 2000. All rights reserved.
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
详解西门子间接寻址等级:弓剑手威望:0发贴:116经验:416财产:407魅力:411注册:2005-5-21【地址的概念】完整的一条指令,应该包含指令符+操作数(当然不包括那些单指令,比如NOT等)。
其中的操作数是指令要执行的目标,也就是指令要进行操作的地址。
我们知道,在PLC中划有各种用途的存储区,比如物理输入输出区P、映像输入区I、映像输出区Q、位存储区M、定时器T、计数器C、数据区DB和L等,同时我们还知道,每个区域可以用位(BIT)、字节(BYTE)、字(WORD)、双字(DWORD)来衡量,或者说来指定确切的大小。
当然定时器T、计数器C不存在这种衡量体制,它们仅用位来衡量。
由此我们可以得到,要描述一个地址,至少应该包含两个要素:1、存储的区域2、这个区域中具体的位置比如:A Q2.0其中的A是指令符,Q2.0是A的操作数,也就是地址。
这个地址由两部分组成:Q:指的是映像输出区2.0:就是这个映像输出区第二个字节的第0位。
由此,我们得出,一个确切的地址组成应该是:〖存储区符〗〖存储区尺寸符〗〖尺寸数值〗.〖位数值〗,例如:DBX200.0。
DB X 200 . 0其中,我们又把〖存储区符〗〖存储区尺寸符〗这两个部分合称为:地址标识符。
这样,一个确切的地址组成,又可以写成:地址标识符 + 确切的数值单元【间接寻址的概念】寻址,就是指定指令要进行操作的地址。
给定指令操作的地址方法,就是寻址方法。
在谈间接寻址之前,我们简单的了解一下直接寻址。
所谓直接寻址,简单的说,就是直接给出指令的确切操作数,象上面所说的,A Q2.0,就是直接寻址,对于A这个指令来说,Q2.0就是它要进行操作的地址。
这样看来,间接寻址就是间接的给出指令的确切操作数。
对,就是这个概念。
比如:A Q[MD100] ,A T[DBW100]。
程序语句中用方刮号 [ ] 标明的内容,间接的指明了指令要进行的地址,这两个语句中的MD100和DBW100称为指针Pointer,它指向它们其中包含的数值,才是指令真正要执行的地址区域的确切位置。
间接由此得名。
西门子的间接寻址方式计有两大类型:存储器间接寻址和寄存器间接寻址。
【存储器间接寻址】存储器间接寻址的地址给定格式是:地址标识符+指针。
指针所指示存储单元中所包含的数值,就是地址的确切数值单元。
存储器间接寻址具有两个指针格式:单字和双字。
单字指针是一个16bit的结构,从0-15bit,指示一个从0-65535的数值,这个数值就是被寻址的存储区域的编号。
双字指针是一个32bit的结构,从0-2bit,共三位,按照8进制指示被寻址的位编号,也就是0-7;而从3-18bit,共16位,指示一个从0-65535的数值,这个数值就是被寻址的字节编号。
指针可以存放在M、DI、DB和L区域中,也就是说,可以用这些区域的内容来做指针。
单字指针和双字指针在使用上有很大区别。
下面举例说明:L DW#16#35 //将32位16进制数35存入ACC1T MD2 //这个值再存入MD2,这是个32位的位存储区域L +10 //将16位整数10存入ACC1,32位16进制数35自动移动到ACC2T MW100 //这个值再存入MW100,这是个16位的位存储区域OPN DBW[MW100]// 打开DBW10。
这里的[MW100]就是个单字指针,存放指针的区域是M区,MW100中的值10,就是指针间接指定的地址,它是个16位的值!--------L L#+10 //以32位形式,把10放入ACC1,此时,ACC2中的内容为:16位整数10 T MD104 //这个值再存入MD104,这是个32位的位存储区域A I[MD104] //对I1.2进行与逻辑操作!MD14 0000 0000 0000 0000 0000 0000 0000 1010=DIX[MD2] //赋值背景数据位DIX6.5!--------A DB[MW100].DBX[MD2] //读入DB10.DBX6.5数据位状态=Q[MD2] //赋值给Q6.5--------A DB[MW100].DBX[MD2] //读入DB10.DBX6.5数据位状态=Q[MW100] //错误!!没有Q10这个元件------------------------------------------------------------------------------从上面系列举例我们至少看出来一点:单字指针只应用在地址标识符是非位的情况下。
的确,单字指针前面描述过,它确定的数值是0-65535,而对于byte.bit这种具体位结构来说,只能用双字指针。
这是它们的第一个区别,单字指针的另外一个限制就是,它只能对T、C、DB、FC和FB进行寻址,通俗地说,单字指针只可以用来指代这些存储区域的编号。
相对于单字指针,双字指针就没有这样的限制,它不仅可以对位地址进行寻址,还可以对BYTE、WORD、DWORD寻址,并且没有区域的限制。
不过,有得必有失,在对非位的区域进行寻址时,必须确保其0-2bit为全0!总结一下:单字指针的存储器间接寻址只能用在地址标识符是非位的场合;双字指针由于有位格式存在,所以对地址标识符没有限制。
也正是由于双字指针是一个具有位的指针,因此,当对字节、字或者双字存储区地址进行寻址时,必须确保双字指针的内容是8或者8的倍数。
现在,我们分析一下上述例子中的A I[MD104] 为什么最后是对I1.2进行与逻辑操作。
通过L L#+10 ,我们知道存放在MD104中的值应该是:MD104:0000 0000 0000 0000 0000 0000 0000 1010当作为双字指针时,就应该按照3-18bit指定byte,0-2bit指定bit来确定最终指令要操作的地址,因此:0000 0000 0000 0000 0000 0000 0000 1010 = 1.2详解西门子间接寻址<2>【地址寄存器间接寻址】在先前所说的存储器间接寻址中,间接指针用M、DB、DI和L直接指定,就是说,指针指向的存储区内容就是指令要执行的确切地址数值单元。
但在寄存器间接寻址中,指令要执行的确切地址数值单元,并非寄存器指向的存储区内容,也就是说,寄存器本身也是间接的指向真正的地址数值单元。
从寄存器到得出真正的地址数值单元,西门子提供了两种途径:1、区域内寄存器间接寻址2、区域间寄存器间接寻址地址寄存器间接寻址的一般格式是:〖地址标识符〗〖寄存器,P#byte.bit〗,比如:DIX[AR1,P#1.5] 或 M[AR1,P#0.0] 。
〖寄存器,P#byte.bit〗统称为:寄存器寻址指针,而〖地址标识符〗在上帖中谈过,它包含〖存储区符〗+〖存储区尺寸符〗。
但在这里,情况有所变化。
比较一下刚才的例子:DIX [AR1,P#1.5]X [AR1,P#1.5]DIX可以认为是我们通常定义的地址标识符,DI是背景数据块存储区域,X是这个存储区域的尺寸符,指的是背景数据块中的位。
但下面一个示例中的M呢?X只是指定了存储区域的尺寸符,那么存储区域符在哪里呢?毫无疑问,在AR1中!DIX [AR1,P#1.5] 这个例子,要寻址的地址区域事先已经确定,AR1可以改变的只是这个区域内的确切地址数值单元,所以我们称之为:区域内寄存器间接寻址方式,相应的,这里的[AR1,P#1.5] 就叫做区域内寻址指针。
X [AR1,P#1.5] 这个例子,要寻址的地址区域和确切的地址数值单元,都未事先确定,只是确定了存储大小,这就是意味着我们可以在不同的区域间的不同地址数值单元以给定的区域大小进行寻址,所以称之为:区域间寄存器间接寻址方式,相应的,这里的[AR1,P#1.5] 就叫做区域间寻址指针。
既然有着区域内和区域间寻址之分,那么,同样的AR1中,就存有不同的内容,它们代表着不同的含义。
【AR的格式】地址寄存器是专门用于寻址的一个特殊指针区域,西门子的地址寄存器共有两个:AR1和AR2,每个32位。
当使用在区域内寄存器间接寻址中时,我们知道这时的AR中的内容只是指明数值单元,因此,区域内寄存器间接寻址时,寄存器中的内容等同于上帖中提及的存储器间接寻址中的双字指针,也就是:其0-2bit,指定bit位,3-18bit指定byte字节。
其第31bit固定为0。
AR:0000 0000 0000 0BBB BBBB BBBB BBBB BXXX这样规定,就意味着AR的取值只能是:0.0 ——65535.7例如:当AR=D4(hex)=0000 0000 0000 0000 0000 0000 1101 0100(b),实际上就是等于26.4。
而在区域间寄存器间接寻址中,由于要寻址的区域也要在AR中指定,显然这时的AR 中内容肯定于寄存器区域内间接寻址时,对AR内容的要求,或者说规定不同。
AR:1000 0YYY 0000 0BBB BBBB BBBB BBBB BXXX比较一下两种格式的不同,我们发现,这里的第31bit被固定为1,同时,第24、25、26位有了可以取值的范围。
聪明的你,肯定可以联想到,这是用于指定存储区域的。
对,bit24-26的取值确定了要寻址的区域,它的取值是这样定义的:区域标识符26、25、24位P(外部输入输出)000I(输入映像区)001Q(输出映像区)010M(位存储区)011DB(数据块)100DI(背景数据块)101L(暂存数据区,也叫局域数据)111如果我们把这样的AR内容,用HEX表示的话,那么就有:当是对P区域寻址时,AR=800xxxxx当是对I区域寻址时,AR=810xxxxx当是对Q区域寻址时,AR=820xxxxx当是对M区域寻址时,AR=830xxxxx当是对DB区域寻址时,AR=840xxxxx当是对DI区域寻址时,AR=850xxxxx当是对L区域寻址时,AR=870xxxxx经过列举,我们有了初步的结论:如果AR中的内容是8开头,那么就一定是区域间寻址;如果要在DB区中进行寻址,只需在8后面跟上一个40。
84000000-840FFFFF指明了要寻址的范围是:DB区的0.0——65535.7。
例如:当AR=840000D4(hex)=1000 0100 0000 0000 0000 0000 1101 0100(b),实际上就是等于DBX26.4。
我们看到,在寄存器寻址指针 [AR1/2,P#byte.bit] 这种结构中,P#byte.bit又是什么呢?【P#指针】P#中的P是Pointer,是个32位的直接指针。
所谓的直接,是指P#中的#后面所跟的数值或者存储单元,是P直接给定的。