详解西门子间接寻址(1)
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存储区数据所实现的功能:本例程可以实现对区任意字节数据的访问。
西门子PLC的寻址方式
按位寻址:首先有一个存储器标识符用来区分当前使用PLC哪一种类型软元件,往下一位代表具体用的是哪个字节,一个字节有8个位,最后一位数字表示具体的哪个位,举例说明,I0.0首先I代表是用的PLC I 存储区,0代表是0字节,再往下的0代表的就是0字节具体第0个位;一个字节8个位,最大的位数就是0.7,没有0.8和0.9,下一个字节就是从1.0开始。
接下来再看一下按字节,字,双字寻址:如下图所示:学会按位寻址以后,对于按字节、按字以及双字寻址都是一样,首先:一个字节其实就是8个位,一个字就是16个位,一个双字就是32个位,可以理解为谁包含了谁;再看格式书写,第一位是存储器的标识符,第二位变为寻址方式的标识符,如B代表是按字节寻址,W代表的是按字寻址,D代表的是按双字寻址,最后一位代表的就是字节起始地址;举例说明VD0,V代表当前用的是PLC的V存储器,D代表的是按双字寻址,最后一位0代表被占用的起始字节,双字包含32个位,它共占用了从VB0开始到VB3这四个存储字节。
假设写的是VD1,那么它占用的起始字节就是从1开始,一共占用了VB1 VB2 VB3 VB4四个存储区。
1、四者的寻址方式不同,V0.0是按位寻址,VB0是按字节寻址,VW0是按字寻址,VD0是按双字寻址。
其中VD0由VBO、VB1、VB2、VB3组成,它包括VWO、VBO、V0.0;而VW0由VB0和VB1组成,它包括了VB0和V0.0;而VB0由VB0.0~VB0.7这八个位组成,它包括V0.0。
建议您把西门子的200基础知识好好看看,这些都是很有用的2、四者的寻址方式不同,V0.0是按位寻址,VB0是按字节寻址,VW0是按字寻址,VD0是按双字寻址。
VD0由VBO、VB1、VB2、VB3组成,它包括VWO、VBO、V0.0;VW0由VB0和VB1组成,它包括了VB0和V0.0;VB0由VB0.0~VB0.7这八个位组成,它包括V0.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章 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 间接寻址
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个字节元素的数组,设置各数组元素的初始值。
西门子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中。
存储器间接寻址简称间接寻址。
该寻址方式在指令中以存储器的形式给出操作数所在存储器单元的地址,也就是说该存储器的内容是操作数所在存储器单元的地址。
该存储器一般称为地址指针,在指令中需写在方括号“[]”内。
西门子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的间接寻址功能学的一知半解,不知道为什么要用间接寻址,用直接寻址不是也可以吗,干嘛非要搞得那么复杂拐那么多弯搞个间接寻址,我知道它的存在肯定有它的优点,还请用过的多指点指点.
最佳答案
间接寻址有什么好处?
简单地讲,比如不同地址执行同一程序用间接寻址最简单。
通过一实例来说明,例如:
将PIW128-PIW137,共100个字送入DB10中:
如果用直接寻址,一取一送两个指令要重复100遍。
如用变址:
在OB1:
OPNDB10//打开DB10
LP#128.0//初始读指针
LAR1
LP#0.0//初始写指针
LAR2
L100//1100个字的循环计数为初值
M001:TMB10//计数值送入MB10
LPIW[AR1,P#0.0]//按读指针指示的地址读数据
TDBW[AR2,P#0.0]//按写指针指示的地址写数据
+AR1P#2.0//读指针指向下一数据地址
+AR2P#2.0//写指针指向下一数据地址
LMB10//取循环计数值
LOOPM001//循环计数值如为0则结束循环;如不为0减1后则转向标号为M001的语句,继续循环。
这是一个简单实例,如果不同地址执行同一程序,这个程序是一复杂的过程则更能显示应用变址的好处·。
西门子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-1200FieldRead 和 FieldWrite 间接寻址指令
FieldRead 和 FieldWrite 间接寻址指令从STEP7 Basic V10.5 + SP2以上可以使用 FieldRead 和 FieldWrite指令对数组单元进行间接寻址.指令的调用:STEP7 Basic V10.5 + SP2版本软件在指令树里无法直接找到 FieldRead 和 FieldWrite指令,调用这两个指令必须先从工具栏中调用一个空指令块,双击问号,从下拉菜单中选择添加指令,操作步骤如图1.图1. 调用 FieldRead 和FieldWrite 指令从TIA V11起 FieldRead 和 FieldWrite指令就可以在指令树里直接找到了。
创建DB块,并建立 Array 数据类型的变量图2. 创建DB块并定义数组FieldRead 指令INDEX:要读取的数组的单元号MEMBER: 数组单元首地址VALUE:存储读出的数据下例中是读取数组单元[1]中的数据11,并保存在参数VALUE: MB110 中。
图3. 读取数组单元中的数据FieldWrite 指令INDEX: 要写入的数组的单元号VALUE: 要写入的数据MEMBER:数组单元首地址下例中是向数组单元[2]中写入数值5。
图4. 向数组单元中写入数据常见问题为什么软件里无法找到FieldRead 和 FieldWrite 指令?答:只有 STEP7 Basic V10.5 + SP2 以上的版本才支持 FieldRead 和FieldWrite指令,并且指令树里也无法找到,只能通过调用空指令块,并在下拉菜单里选择使用这两个指令。
FieldRead 和FieldWrite指令是否可以对其它数据区或数据类型实现间接寻址?答:FieldRead 和FieldWrite指令只能对DB块中的数组单元进行间接寻址访问,DB 块中的其它数据类型以及其它数据区如M, I,Q 区数据都不支持这个功能。
为什么FieldRead 和 FieldWrite指令的参数显示红色不正确?答:必须保证参数"MEMBER" 和 "VALUE" 的数据类型一致,如果一个是字节,一个是实数,就会显示红色不正确的提示,如图5.图5. 参数的正确设置。
西门子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中。
存储器间接寻址简称间接寻址。
该寻址方式在指令中以存储器的形式给出操作数所在存储器单元的地址,也就是说该存储器的内容是操作数所在存储器单元的地址。
该存储器一般称为地址指针,在指令中需写在方括号“[]”内。
(完整版)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间接寻址及地址寄存器指令1
装载数据字节1 装载数据字2(字节2/3) 装载数字5 传递到字4 装载ASCII字符A 装载数据字节28 比较
A DBX 0.0
从0字节的第0位开始扫描
L DB19.DBW4 从DB 19中装载数据字4
L “Values”.Number_1
符号访问变量
Number_1. DB19 具有变量名“Values”
215
20 22 20
未定义
字节地址(无符号整数) 位地址
装载32位指针常量(内部区域): L P#25.3 (P = 指针,字节地址= 25,位地址:3)
AUTOMATE Technology (Shanghai) Co., Ltd.© 2014
掌握好变量结构,可以优化程序结构。
AUTOMATE Technology (Shanghai) Co., Ltd.© 2014
AUTOMATE Technology (Shanghai) Co., Ltd.© 2014
地址
I Q PIB PQB M T C DBX DIX L
变量直接寻址
存储单元位置 (示例附)加访问宽度 含义
37.4
字节,字,双字
输入
27.7
字节,字,双字
输出
655
字节,字,双字
外设输入
653
字节,字,双字
本地数据堆栈
AUTOMATE Technology (Shanghai) Co., Ltd.© 2014
DB中地址标识符直接寻址
打开的数据块
在数据块中装载和传递
OPN DB 19 OPN "Values" OPN DI 20
组合指令 (包含OPN D DB..)
- 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 位。
由此,我们得出,一个切实的地点构成应当是:〖储存区符〗〖储存区尺寸符〗〖尺寸数值〗 .〖位数值〗,比如:。
DBX200.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#35BX[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||TMD2操作主体程序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#COUNTER_DOPN DB100L DBW [MD 102]T MW [MD 102]L 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 100L9 //循环次数 =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 进行地区寻址“翻译”。