西门子S7-1200 PLC的间接寻址功能及实例
- 格式:docx
- 大小:480.86 KB
- 文档页数:7
详解西门子PLC间接寻址工控帮详解西门子PLC间接寻址完整一条指令,应该包含指令符操作数(当然不包括那些单指令,比如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,它指向它们其中包含数值,才是指令真正要执行址区域确切位置。
间接由此名。
西门子间接寻址方式计有两大类型:存储器间接寻址和寄存器间接寻址。
西门子数据格式以及寻址,实例讲解清晰易懂,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。
寻址方式详解分类:寻址方式从大的方面可以分成直接寻址和间接寻址。
直接寻址就像甲要和乙说话直接叫乙的名字就可以了,甲直接和乙建立联。
间接寻址就像甲要和乙说话,而乙在另外一个城市,甲就写了一封信通过邮递员送给乙,甲通过邮递员间接和乙建立联系,这就叫间接寻址。
案例丨S7-1200PLC的HSC应用实例高速计数器寻址CPU 将每个高速计数器的测量值,存储在输入过程映像区内,数据类型为32 位双整型有符号数,用户可以在设备组态中修改这些存储地址,在程序中可直接访问这些地址,但由于过程映像区受扫描周期影响,读取到的值并不是当前时刻的实际值,在一个扫描周期内,此数值不会发生变化,但计数器中的实际值有可能会在一个周期内变化,用户无法读到此变化。
用户可通过读取外设地址的方式,读取到当前时刻的实际值。
以ID1000 为例,其外设地址为“ID1000:P”。
表1. 所示为高速计数器寻址列表。
表1.高速计数器寻址中断功能S7-1200 在高速计数器中提供了中断功能,用以处理某些特定条件下触发的程序共有3 种中断事件:1、当前值等于预置值2、使用外部信号复位3、带有外部方向控制时,计数方向发生改变频率测量S7-1200 除了提供计数功能外,还提供了频率测量功能,有 3 种不同的频率测量周期:1.0 秒,0.1 秒和0.01 秒。
频率测量周期是这样定义的:计算并返回新的频率值的时间间隔。
返回的频率值为上一个测量周期中所有测量值的平均,无论测量周期如何选择,测量出的频率值总是以Hz (每秒脉冲数)为单位。
高速计数器指令块高速计数器指令块,需要使用指定背景数据块用于存储参数,如图1所示。
图1.高速计数器指令块表2.高速计数器参数说明表3.STATUS 错误代码假设在旋转机械上有单相增量编码器作为反馈,接入到S7-1200 CPU,要求在计数25个脉冲时,计数器复位,置位M0.5,并设定新预置值为50个脉冲,当计满50个脉冲后复位M0.5,并将预置值再设为25,周而复始执行此功能。
针对此应用,选择CPU 1214C,高速计数器为:HSC1。
模式为:单相计数,内部方向控制,无外部复位。
据此,脉冲输入应接入I0.0,使用HSC1的预置值中断(CV=RV)功能实现此应用。
组态步骤先在设备与组态中,选择CPU,单击属性,激活高速计数器,并设置相关参数。
快速了解S7-1200 PLC存储区的寻址方式上一篇文章中给大家介绍了S7-1200 PLC的存储器地址包括输入I、输出Q、位存储器M、数据块DB,以及本地或临时存储器L。
那么这些存储器的大小是怎么进行表示的呢?这是这一篇文章中所要告诉大家的,其实每个存储器的大小都是以字节为单位进行表示的,存储器中的每一个存储单元都有一个唯一的地址,用户程序利用这些地址去访问存储单元的数据。
访问的寻址方式主要有按位寻址、按字节寻址、按字寻址和按双字寻址。
其实这跟S7-200/200 SMART PLC中的寻址方式是一样的,只不过我们S7-1200中存储器有DB块,对于DB块中的地址寻址格式是需要另外注意的,这也是我们学习的一个重点。
下面小编分别给大家介绍一下吧。
按位寻址按位寻址的格式是由存储器标识符、字节地址、分隔符、字节的位号这四个部分组成的,什么是存储器标识符?比如说上篇文章介绍的输入I、输出Q、位存储器M等,就是使用存储器的字母I/Q/M。
字节地址表示的是第几个字节,是直接用数字表示的。
分隔符是一个固定的小的黑点表示。
字节的位号表示的是要访问的字节中的哪个位。
因为一个字节是8个位,分别是0~7,所以字节的位号可以是0~7的任意一个数字。
比如M3.3,这是按位寻址的,访问的是M存储器的第3个字节中的bit3位(从第0个位/字节开始数起)。
按字节、字、双字寻址按字节、字和双字寻址的格式都是一样的,都是由存储器标识符、字节/字/双字的表示符B/W/D、字节的起始地址这三个部分组成的。
比如以输出过程映像存储器为例,如果将字节3的0~7位都描黑,描黑的色块代表访问的地址是QB3。
我们还可能会看到这样的地址:MW10、QW2、ID0等。
在CPU中我们能够访问的最小的地址是位,8个位可以组成1个字节,2个字节组成1个字,2个字可以组成1个双字。
比如说QB0包含了Q0.0~Q0.7这8个位,QW0包含了QB0和QB1这2个字节,其中QB0是高字节、QB1是低字节,QD0包含了QW0和QW2这2个字,也含了QB0、QB1、QB2、QB3这4个字节。
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个字节元素的数组,设置各数组元素的初始值。
西门子S7-1200的间接寻址功能(2)
前面介绍了读取和写入数组中元素值的指令Field Read和Field Write两条指令,同时给大家简单的分析了程序的设计思路。
接下来就使用Field Read来实现本功能,在程序的设计过程中可能还需要用到循环跳转指令。
例子说明:
假设需要从一组数据中找出一个最大值,并记录这个最大值是这组数据中的第几个数据。
第一步:
添加一个全局DB块,并在DB块中建立一个变量名为data_1#,数据类型为数组的变量,用于存储需要找出最大的数据,同时建立一些相应的变量,如下图所示。
第二步:
初始化相应的存储器并把存储最大值的存储器的值设置为最小值。
程序如下所示:
第三步:
编写判断数据的挨个比较是否完成,当执行的次数与设定的次数相等时,则表示完成,可以跳出最大值查找的程序,让程序跳转到最后执行。
程序如下所示:
第四步:
编写读取数组中元素的值,然后与存储最大值的存储器中的值做比较,用于判断数据存储器存储的值是否是最大值,若不是最大值进行数据交换,同时记录位置,然后INDEX的值加1,同时记录执行次数并与设定次数做比较,如未达到设定次数,则跳转换前面继续通过Field Read指令读取数据出来继续做比较。
程序仅供参考,希望对大家在以后使用此功能上时有所帮助。
S7-200SMART系列PLC的间接寻址功能在PLC中使用的寻址方式分为直接寻址和间接寻址两种方式,所谓的直接寻址,就是直接使用存储区或寄存器的元件名称和地址编号,根据这个地址去找到该数据,而间接寻址,不直接给处存储区或寄存器的地址,而是通过对地址的地址进行访问来实习对存储区的数据读取,通俗的来讲,这个地址的地址就是一个编号或一个代号,这好比读书时每同学会有一个学号,老师在点名的时候,可以叫名字,也可以叫学号,叫名字就好比直接寻址,叫学号就好比间接寻址。
不管是叫名字还是叫学号,其实对应的都是同一个人。
如下图所示:VB0:就好比一个人的名字,而地址的地址16#08000000就相当于学号。
CPU会为每一个存储区分配一个32位大小的数值作为存储器地址的地址。
所有不管是通过间接寻址的方式还是直接寻址的方式其实是访问同一个存储器或是寄存器。
不同的PLC有不同的寻址方式,这里给大家介绍下西门子系列PLC的间接寻址的方式。
这里先给大家介绍下西门子S7-200系列的PLC的间接寻址的过程。
在S7-200系列PLC中,可以用间接寻址访问的存储有:输入过程映像区(I)、输出过程映像区(Q)、位存储器(M)、全局变量存储区(V)、顺控状态继电器(S)以及定时器(T)和计数器(C)。
在S7-200系列PLC中间接寻址的使用主要分为三步骤:(1)建立指针使用间接寻址对某个存储单元读写时,首先需要建立地址指针,指针为双字的长度,可作为指针的存储区有全局变量存储区V,局部变量存储区L和累加器(AC1\AC2\AC3),建立指针时,必须使用双字的传送指令(MOVD),将存储区中所要访问单元的地址装入用来作为指针的存储器单元或寄存器中。
如前面图中所示,若需要提取VB0地址的地址出来,则需要在VB0前面加上符号“&”即&VB0,&VB0所表示的就不是VB0的值了,而是VB0地址的地址即16#08000000.如下图所示:VD100表示指针,用于存储VB0这个存储器地址的地址。
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个字节元素的数组,设置各数组元素的初始值。
S71200-1500指令说明和举例-寻址ARRAY元素寻址ARRAY元素
ARRAY元素的间接索引
编程建议:ARRAY元素的间接寻址
ARRAY访问的错误处理
在运⾏时访问超出所声明ARRAY限值的元素时,将导致访问错误。
不同CPU系
列对超出ARRAY限值的反应各不相同:
S7-300/400
o
CPU切换为“STOP”模式。
o
为此,可以编写程序执⾏错误OB(OB85)防⽌这⼀状况。
o
在SCL中,还可以启⽤块属性中的“检查ARRAY限值”(CheckARRAYlimits)属
性。
这将导致在发⽣ARRAY访问错误时将使能输出ENO设置为FALSE。
S7-1200
o
CPU将⽣成诊断缓冲条⽬,并保持为“RUN”模式。
S7-1500
o
CPU切换为“STOP”模式。
o
为此,可以编写程序错误OB(OB121)防⽌这⼀状况。
o
也可以通过指令“GET_ERROR:获取本地错误信息”或“GET_ERROR_ID:获
取本地错误ID”编写本地错误处理⽅式。
说明
通过ENO监视ARRAY访问错误
如果在指令执⾏过程中超出ARRAY的限值,则不会将使能输出ENO的信号状态
设置为FALSE。
唯⼀例外是S7-300/400系列CPU中属性设置为“检查ARRAY限
值”(CheckARRAYlimits)的SCL块。
-2-。
S7-1200PLC的HSC应⽤实例⾼速计数器寻址CPU 将每个⾼速计数器的测量值,存储在输⼊过程映像区内,数据类型为 32 位双整型有符号数,⽤户可以在设备组态中修改这些存储地址,在程序中可直接访问这些地址,但由于过程映像区受扫描周期影响,读取到的值并不是当前时刻的实际值,在⼀个扫描周期内,此数值不会发⽣变化,但计数器中的实际值有可能会在⼀个周期内变化,⽤户⽆法读到此变化。
⽤户可通过读取外设地址的⽅式,读取到当前时刻的实际值。
以 ID1000 为例,其外设地址为“ID1000:P”。
表1. 所⽰为⾼速计数器寻址列表。
表1.⾼速计数器寻址中断功能S7-1200 在⾼速计数器中提供了中断功能,⽤以处理某些特定条件下触发的程序共有 3 种中断事件:1、当前值等于预置值2、使⽤外部信号复位3、带有外部⽅向控制时,计数⽅向发⽣改变频率测量S7-1200 除了提供计数功能外,还提供了频率测量功能,有 3 种不同的频率测量周期:1.0 秒,0.1秒和0.01 秒。
频率测量周期是这样定义的:计算并返回新的频率值的时间间隔。
返回的频率值为上⼀个测量周期中所有测量值的平均,⽆论测量周期如何选择,测量出的频率值总是以 Hz (每秒脉冲数)为单位。
⾼速计数器指令块⾼速计数器指令块,需要使⽤指定背景数据块⽤于存储参数,如图1所⽰。
图1.⾼速计数器指令块表2.⾼速计数器参数说明表3.STATUS 错误代码应⽤举例假设在旋转机械上有单相增量编码器作为反馈,接⼊到S7-1200 CPU,要求在计数25个脉冲时,计数器复位,置位 M0.5,并设定新预置值为50个脉冲,当计满50个脉冲后复位M0.5,并将预置值再设为25,周⽽复始执⾏此功能。
针对此应⽤,选择CPU 1214C,⾼速计数器为:HSC1。
模式为:单相计数,内部⽅向控制,⽆外部复位。
据此,脉冲输⼊应接⼊I0.0,使⽤HSC1的预置值中断(CV=RV)功能实现此应⽤。
组态步骤先在设备与组态中,选择CPU,单击属性,激活⾼速计数器,并设置相关参数。
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 THEN
POKE_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的间接寻址离不开数组。
可用FieldRead与FieldWrite指令实现对数组元素的间接寻址,也可以用变量做数组元素的下标,实现间接寻址。
西门子S7-1200没有像S7-300的LOOP那样的循环程序专用的指令,可以模仿LOOP指令的功能来编写循环程序。
下图的程序段1、2是名为“间接索引”的FC,程序段1清累加结果,设置数组下标的初始值。
程序段2用MOVE指令读取可变下标的数组元素值,用ADD指令累加。
然后将下标加1,累加个数减1后如果大于0则返回标号Back处,反之结束循环。
图下面是OB1中调用FC的程序。
西门子S7-1200 PLC的间接寻址功能(3)
纯电动
百家号17-12-2017:58
在前面介绍了使用梯形图的方式来编写一个取最大值的程序,但在S7-1200PLC 中,还支持SCL的编程,使用SCL的编程对一些复杂的数据处理会带来很大的方便,下面还是以前面的例子为例说明使用SCL如何编写程序实现。
例子说明:
假设需要从一组数据中找出一个最大值,并记录这个最大值是这组数据中的第几个数据。
使用SCL编程来完成这个例子,这里我们需要用到两个语句
(1)用于条件判断的语句
IF (条件)THEN (执行语句)
END_IF;
解析:如果条件满足,则执行THEN后面的语句。
举例:IF “DATA_A”
“DATA_A”:= “DATA_A”+1;
END_IF;
如果DATA_A的值小于100,则DATA_A的值等于自身加1.
(2)用于循环执行的语句
FOR (执行变量):= (起始值)TO (结束值)BY(自增量)DO (后面需要执行的语句);
END_FOR;
解析:从“起始值”开始循环到执行,每循环一次,“执行变量”的值会根据“自增量”的多少进行变化,直到执行到“结束值”时,停止循环执行。
举例:FOR “count”: = 0 TO 4 BY 1 DO
“Data[count]”=10;
END_FOR;
把数值10填入到数值Data中的Data[0]到Data[4]的五个元素中,第一次循环时把10填入到Data[0],第二次循环时把10填入到Data[1],依次下去。
了解这两条语句后,接下来我们可以设计一个程序,这里我们可以把他建立为一个功能块(FB),方便以后使用。
第一步:
添加一个全局DB块,在全局DB块中建立一个变量名为Data的数组,元素个数可以视情况进行设置。
如下图所示,元素个数设置为5个。
第二步:
添加一个FB块,同时把编程语言选择为SCL的编程语言。
然后在FB的接口去中分别去定义相应的变量,如下图所示:
第三步:
用SCL语言编写功能块程序,如下所示
第四步:
在OB1中调用该功能块,由于使用的是FB,因此在调用时需要分配相应的背景DB,如下图所示:
寄语:程序仅供参考,一个简单的小例子,抛砖引玉,希望大家能够使用SCL 可以编写出更复杂的一些功能块出来。