PLC中指针及间接寻址的应用
- 格式:docx
- 大小:15.43 KB
- 文档页数:4
PLC指针的应用场景1. 应用背景PLC(Programmable Logic Controller,可编程逻辑控制器)是一种专门用于工业自动化控制的计算机控制系统。
PLC控制器通过读取输入信号,经过逻辑运算和控制算法处理,再输出控制信号,实现对工业设备的自动化控制。
在PLC编程中,指针是一种重要的数据类型,用于存储和操作内存地址,具有灵活、高效的特点。
PLC指针的应用可以帮助工程师实现更加复杂和灵活的控制算法,提高自动化控制系统的性能和可靠性。
2. 应用过程PLC指针的应用过程可以分为以下几个步骤:步骤1:定义指针在PLC编程软件中,工程师可以通过声明和定义指针来创建一个指向特定数据类型的指针变量。
在定义指针时,需要指定指针的数据类型和初始值(即指向的内存地址)。
步骤2:赋值和操作指针工程师可以通过赋值操作将一个指针变量指向特定的内存地址。
通过指针的操作,可以读取和修改该内存地址上存储的数据。
指针的操作包括以下几个常用的操作:•读取指针所指向的内存地址上的数据:通过指针变量加上解引用运算符(*)可以读取指针所指向的内存地址上存储的数据。
•修改指针所指向的内存地址上的数据:通过指针变量加上解引用运算符(*)可以修改指针所指向的内存地址上存储的数据。
•移动指针:通过指针的加减运算可以移动指针指向的内存地址,实现对连续内存空间的读写操作。
步骤3:应用控制算法通过使用指针,工程师可以实现更加复杂和灵活的控制算法。
指针可以用于访问和操作不同的数据类型,包括整型、浮点型、结构体等。
通过指针的运算和操作,可以实现对多个变量的批量处理,提高控制算法的效率和可靠性。
步骤4:调试和优化在应用过程中,工程师需要对PLC程序进行调试和优化。
通过使用指针,工程师可以方便地监测和修改内存地址上的数据,帮助排查程序中的错误和问题。
指针的应用还可以提高程序的运行效率和资源利用率,从而优化控制系统的性能。
3. 应用效果PLC指针的应用可以带来以下几个效果:提高控制算法的灵活性和复杂性通过使用指针,工程师可以实现更加复杂和灵活的控制算法。
S7-200cpu允许使用指针对下述存储区进行间接寻址:I, Q, V, M, S, T和C。
但不能对独立的位或模拟量进行间接寻址。
指针为双字值,用来存放另一个存储器的地址,只能用V, L或累加器AC1,AC2和AC3作指针。
为了生成指针,必须用双字传送指令(MOVD)将某个位置的地址移入另一个位置或累加器作为指针。
MOVD &VB200,AC1MOVW *AC1,AC0对指令的操作数的指定方式,我将其理解为“寻址”。
在程序中绝大部分的指令都带有操作数,所谓的操作数,是执行这一指令时被这一指令加以操作、处理的数值。
对指令的操作数的指令方式大致的总结一下,可以概括为如下几个类型: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。
plc指针的用法
1. 嘿,你知道吗?plc 指针就像是一把神奇的钥匙!比如说,在复杂的工业控制过程中,就像是在一个巨大的机器城堡里,指针可以精准地找到我们需要控制的那个部分,多厉害啊!
2. 哇塞,想想 plc 指针的用法,那可真是太有趣啦!就好像是你在一个混乱的仓库里,指针能一下子就带你找到特定的物品,比如准确控制某个电机的运转,这不是很神奇吗?
3. 哎呀,plc 指针的作用可不容小觑啊!它就如同在茫茫大海中为我们指明方向的灯塔。
比如在自动化生产线上,指针可以引导程序准确执行下一步操作,是不是超牛的?
4. plc 指针啊,简直就是一个超级小能手!好比在一场精彩的魔术表演中,它能神奇地实现各种变化。
像在一个大型设备的控制中,用指针轻松切换不同的工作模式,太妙啦!
5. 嘿呀,别小看了 plc 指针的用法哦!这简直就像一个隐藏的高手在幕后默默发挥作用。
比如在复杂的工艺流程中,指针悄悄就完成了关键步骤的控制,很神奇对吧?
6. 哇哦,plc 指针真的是太有意思啦!就好像是游戏里的秘密武器。
比如在一个智能控制系统中,凭借指针能迅速定位并解决问题,这多厉害呀!我觉得 plc 指针的用法真的特别重要,能让工业控制变得高效又精准呢!。
236 •电子技术与软件工程 Electronic Technology & Software Engineering程序设计• Program Design【关键词】PLC 400 寻址方式 粒料除尘装置本次项目使用的是西门子PLC 400系统,对塑料生产过程中的粒料除尘单元进行实时的控制和监测,由于除尘线较多且每条除尘线装置和设备基本相同,除尘过程控制基本一致。
如果采用传统的梯形图进行编程则程序步骤冗长且需定义的符号较多,调试过程中容易出错且后期维护需花费较多的时间,于是此次我们采用PLC 寻址方式中的地址寄存器寻址方式,对不同除尘线中的相同装置进行实际的操作和状态的监测。
1 系统硬件组成PLC 采用的是西门子412冗余CPU ,进行数据的存储,处理,计算;两个本地ET200M 控制站,分别装有数字量,模拟量模块,对现场仪表信号进行转换及采集。
CPU 和控制站通过PROFIBUS-DP 方式进行冗余通讯。
编程应用的是西门子STEP7 V5.5标准组态软件。
现场设备包括下料仓的模拟量调节阀和变频电机等。
2 PLC的软件编程2.1 PLC的寻址方式在PLC 系统当中分为很多个地址区域,在程序中可以根据对应的地址直接读取存储的PLC 编程应用中的寻址方式文/王一村数据,表1中列出了部分地址。
2.1.1 直接寻址直接寻址包括绝对地址和符号地址两种类型。
在PLC 程序当中我们可以直接使用输入(输出)信号,位存储器,数据块等地址。
在程序中直接调用这些存储区域的绝对地址是可以的,但是容易出错并且不太直观,如果我们给每个地址都命名一个符号(类似于起名字),这样程序看起来易读易懂。
(1)绝对地址:绝对地址是由存储器位置和一个地址标识符组成。
例如:I0.1,Q1.1,DB2.DBB0等。
(2)符号寻址:给每一个绝对地址自定义一个符号(助记符)使编程过程明了且容易查找。
在STEP7当中如果准备用符号访问结构,数组,数据块,逻辑块等,则必须给这些绝对地址分配一个自定义的符号名。
欧姆龙PLC间接寻址的灵活应用在PLC控制系统中,需要经常对连续多个数据进行某项操作,比如产生一系统数据或者一系统数据执行连续运算或比较以及按时间来对数据进行存储等。
在小型PLC中无变址寄存器情况下,以间接寻址的方法将大大减少程序开销的容量,以及提高程序的可读性。
现以欧姆龙PLC来实现以上四项操作,其它系列PLC类似。
(因在执行平方根与除法运算的例程稍显复杂,故只有此例增加地址注释,其它程序段较小,故没有增加注释)。
一:对PLC连续D区产生一组连续的数据。
图1:对D1000开始的地址连续存储1-100的数据程序剖析:先初始化要应用的间接寻址寄存器D600,再选择需要产生的连续数据个数,本例使用FOR指令来连续循环执行操作,使用++B从而产生源数据,再使用MOV指令,将产生的源数据送至D600中指定的地址中去,注意*D600前的*号,同时间接寻址地址D600执行++B操作,为下一个循环指明直接地址作准备。
当循环指定次数&100到达后,将自动跳出FOR循环,将执行NEXT之后的程序。
当下次扫描周期到达时,程序将又从初始化间接寻址开始执行。
图2:监视PLC内的D1000开始地址内的数据数据剖析:进入PLC中的D区值进行监视D1000开始地址中,将会发现D1000至D1099分别存储为1-100的数据。
如果需要修改初始值时,可以在初始化时将D601输入相应的值即可,当然如果要产生200个数据,修改FOR后的数据由&100修改为&200即可。
二:对连续通道的数据执行算术运算(寻找执行平方根后为整数的数及寻找被指定数整除的数)。
图3:D5000存储来自于D1000执行的平方根后为整数的数,D4000存储来自于D1000内被3整除的数程序剖析:平方根ROOT指令源数据为32位,然而本次的源数据却是16位数据,同时因ROOT指令对平方根的余数不进行保留,故无法直接得到小数部分,也即无法精准得出执行平方根后是否为整数,故需将底16位置0(间接地将数据乘以#10000),即每次在执行ROOT之前需将底16位使用"MOV #0 *D606"来清零,同时使用MOVD指令来提取出D608中的底8位即就是执行平方根后的小数部分值,当D608为零时表示执行平方根操作后无小数产生,即将源地址中的数据送至新目标地址中去,这样就实现了寻找指定区域内整数平方根的数据。
90%的工程师,对PLC指针类型与间接寻址无从下手在西门子S7-300和S7-400的编程中经常需要调用一些系统功能或功能块,在输入参数时经常碰到有指针类型的参数,那么你对指针类型了解吗?我第一次接触指针一词是在学习C语言的时候,指针和链表是C语言中的一个重点难点。
在C语言中,指针即存储器地址,在西门子PLC中的指针也是指地址。
下面看看西门子POINTER类型的结构:参数类型POINTER存储下列信息:•DB编号(或0,如果数据没有存储在DB中)•CPU中的存储区域(下表给出了参数类型POINTER存储器区的十六进制代码)数据的地址(格式为字节.位)STEP 7提供指针格式:p#memory_area byte.bit_address. (如果形式参数被声明为参数类型POINTER,只需要指出存储区域和地址。
STEP 7将自动地重定输入指针的格式。
) 下面的实例说明如何为以M50.0开始的数据输入参数类型POINTER:P#M50.0存储器间接寻址:使用存储器间接寻址的程序语句包含一条指令,后面跟有[地址]标识符,最后是一个(地址必须括在方括号内)。
根据所用的地址标识符,该指令会将存储于指定地址的数据解释为字或双字指针。
完整的数据地址由地址标识符和指针构成,如下例所示。
间接寻址的优点是能在程序执行期间动态修改指令的数据地址。
存储器间接寻址使用以下两部分地址:1. 地址标识符对于由位逻辑运算寻址的位,可分配地址标识符I、Q、M、L、DIX或DBX。
对于由装载指令寻址的字节、字和双字,可使用存储区I、Q、M、L、D和PI,分配IB、IW、ID、DBB、DBW、DBD、DIB、DIW、DID、PIB、PIW、PID等形式的地址标识符。
对于由传送指令寻址的字节、字和双字,可使用存储区I、Q、M、L、DB、DI和PQ,分配IB、IW、ID、DBB、DBW、DBD、DIB、DIW、DID、PQB、PQW、PQD等形式的地址标识符。
plc寻址,在编什么程序时会用到?怎么更好地理解它?你这个问题问的不够严谨。
说一点我个人关于寻址的看法吧,PLC中的寻址应该说可以分为直接寻址和间接寻址。
直接寻址就是对最长见的变量存储区中的位,字节,字等变量的直接读取和引用,此时这个地址是一个非常明确准确的地址。
而间接寻址,就像是一个存储空间中装着一个指示牌,这个指示牌是指向CPU知道的一个明确准确的地址的,或者说指示牌是指向一个直接寻址时候的地址的。
说起来是有点绕的,还是看一个图片吧:这个图片是西门子200PLC编程时候,使用到直接寻址和间接寻址的情况,西门子300PLC中间接寻址还存在16位/32位存储器的间接寻址以及64位指针的寻址,更加不好说清楚,所以这里还是以西门子200的来说,说起来比较简单一点!这个图片中把MB0的内容传送到VB0,这MB0和VB0都是PLC 中具体的存储区域,对这些预设的存储区域地址的直接读写,就可以称为直接寻址!而&MB0其实就相当于创建了一个间接寻址用的指针,并且把这个指针装在VD4中,这样VD4中的内容不是MB0中的值,而是MB0在CPU寻址时候的机器码地址,监控的时候是一串16进制的数据,我之前写过一些关于西门子200指针的文章和问答,有兴趣可以去看一下。
VD4中不是装着MB0中的值,而是装着一个指向某个地址的指针,如果想知道指针指向的地址中的值到底是多少,那么就可以用*VD4去把MB0中的值给取出来。
--这两段话就是间接寻址的大概意思了,间接寻址就引入一个指针的概念,存放的是指针指向的地址而非内容!以上简单的说了直接寻址和间接寻址的不同,那么引入间接寻址在什么时候会用到呢?也简单的说一下,间接寻址其实主要是利用了指针,如果程序中想办法将指针的值+1,那么指向的地址也就自动增加了,这样如果和循环指令配合使用,循环多少次就可以将一段连续的地址通过指针的变化,而将对应的地址全部快速的读取出来。
--这应该是使用指针的一个最明显且常用的优点。
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 .其中,我们又把〖存储区符〗〖存储区尺寸符〗这两个部分合称为:地址标识符。
这样,一个确切的地址组成,又可以写成:地址标识符 + 确切的数值单【间接寻址的概念】寻址,就是指定指令要进行操作的地址。
给定指令操作的地址方法,就是寻址方法。
在谈间接寻址之前,我们简单的了解一下直接寻址。
所谓直接寻址,简单的说,就是直接给出指令的确切操作数,象上面所说的,A Q2.0,就是直接寻址,对于A这个指令来说,Q2.0就是它要进行操作的地址。
这样看来,间接寻址就是间接的给出指令的确切操作数。
对,就是这个概念。
比如:A Q[MD100] ,A T[DBW100]。
程序语句中用方刮号 [ ] 标明的内容,间接的指明了指令要进行的地址,这两个语句中的MD100和DBW100称为指针Pointer,它指向它们其中包含的数值,才是指令真正要执行的地址区域的确切位置。
间接由此得名。
西门子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-200cpu允许使用指针对下述存储区进行间接寻址:I, Q, V, M, S, T和C。
但不能对独立的位或模拟量进行间接寻址。
指针为双字值,用来存放另一个存储器的地址,只能用V, L或累加器AC1,AC2和AC3作指针。
为了生成指针,必须用双字传送指令(MOVD)将某个位置的地址移入另一个位置或累加器作为指针。
MOVD &VB200,AC1
MOVW *AC1,AC0
对指令的操作数的指定方式,我将其理解为“寻址”。
在程序中绝大部分的指令都带有操作数,所谓的操作数,是执行这一指令时被这一指令加以操作、处理的数值。
对指令的操作数的指令方式大致的总结一下,可以概括为如下几个类型:1:指令的操作数为“立即数”,(如:15、16#F、2#1111等、、、、、、)。
LD M0.0
MOVW +255, VW0
+I +45, VW0
这是一条加法指令,被加数为:255、加数为45执行这条指令后计算出来的“和”存放在VW0这一存储器内。
LD M0.0
MOVB 15, VB0
这是一条传指令,译为:将15传送至存储器VB0内。
2:指令的操作数没有直接的给出,而是给出它所在的地址。
LD M0.0
MOVW VW0, VW4
-I VW2, VW4
这是一条减法指令,译为:将存储器VW0内的数值减去存储器VW2内的数值,将“差”存放在存储器VW4内。
3:指令的操作数没有直接的给出,而是给出它所在的地址的“地址”,在S7-200中,将这种寻址方式称之为“指针寻址”。
下面,我们一起来学习一下关于指针的使用方法:
在使用指针进行间接寻址的过程中,会涉及到的两个符号:
&:建立指针(进行间接访问的区域)
*:读取指针(读取指针间接指定的地址)
下面是使用指针的一般步骤:
1:建立指针
建立指针需要使用双字传送指令,如下所示:
LD M0.0
MOVD &MB0, VD10
译为:在VD10建立指针,指针指向被间接访问的首地址MB0。
在建立指针时需要注意如下几个问题:
①可以进行间接访问的区域,包括如下几个区域:I、Q、M、S、V、T(当前值)、C(当前
值)。
在S7-200中位状态是不能进行间接指定的,所以这里特别强调只是访问定时器及计数器的当前值,而不是其位状态。
②可以作为建立指针的区域,包括如下几个区域:V、L、及累加器AC1至AC3。
且只能是双字(32bit)类型的地址。
③在建立指针时在存储器前加“&”这个符号的表示进行间接访问的区域的首地址,所以除定时器T及计数器C外都必须是以字节的形式出现的。
2:读取指针
在读取指针时,有如下几种不同的情况出现:
①以字节的形式读取指针:
LD M0.0
MOVD &MB0, VD10
MOVB *VD10, VB30
译为:在VD10建立指针,指针指向以MB0为首地址的地址,读取在指针VD10所指向的首地址开始的一个字节(即以MB0开始的一个字节,很明显就是MB0本身),所以,读取指针时将MB0放到VB30。
②以字的形式读取指针:
LD M0.0
MOVD &MB0, VD10
MOVW *VD10, MW20
译为:在VD10建立指针,指针指向以MB0为首的地址,读取在指针VD10所指向的首地址开始的一个字(即以MB0开始的一个字,很明显就是MW0),所以,读取指针时将MW0放到MW20。
③以双字的形式读取指针:
LD M0.0
MOVD &VB0, VD10
MOVD *VD10, VD40
译为:在VD10建立指针,指针指向以VB0为首的地址,读取在指针VD10所指向的首地址开始的一个双字(即以VB0开始的一个双字,很明显就是VD0),所以,读取指针时将VD0放到VD40。
3:修改指针
修改指针是在使用指针寻址中关健的一部分,修改指针是将指针指向的首地址进行适当的偏移,使之指向我们需要访问的地址,这样我们可以比较方便的使用在这一存储区的某一具体地址,使程序的灵活性有所增加。
修改指针的方法大致的可以概括为如下几种:
①使用加法或减法指令,对指针进行指定常数作为偏移量的修改指针。
②使用加“1”或减“1”指令,对指针进行1个单位(字节)的偏移。
下面将以实际情况为例来说明修改批指针的方法:
例1:
网络1:
LD M0.0
MOVD &VB0, VD10
MOVD *VD10, VD40
+D 4, VD10
网络2:
LD M0.1
MOVD *VD10, VD44
译为:在VD10建立指针,指针指向以VB0为首的地址,读取在指针VD10所指向的首地址开始的一个双字(即以VB0开始的一个双字,很明显就是VD0),所以,读取指针时将VD0放到VD40。
然后对指针进行修改,对其指定4个单位的偏移量,即指针此时指向的首地址为VB4。
在下一网络中又以双字的形式读取指针。
所以,此时读取指针是将以VB4为首的一个双字传送至VD44(即VD4传送至VD44)。
例2:
网络1:
LD M0.0
MOVD &VB0, VD10
MOVB *VD10, MB0
INCD VD10
网络2:
LD M0.1
MOVB *VD10, MB1
译为:在VD10建立指针,指针指向以VB0为首的地址,读取在指针VD10所指向的首地址开始的一个字节(即以VB0开始的一个字节,很明显就是VB0),所以,读取指针时将VB0放到MB0。
然后对指针进行修改,对其进行一个单位(字节)的偏移,即指针此时指向的首地址为VB1。
在下一网络中又以字节的形式读取指针。
所以,此时读取指针是将以VB1为首的一个字节传送至MB1(即VB1传送至MB1)。
在程序中,如果希望以连续的形式去间接访问地址(即:读取VB0后希望下一次读取的是VB1、读取VW0后希望下一次读取的是VW2、读取VD0后希望下一次读取的是VD4),修改指针时,需要注意以下问题:
①读取下一个字节:
网络1:
LD M0.0
MOVD &VB0, VD10
MOVB *VD10, VB100
+D 1, VD10
网络2:
LD M0.1
MOVB *VD10, VB100
第一次读指针时,读取的是VB0。
第二次读指针时,读取的是VB1。
②读取下一个字:
网络1:
LD M0.0
MOVD &VB0, VD10
MOVW *VD10, VW100
+D 2, VD10
网络2:
LD M0.1
MOVW *VD10, VW100
第一次读指针时,读取的是VW0。
第二次读指针时,读取的是VW2。
③读取下一个双字:
网络1:
LD M0.0
MOVD &VB0, VD10
MOVD *VD10, VD100
+D 4, VD10
网络2:
LD M0.1
MOVD *VD10, VD100
第一次读指针时,读取的是VD0。
第二次读指针时,读取的是VD4。
综上所述,在以连续方式读取指针时:
⑴读取下一个字节,修改指针时“加1”。
⑵读取下一个字,修改指针时“加2”。
⑶读取下一个双字,修改指针时“加4”。