详解西门子间接寻址 (2)
西门子数据格式以及寻址,实例讲解清晰易懂,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。
寻址方式详解分类:寻址方式从大的方面可以分成直接寻址和间接寻址。
直接寻址就像甲要和乙说话直接叫乙的名字就可以了,甲直接和乙建立联。
间接寻址就像甲要和乙说话,而乙在另外一个城市,甲就写了一封信通过邮递员送给乙,甲通过邮递员间接和乙建立联系,这就叫间接寻址。
西门子间接寻址2
AR:
1000 0YYY 0000 0BBB BBBB BBBB BBBB BXXX
比较一下两种格式的不同,我们发现,这里的第31bit被固定为1,同时,第24、25、26位有了可以取值的范围。聪明的你,肯定可以联想到,这是用于指定存储区域的。对,bit24-26的取值确定了要寻址的区域,它的取值是这样定义的:
西门子间接寻址<2>
详解西门子间接寻址<2>
【地址寄存器间接寻址】
在先前所说的存储器间接寻址中,间接指针用M、DB、DI和L直接指定,就是说,指针指向的存储区内容就是指令要执行的确切地址数值单元。但在寄存器间接寻址中,指令要执行的确切地址数值单元,并非寄存器指向的存储区内容,也就是说,寄存器本身也是间接的指向真正的地址数值单元。从寄存器到得出真正的地址数值单元,西门子提供了两种途径:
区域标识符
26、25、24位
P(外部输入输出)
000
I(输入映像区)
001
Q(输出映像区)
010
M(位存储区)
011
DB(数据块)
100
DI(背景数据块)
101
L(暂存数据区,也叫局域数据)
X [AR1,P#1.5] 这个例子,要寻址的地址区域和确切的地址数值单元,都未事先确定,只是确定了存储大小,这就是意味着我们可以在不同的区域间的不同地址数值单元以给定的区域大小进行寻址,所以称之为:区域间寄存器间接寻址方式,相应的,这里的[AR1,P#1.5] 就叫做区域间寻址指针。
S7-200SMART间接寻址
S7-200 SMART 间接寻址一、间接寻址概念:1、间接寻址是指用指针来访问存储区的数据。
指针以双字的形式存储其它存储区的地址,只能将V 存储单元、L 存储单元或累加器寄存器(AC1、AC2、AC3)用作指针。
注意:S7-200 SMART CPU 允许指针访问下列存储区:I、Q、V、M、S、AI、AQ、SM、T(仅限当前值)和C(仅限当前值)。
不能使用间接寻址访问单个位或访问HC、L 或累加器存储区。
2、指针存储的就是存储器的内存地址或编号,如下所示,VB0表示的是一个存储器,而内存地址:16#08000000则就是VB0这个存储区所对应的内存地址,通过对这个内存地址的改变就可以实现对不同的存储区的访问,这就是间接寻址的过程。
3、间接寻址的使用过程主要分为建立指针,改变指针,通过指针实现存储器三步骤。
二、建立指针:要创建指针,用“&”符号加上要访问的存储区地址可建立一个指针,必须使用“移动双字”指令,将间接寻址的存储单元地址移至指针位置。
注意:修改指针的值时,请记住调整所访问数据的大小:访问字节时,指针值加1;访问定时器或计数器的字或当前值时,指针值加2;访问双字时,指针值加4。
三、修改指针:对指针中的数据进行修改,可以实现对存储地址的改变,如图所示通过对指针进行加法操作来改变指针中的所存的数据,该数据指向的是PLC中存储器的内存地址。
四、通过指针对数据进行存取:当指针的内容修改完后,需要根据修改后的指针的内容访问对应的存储区的数据,此时指令中的操作数是指针是,应该在操作数前面加上“*”号。
例程1.通过指针访问数据表所实现的功能:索引号VW1008=0时,将指定的配方0(VB100~VB104) 数据传送到(VB1500~VB1504) 索引号VW1008=1时,将指定的配方1(VB105~VB109) 数据传送到(VB1500~VB1504) 索引号VW1008=2时,将指定的配方2(VB110~VB114) 数据传送到(VB1500~VB1504) 索引号VW1008=3时,将指定的配方3(VB115~VB119) 数据传送到(VB1500~VB1504)例程2.通过指针存储数据表所实现的功能:索引号VW1008=0时,将(VB1500~VB1504)数据传送到指定的配方0(VB100~VB104) 索引号VW1008=1时,将(VB1500~VB1504)数据传送到指定的配方1(VB105~VB109) 索引号VW1008=2时,将(VB1500~VB1504)数据传送到指定的配方2(VB110~VB114) 索引号VW1008=3时,将(VB1500~VB1504)数据传送到指定的配方3(VB115~VB119)例程3.通过地址偏移量来访问V存储区数据所实现的功能:本例程可以实现对区任意字节数据的访问。
2.1.4 间接寻址_PLC职业技能培训及视频精讲——西门子STEP 7_[共2页]
第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。
使用存储器寻址,该存储器的值是操作数的地址,改变该储存器的值相当于改变了操作数的地址,在循环等程序中经常使用存储器间接寻址。
值得注意的是,如果操作数是字节、字或双字,使用存储器间接寻址时,需要确保指针代表位地址的值为零,否则会出现寻址错误。
西门子PLC指令寻址方式
西门子PLC指令寻址方式西门子S7-200编程语言的基本单位是语句,而语句的构成是指令,每条指令有两部分:一部分是操作码,另一部分是操作数。
操作码指出这条指令的功能是什么,操作数则指明操作码所需要的数据所在。
所谓寻址,就是寻找操作数的过程。
S7-200 CPU的寻址分为三种:立即寻址、直接寻址和间接寻址。
1)立即寻址在一条指令中,如果操作码后面的操作数就是操作码所需要的具体数据,这种指令的寻址方式就叫立即寻址。
例如,在传送指令MOV IN OUT中,操作码“MOV”指出该指令的功能是把IN中的数据传送到OUT中,其中IN 为源操作数,OUT为目标操作数。
若该指令为MOVD 2505 VD500,则其功能为:将十进制数2505传送到VD500中,这里2505就是源操作数。
因这个操作数的数值已经在指令中,不用再去寻找,这个操作数即为立即数。
这个寻址方式就是立即寻址方式。
而目标操作数的数值在指令中并未给出,只给出了要传送到的地址VD500,这个操作数的寻址方式就是直接寻址。
2)直接寻址在一条指令中,如果操作码后面的操作数是以操作数所在地址的形式出现的,这种指令的寻址方式就叫直接寻址。
例如:MOVD VD400 VD500功能:将VD400中的双字数据传给VD500。
3)间接寻址在一条指令中,如果操作码后面的操作数是以操作数所在地址的地址形式出现的,这种指令的寻址方式就叫间接寻址。
例如:MOVD 2505 *VD500*VD500是指存放2505地址的地址。
若VD500中存放的是VDO,则VDO是存放2505的地址。
该指令的功能:将十进制数2505传送给VDO地址中。
西门子S7-1200的间接寻址功能(2)
西门子S7-1200的间接寻址功能(2)
前面介绍了读取和写入数组中元素值的指令Field Read和Field Write两条指令,同时给大家简单的分析了程序的设计思路。
接下来就使用Field Read来实现本功能,在程序的设计过程中可能还需要用到循环跳转指令。
例子说明:
假设需要从一组数据中找出一个最大值,并记录这个最大值是这组数据中的第几个数据。
第一步:
添加一个全局DB块,并在DB块中建立一个变量名为data_1#,数据类型为数组的变量,用于存储需要找出最大的数据,同时建立一些相应的变量,如下图所示。
第二步:
初始化相应的存储器并把存储最大值的存储器的值设置为最小值。
程序如下所示:
第三步:
编写判断数据的挨个比较是否完成,当执行的次数与设定的次数相等时,则表示完成,可以跳出最大值查找的程序,让程序跳转到最后执行。
程序如下所示:
第四步:
编写读取数组中元素的值,然后与存储最大值的存储器中的值做比较,用于判断数据存储器存储的值是否是最大值,若不是最大值进行数据交换,同时记录位置,然后INDEX的值加1,同时记录执行次数并与设定次数做比较,如未达到设定次数,则跳转换前面继续通过Field Read指令读取数据出来继续做比较。
程序仅供参考,希望对大家在以后使用此功能上时有所帮助。
西门子高级编程全集间接寻址及地址寄存器指令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 中可能的寻址方式
西门子plc的4种寻址方式
西门子plc的4种寻址方式立即寻址是对操作数是常数或常量的寻址方式,其特点是操作数值直接表示在指令中,出现在指令中的操作数称为立即数。
有些指令的操作数是唯一的,为简化起见,并不在指令中写出。
立即寻址方式可用来提供常数、设置初值等。
常数值可分为字节、字、双字型等数据。
CPU以二进制方式存储所有常数。
在指令中可用十进制、十六进制、ASCII码或浮点数形式来表示操作数。
立即寻址示例:SET 说明:把RLO置1OW W#16#320 将常量W#16#320与ACCU1“或”运算L 1352 把整数1352装入ACCU1L‘ABCD’把ASCII码字符ABCD装入ACCU1L C#100 把BCD码常数100(计数值)装入ACCU1AW W#16#3A12 常数W316#3 A12与ACCU1的低位相“与”,运算结果在ACCU1的低字中。
存储器直接寻址包括对寄存器和存储器的直接寻址。
在直接寻址的指令中,直接给出操作数的存储单元地址,包括寄存器或存储器的区域、长度和位置,根据这个地址就可以立即找到该数据。
例如,用MW200指定位存储区中的字,地址为200;MB100表示以字节方式存取,MW100表示存取MB100、MB101组成的字,MD100表示存取MB100~ MB103组成的双字。
在指令中,数据类型应与指令标识符相匹配。
直接寻址编程示例:A IO.0 说明:对输入位10.0进行“与”逻辑操作S L20.0 把本地数据位I20.0置“l”= M115.4 使存储区位M115.4的内容等于RLO的内容L IB10 把输入字节IB10的内容装入ACCU1T DBD12 把ACCU1中的内容传送给数据双字DBD12中。
存储器间接寻址简称间接寻址。
该寻址方式在指令中以存储器的形式给出操作数所在存储器单元的地址,也就是说该存储器的内容是操作数所在存储器单元的地址。
该存储器一般称为地址指针,在指令中需写在方括号“[]”内。
西门子STL间接寻址常问问题集 (2)
如何获得指针或者间接寻址有关的信息?指针的类型包括16位指针、32位指针、Pointer(6Byte)和Any(10Byte)。
16位指针用于定时器、计数器、程序块的寻址;32位指针用于I/Q/M/L/数据块等存储器中位、字节、字以及双字的寻址,其中第0~2位表示位地址(0~7)、第3~18位为字节地址,其余位未定义;Pointer和Any一般应用在复杂数据类型(比如Date_and_Time /Array/String等)在FB、FC之间的传递。
而Any可以看做是对Pointer的延伸,因为由10Byte组成的Any中Byte4~Byte9就是一个Pointer。
了解指针的格式十分重要,为正确使用指针,应阅读如下内容:1、"SIMATIC Programming with STEP 7 " 05/2010 第章参数类型2、文档:1008用于S7-300 和S7-400 的语句表(STL)编程3、文档:F0215,S7-300和S7-400寻址为什么语句LAR1 P##PointerInput 在一个函数(FC)中是无效的,然而,同样的语句在一个功能块(FB)中是有效的?在FC被调用时,复杂数据类型例如指针是被复制到调用者的临时变量区中,在FC内部对此V区地址直接取址放入到地址寄存器AR1或AR2是不被编译器规则接受的(导致MC7寄存器信息过长),也就是说在FC内部通过P#进行地址寄存器取址仅能支持Temp临时变量。
因此如果需要在FC中操作指针等复杂输入输出变量地址需要使用累加器进行中转。
考虑到程序的一致性、遵守编译器规则和STL手册中LAR1指令说明,建议用户使用如下指令操作:L P##PointerInputLAR1STEP 7 中哪些操作会覆盖DB/DI寄存器或者地址寄存器AR1/AR2的内容?下面说明了可能引起DB/DI寄存器或者地址寄存器AR1/AR2内容改变的一些操作:•DB寄存器和AR1受到影响的操作• 1. 使用完整的DB路径(如L )或者调用FC/FB时使用DB块完整地址作为其参数,则DB寄存器内容被覆盖。
西门子S7-1200 PLC的间接寻址功能及实例
S7-1200指针数据- 已解决问题看了这个问题的网友还看了∙西门子模拟量电压问题西门子博图V14安装步骤∙S7-200/S7-1200/S7-300 EPLAN宏下载S7-1200 怎么实现与上位机进行Modbus_TCP/TP通讯∙打开S7-PLCSIM V13就提示几个文件签名无效,然后报错退出。
关于博图软件怎样安装∙1200PLC编程时,同样是16个位,怎样把数组转换为INT?西门子plc1200编程软件下载∙wincc与s7-1200怎么通讯1200PLC不能与PC机链接,找不到设备,输入输出,如附件IF #EXCUTE = True THENPOKE_BLK(area_src:= #AREA_SRC, (* 源数据类型:16#81:I,16#82:Q,16#83:M,16#84:DB *) dbNumber_src:= #DB_NUM_SRC, (* 源数据块:非DB=0 *)byteOffset_src:= #START_BIT_SRC, (* 源数据起始位号 DB[#DB_NUM_SRC].DBB[#START_BIT_SRC] *)area_dest:= #AREA_TYPE, (* 目标存储类型:16#81:I,16#82:Q,16#83:M,16#84:DB *)dbNumber_dest:= #DB_NUM, (* 目标数据块:非DB=0 *)byteOffset_dest:= #START_BIT, (* 目标起始位位号 DB[#DB_NUM].DBB[#START_BIT] *)count:= #BYTE_COUNT); (* 复制长度字节 *)END_IF;图片说明:回答者:sunnic - 高级技术员第7级2016-08-14 17:08:21提问者对于答案的评价:谢谢已有1人评论展开6wenhua6:你好,我按照你做的,怎么不行西门子S7-1200循环程序间接寻址的方法循环程序的关键是间接寻址,西门子S7-1200的间接寻址离不开数组。
西门子S7-300高级编程培训4间接寻址和地址寄存器
Date: File:
2011-9-5 PRO2_04E.4
SITRAIN Training for
Automation and Drives
在程序中分析数据块DB相关信息 在程序中分析数据块 相关信息
用于DB寄存器的指令: 用于 寄存器的指令: 寄存器的指令
CDB:交换DB寄存器内容 :交换 寄存器内容
DB41 1.0 2.0 Meas_Value[1] Meas_Value[2]
#Ini_Value
-
32 #Counter 36 40
9.0 10.0 11.0 . . .
Meas_Value[9] Meas_Value[10] Meas_Value[11] 等等。 等等。
SIMATIC S7
Siemens AG 2001. All rights reserved.
组合指令 包含OPN D DB..) (包含 )
L DB19.DBW4
L “Values”.Number_1
A DB10.DBX4.7
的第4个字节的第 个字节的第7位开始扫描 从DB 10 的第 个字节的第 位开始扫描
SIMATIC S7
Siemens AG 2001. All rights reserved.
SITRAIN Training for
Automation and Drives
间接寻址示例
FC30:间接寻址示例 : Network(段) 1:使用间接寻址方式打开 ( :使用间接寻址方式打开DB L #dbnumber T MW 100 OPN DB[MW 100] Network (段) 2: L T L next: T L T L L -D T L LOOP P#18.0 MD 40 10 MB 50 0 DBW[MD 40] MD 40 P#2.0 MD 40 MB 50 next // 将DB号拷贝到 号拷贝到MW100 号拷贝到 // // 打开DB 打开 循环删除 // // // // // // // // // // // // 将终端地址( 将终端地址(DBW18)作为指针 ) 传送到MD 40; 传送到 ; 将循环计数器值设置为10 将循环计数器值设置为 传到MB 50中; 传到 中 装载初始值 传到DB50中; 传到 中 装载指针 并减去2个字节 并减去 个字节 然后再传回 到MD 40; ; 装载循环计数器 减去2个字节 条件满足则跳转; 个字节, 减去 个字节,条件满足则跳转;
西门子PLC高级编程3_间接寻址及地址寄存器指令
A DBX 0.0
从0字节的第0位开始扫描
L DB19.DBW4 从DB 19中装载数据字4
L “Values”.Number_1 符号访问变量
Number_1. DB19 具有变量名“Values”
A DB10.DBX4.7 从DB 10 的第4个字节的第7位开始扫描
SIMATIC S7
Siemens AG 2001. All rights reserved.
地址标识符
Bit 31=0: 内部区域 Bit 31=1: 交叉区域
字节地址(无符号整数)
位地址
地址标识符:
000 I/O
010 输出(PIQ) 100 DB寄存器中的数据 110 自有本地数据
001 输入(PII) 011 位(Bit)存储器 101 DB寄存器2中的数据(DI) 111 调用块的LD(本地数据)
Date: File:
2018/7/13 PRO2_04E.2
SITRAIN Training for
Automation and Drives
地址
I Q PIB PQB M T C DBX DIX L
变量直接寻址
存储单元位置 (示例)
37.4 27.7 655 653 55.0 114 13 2001.6 406.1 88.5
循环删除
// 将终端地址(DBW18)作为指针 // 传送到MD 40; // 将循环计数器值设置为10 // 传到MB 50中; // 装载初始值 // 传到DB50中; // 装载指针 // 并减去2个字节 // 然后再传回 // 到MD 40; // 装载循环计数器 // 减去2个字节,条件满足则跳转;
L 11 T MW 60
SIEMENSSTEP7间接寻址
02 Siemens Step7 中的间接寻址
Step7 中的间接寻址方式
01
间接寻址是通过间接地址指针来访问存储单元的寻址方 式。在 Step7 中,间接寻址主要应用于数组、结构体等 复杂数据类型的访问。
02
间接寻址通过使用指针变量来间接指向目标数据,从而 实现数据的间接访问。
03
间接寻址的地址计算涉及指针变量的值计算,以确定目 标数据的实际地址。
Siemens Step7 间 接寻址
目录
• 间接寻址简介 • Siemens Step7 中的间接寻址 • 间接寻址的编程示例 • 间接寻址的优缺点 • 间接寻址的常见问题与解决方案 • 间接寻址的未来发展与展望
间接寻址简介
01
定义与特点
01
定义
间接寻址是一种在编程中通过间接变量访问实际变量的 方法。在Siemens Step7中,间接寻址允许我们通过间 接变量来访问数据块中的数据。
间接寻址的地址计算
01
地址计算是间接寻址中关键的一步,它涉及到指针 变量的值调整和偏移计算。
02
地址计算通常涉及加减运算,以根据指针变量当前 指向的地址,计算出目标数据的实际地址。
03
地址计算过程中需要考虑数据类型的大小和字节顺 序,以确保正确访问目标数据。
间接寻址的指令应用
01
间接寻址在 Step7 中广泛应用于指令操作,如数据块读写、结 构体访问等。
数据块访问权限问题
总结词
在Step7中,数据块访问权限问题也是一个常见问题,可能导致程序无法正常访问数据 块。
详细描述
当使用间接寻址时,如果访问的数据块没有正确的访问权限,程序将无法读取或写入数 据块。为了避免这个问题,程序员需要确保数据块具有正确的访问权限,并且在使用间
(完整版)S7-200间接寻址解析
(完整版)S7-200间接寻址解析对指令的操作数的指定方式,我将其理解为“寻址”。
下面将以我个人的理解对西门子S7-200的寻址方式进行描述,如有不当之处,还请广大读者指正。
在程序中绝大部分的指令都带有操作数,所谓的操作数,是执行这一指令时被这一指令加以操作、处理的数值。
对指令的操作数的指令方式大致的总结一下,可以概括为如下几个类型:1:指令的操作数为“立即数”,(如:15、16#F、2#1111等、、、、、、)。
LD M0.0MOVW +255, VW0+I +45, VW0这是一条加法指令,被加数为:255、加数为45执行这条指令后计算出来的“和”存放在VW0这一存储器内。
LD M0.0MOVB 15, VB0这是一条传指令,译为:将15传送至存储器VB0内。
2:指令的操作数没有直接的给出,而是给出它所在的地址。
LD M0.0MOVW VW0, VW4-I VW2, VW4这是一条减法指令,译为:将存储器VW0内的数值减去存储器VW2内的数值,将“差”存放在存储器VW4内。
3:指令的操作数没有直接的给出,而是给出它所在的地址的“地址”,在S7-200中,将这种寻址方式称之为“指针寻址”。
下面,我们一起来学习一下关于指针的使用方法:在使用指针进行间接寻址的过程中,会涉及到的两个符号:&:建立指针(进行间接访问的区域)*:读取指针(读取指针间接指定的地址)下面是使用指针的一般步骤:1:建立指针建立指针需要使用双字传送指令,如下所示:LD M0.0MOVD &MB0, VD10译为:在VD10建立指针,指针指向被间接访问的首地址MB0。
在建立指针时需要注意如下几个问题:①可以进行间接访问的区域,包括如下几个区域:I、Q、M、S、V、T(当前值)、C(当前值)。
在S7-200中位状态是不能进行间接指定的,所以这里特别强调只是访问定时器及计数器的当前值,而不是其位状态。
②可以作为建立指针的区域,包括如下几个区域:V、L、及累加器AC1至AC3。
西门子间接寻址的详细介绍
西门子间接寻址的详细介绍在先前所说的存储器间接寻址中,间接指针用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位。
西门子S7-300高级编程培训教材,内部教材_4、间接寻址和地址寄存器指令
地址标识符
Bit 31=0: 内部区域 Bit 31=1: 交叉区域
字节地址(无符号整数)
位地址
地址标识符:
000 I/O
010 输出(PIQ) 100 DB寄存器中的数据 110 自有本地数据
001 输入(PII) 011 位(Bit)存储器 101 DB寄存器2中的数据(DI) 111 调用块的LD(本地数据)
LI
W
[MD50]
L IW 24
存储 访问 区域 宽度
地址
SIMATIC S7
Siemens AG 2001. All rights reserved.
Date: File:
2023/1/19 PRO2_04E.6
SITRAIN Training for
Automation and Drives
用于存储器间接寻址的指针结构
间接寻址及地址寄存器指令
? ?
?
1
2
-
-
-
#Ini_Value
-
9 10
#Counter
L W [AR1, P#200.0]
SIMATIC S7
Siemens AG 2001. All rights reserved.
Date: File:
2023/1/19 PRO2_04E.1
SITRAIN Training for
循环删除
// 将终端地址(DBW18)作为指针 // 传送到MD 40; // 将循环计数器值设置为10 // 传到MB 50中; // 装载初始值 // 传到DB50中; // 装载指针 // 并减去2个字节 // 然后再传回 // 到MD 40; // 装载循环计数器 // 减去2个字节,条件满足则跳转;
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
详解西门子间接寻址【地址的概念】完整的一条指令,应该包含指令符+操作数(当然不包括那些单指令,比如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,它指向它们其中包含的数值,才是指令真正要执行的地址区域的确切位置。
间接由此得名。
西门子的间接寻址方式计有两大类型:存储器间接寻址和寄存器间接寻址。
【存储器间接寻址】存储器间接寻址的地址给定格式是:地址标识符+指针。
指针所指示存储单元中所包含的数值,就是地址的确切数值单元。
存储器间接寻址具有两个指针格式:单字和双字。
单字指针是一个16bit的结构,从0-15bit,指示一个从0-65535的数值,这个数值就是被寻址的存储区域的编号。
双字指针是一个32bit的结构,从0-2bit,共三位,按照8进制指示被寻址的位编号,也就是0-7;而从3-18bit,共16位,指示一个从0-65535的数值,这个数值就是被寻址的字节编号。
指针可以存放在M、DI、DB和L区域中,也就是说,可以用这些区域的内容来做指针。
单字指针和双字指针在使用上有很大区别。
下面举例说明:L DW#16#35 BX[MD2] BX[MD2] BW[MD2] 这样的寻址是错误的提法,这里做个解释:DB[MW100].DBW[MD2] 这样的寻址结构就寻址原理来说,是可以理解的,但从SIEMENS程序执行机理来看,是非法的。
在实际程序中,对于这样的寻址,程序语句应该写成:OPN DBW[WM100],L DBW[MD2]事实上,从这个例子的中心思想来看,根本没有必要如此复杂。
但为什么要用间接寻址呢?要澄清使用间接寻址的优势,就让我们从比较中,找答案吧。
例子告诉我们,它最终执行的是把DB的某个具体字的数据传送到位存储区某个具体字中。
这是针对数据块100的1数据字传送到位存储区第1字中的具体操作。
如果我们现在需要对同样的数据块的多个字(连续或者不连续)进行传送呢?直接的方法,就是一句一句的写这样的具体操作。
有多少个字的传送,就写多少这样的语句。
毫无疑问,即使不知道间接寻址的道理,也应该明白,这样的编程方法是不合理的。
而如果使用间接寻址的方法,语句就简单多了。
【示例程序的结构分析】我将示例程序从结构上做个区分,重新输入如下:输入1:指定数据块编号的变量|| L 100|| T MW 100输入2:指定字地址的变量|| L DW#16#8|| T MD 2操作主体程序OPN DB [MW 100]L DBW [MD 2]T MW[MD2]显然,我们根本不需要对主体程序(红色部分)进行简单而重复的复写,而只需改变MW100和MD2的赋值(绿色部分),就可以完成应用要求。
结论:通过对间接寻址指针内容的修改,就完成了主体程序执行的结果变更,这种修改是可以是动态的和静态的。
正是由于对真正的目标程序(主体程序)不做任何变动,而寻址指针是这个程序中唯一要修改的地方,可以认为,寻址指针是主体程序的入口参数,就好比功能块的输入参数。
因而可使得程序标准化,具有移植性、通用性。
那么又如何动态改写指针的赋值呢?不会是另一种简单而重复的复写吧。
让我们以一个具体应用,来完善这段示例程序吧:将DB100中的1-11数据字,传送到MW1-11中在设计完成这个任务的程序之前,我们先了解一些背景知识。
【数据对象尺寸的划分规则】数据对象的尺寸分为:位(BOOL)、字节(BYTE)、字(WORD)、双字(DWORD)。
这似乎是个简单的概念,但如果,MW10=MB10+MB11,那么是不是说,MW11=MB12+MB13?如果你的回答是肯定的,我建议你继续看下去,不要跳过,因为这里的疏忽,会导致最终的程序的错误。
按位和字节来划分数据对象大小时,是以数据对象的bit来偏移。
这句话就是说,0bit后就是1bit,1bit后肯定是2bit,以此类推直到7bit,完成一个字节大小的指定,再有一个bit的偏移,就进入下一个字节的0bit。
而按字和双字来划分数据对象大小时,是以数据对象的BYTE来偏移!这就是说,MW10=MB10+MB11,并不是说,MW11=MB12+MB13,正确的是MW11=MB11+MB12,然后才是MW12=MB12+MB13!这个概念的重要性在于,如果你在程序中使用了MW10,那么,就不能对MW11进行任何的操作,因为,MB11是MW10和MW11的交集。
也就是说,对于“将DB100中的1-11数据字,传送到MW1-11中”这个具体任务而言,我们只需要对DBW1、DBW3、DBW5、DBW7、DBW9、DBW11这6个字进行6次传送操作即可。
这就是单独分出一节,说明数据对象尺寸划分规则这个看似简单的概念的目的所在。
【循环的结构】要“将DB100中的1-11数据字,传送到MW1-11中”,我们需要将指针内容按照顺序逐一指向相应的数据字,这种对指针内容的动态修改,其实就是遍历。
对于遍历,最简单的莫过于循环。
一个循环包括以下几个要素:1、初始循环指针2、循环指针自加减2、继续或者退出循环体的条件判断被循环的程序主体必须位于初始循环指针之后,和循环指针自加减之前。
比如:初始循环指针:X=0循环开始点M被循环的程序主体:循环指针自加减:X+1=X循环条件判断:X≤10 ,False:GO TO M;True:GO TO N循环退出点N如果把X作为间接寻址指针的内容,对循环指针的操作,就等于对寻址指针内容的动态而循环的修改了。
【将DB100中的1-11数据字,传送到MW1-11中】L L#1 //初始化循环指针。
这里循环指针就是我们要修改的寻址指针T MD 102M2: L MD 102T #COUNTER_DOPN DB100L DBW [MD 102]T MW [MD 102]L #COUNTER_DL L#2 // +2,是因为数据字的偏移基准是字节。
+DT MD 102 //自加减循环指针,这是动态修改了寻址指针的关键L L#11 //循环次数=n-1。
n=6。
这是因为,首次进入循环是无条件的,但已事实上执行了一次操作。
<=DJC M2有关于T MD102 ,L L#11,<=D的详细分析,请按照前面的内容推导。
【将DB1-10中的1-11数据字,传送到MW1-11中】这里增加了对DB数据块的寻址,使用单字指针MW100存储寻址地址,同样使用了循环,嵌套在数据字传送循环外,这样,要完成“将DB1-10中的1-11数据字,传送到MW1-11中”这个任务,共需要M1循环10次× M2循环6次=60次。
L 1T MW 100L L#1T MD 102M1: L MW 100T #COUNTER_WM2: 对数据字循环传送程序,同上例L #COUNTER_WL 1 //这里不是数据字的偏移,只是编号的简单递增,因此+1+IT MW 100L 9 //循环次数=n-1,n=10<=IJC M1通过示例分析,程序是让寻址指针在对要操作的数据对象范围内进行遍历来编程,完成这个任务。
我们看到,这种对存储器间接寻址指针的遍历是基于字节和字的,如何对位进行遍历呢?这就是下一个帖子要分析的寄存器间接寻址的实例的内容了。
详解西门子间接寻址<4>L [MD100]LAR1与L MD100LAR1有什么区别?当将MD100以这种[MD100] 形式表示时,你既要在对MD100赋值时考虑到所赋的值是否符合存储器间接寻址双字指针的规范,又要在使用这个寻址格式作为语句一部分时,是否符合语法的规范。
在你给出第一个例程的第一句:L [MD100]上,我们看出它犯了后一个错误。
存储器间接寻址指针,是作为指定的存储区域的确切数值单元来运用的。
也就是说,指针不包含区域标识,它只是指明了一个数值。
因此,要在[MD100]前加上区域标识如:M、DB、I、Q、L等,还要加上存储区尺寸大小如:X、B、W、D等。
在加存储区域和大小标识时,要考虑累加器加载指令L不能对位地址操作,因此,只能指定非位的地址。
为了对比下面的寄存器寻址方式,我们这里,修改为:L MD[MD100]。
并假定MD100=8Hex,同时我们也假定MD1=Hex。
当把MD100这个双字作为一个双字指针运用时,其存储值的0-18bit将会按照双字指针的结构来重新“翻译”,“翻译”的结果才是指针指向的地址,因而MD100中的8Hex=1000B=,所以下面的语句:L MD[MD100]LAR1经过“翻译”就是:L MD1LAR1前面我们已经假定了MD1=,同样道理,MD1作为指针使用时,对0-18bit 应该经过结构的“翻译”,由于是传送给AR地址寄存器,还要对24-31bit进行区域寻址“翻译”。
这样,我们得出LAR1中最终的值=。
就是说,我们在地址寄存器AR1中存储了一个指针,它指向。
L MD100LAR1这段语句,是直接把MD100的值传送给AR,当然也要经过“翻译”,结果AR1=。
就是说,我们在地址寄存器AR1中存储了一个指针,它指向,这是由MD100直接赋值的。
似乎,两段语句,只是赋值给AR1的结果不同而已,其实不然。