PLC的各种变量怎样使用?
我最早接触“静态变量”的概念是在计算机C语言的编程中,清楚的记得它需要用"static"关键字来声明。静态变量(Static Variable)其实也是一种变量(Variable),因此在介绍静态变量(Static Variable)之前,我们先来介绍下在计算机和PLC的编程中“变量(Variable) ”的概念。
1 什么是变量
所谓“变量 ”,是在程序的运行过程中,其值可以根据某些条件而发生变化的量。与“变量”相对的是“常量(Constant) ”,顾名思义,常量的值在整个程序的运行中保持不变。
变量的名字称为“变量名”,变量名通常是一个助记符,用来表示一个物理地址。在这个地址上存放着变量的值。
变量有两个特性:作用域和生命周期。
2 全局变量与局部变量
变量的作用域是指变量的作用范围,也就是在哪些范围内该变量是有效的。根据作用域的不同,变量可以分为全局变量(Global Variable)和局部变量(Local Variable)。
全局变量在整个程序范围内都有效。
在C语言中,全局变量是在函数外部声明的变量。比如下面C语言代码中的“a”和“x”都是全局变量:
注:由于C语言从上而下执行,全局变量x并不能在函数func1中访问。
在西门子S7系列PLC的编程中,那些存放在公共存储区的变量都属于全局变量。公共存储区包括输入缓存区(I)、输出缓存区(Q)、位存储区(M)、全局数据块(Global DB)、定时器(T)、计数器(C)等等。比如,位存储区的M0.0,你可以在主程序(OB)或子程序(FB、FC)中访问它,它是全局的。
局部变量(Local Variable)是只能在某个子程序(FB或FC)中访问的变量。
也就是说,局部变量是私有的,子程序(FB或FC)只能访问其自身内部定义的变量,而不能访问其它子程序内部定义的变量。
从生命周期来看,全局变量的生命周期是整个程序的运行周期。也就是说,只要PLC还运行用户程序,全局变量就一直有效。
而局部变量的生命周期则取决于其存放的位置。
2 临时变量与静态变量
对于S7系列PLC而言,局部变量有两个存放的位置:临时变量存储区 (堆栈)和背景数据块 (Instance DB)。
临时变量存储区(堆栈),也称为局部变量存储区(Local Memory),用来存放FB或FC在运行过程中的临时变量 。
在S7系列PLC中,FB、FC或者OB都被称为“程序组织单元(POU,program organizational unit)”。PLC为每个POU分配一定数量的临时变量存储区,在S7-300/400 PLC中,这个区域的大小为256字节;在S7-200 Smart PLC中,这个区域的大小为64字节。
临时变量存储区中的变量称为“临时变量 ”,它们只在当前POU运行时有效。当POU运行结束后,该变量将被释放(无法保存)。
注:当POU由于中断而被挂起时,其临时变量会被保存,以便下次中断现场恢复后继续执行。
如果想保存程序运行的中间值怎么办呢?答案是使用静态变量(Static Variable)。
在博途(TIA Portal)环境或Step7开发环境中,功能块(FB)接口有“Static(STAT)”一项。所有在“STAT”栏内定义的变量都将会被存放到背景数据块中。在FB运行结束后,“STAT”中定义的变量不会被释放。这种变量称为“静态变量 ”。如下图中的变量“STAT_test1”和“STAT_test2”:
注:FB中的IN、OUT参数也会保存到背景数据块中。背景数据块中的数据只能被拥有它的功能块(FB)访问。
说到这里,你应该明白了吧?静态变量从作用域上分属于局部变量;从生命周期上来看,它与用户程序的生命周期相同。临时变量也属于局部变量,不过其生命周期短,仅在POU运行的过程中有效。
西门子 S7-1200PLC编程 数组的使用方法
关注“ 技成微课堂 ”,一起涨知识~
私信回复:64,领64本西门子电子书!
使用数组数据类型注意事项
ARRAY类型是由数目固定且数据类型相同的元素组成的数据结构。ARRAY类型的定义和使用需要注意以下几点:
ARRAY类型可以在DB、OB/FC/FB接口区、PLC数据类型处定义;无法在PLC变量表中定义。数组定义:Array[维度1下限..维度1上限,维度2下限..维度2上限,...]of <数据类型>,最多可包含 6 个维度;数组元素的数据类型包括:除数组类型、Variant类型以外的所有类型;数组下标的数据类型为整数,下限值必须小于或等于上限值,上下限的限值在S7-1200 V3.0及其以前为Int范围(-32768~+32767),在S7-1200 V4.0及其以后前为DInt范围(-2147483648 ~+21474836487),可以使用局部常量或全局常量定义上下限值,数组的元素个数受DB块剩余空间大小以及单个元素大小的限制;从S7-1200 V2.0开始,下标可以不仅仅是常数、常量,也可以是变量,还可以是混合使用(多维数组),如果编程语言是SCL的话,下标还可以是表达式。使用数组的变量下标,可以在程序中很容易地实现间接寻址。注意,下标变量必须是符号名,不能是DB1.DBW0这种没有对应符号名的绝对地址。从S7-1200 V4.2开始,FC的Input/Output/InOut以及FB的InOut可以定义形如Array[*]这种变长数组,要求必须是优化FC/FB块,在调用FC/FB的实参中可以填写任意数据类型相同的数组变量;当然,也可以多维变长的数组,例如Array[*,*]of Int。数组可以使用单个数组元素例如"DB1".Static_1[1],也可以使用整个数组例如"DB1".Static_1。多维数组可以降维使用,例如三维数组:3D[0..2,0..3,0..4]of Int是一个3×4×5大小的Int数组,3D[0]是一个4×5大小的二维Int数组,3D[0,1]是一个5个元素的一维Int数组,当然多维数组下标也可以换成变量,例如3D[Tag_1,1]这种;S7-1200 V4.2开始,多重背景支持数组形式,即Array of FB,这样可以在FB中使用循环指令更方便的编写程序。不支持Array[*] of FB。在TIA 博途 V10.5 SP2,S7-1200 V1.0的时候,曾经引入FieldRead 和 FieldWrite 指令,用于数组下标的变址寻址,这种方法在TIA 博途 V11之后可以由下标变量完全取代,并且更为简化,所以该指令也只是位于“移动操作>原有”中,用于早期版本向上移植时使用,它的使用方法参见FieldRead 和 FieldWrite 间接寻址。数组的基本使用方法
一. DB中创建,如图1所示:
图1 Array在DB中的创建
二. FC的InOut中创建,如图2所示:
图2 Array在FC形参中的创建
三. 数组作为实参,如图3所示:
图3 Array作为FC的实参
四. FC程序中使用数组元素,使用形参,如图4所示:
图4 FC程序中使用形参
五. FC程序中使用数组元素,下标为变址寻址,使用形参, 如实现以下功能,将0-7这8个数,送入数组下标为0-7的8个元素,如图5-7所示:
(1)FC形参设置,如图5所示:
图5 FC形参设置
(2)程序编制,如图6所示:
图6 程序详情
(3)SCL的版本,如图7所示:
图7 SCL版本的程序
六. 在程序中直接使用数组元素,如图8所示:
图8 程序中直接使用数组元素
七. 在程序中直接使用数组元素,下标为变址寻址, 如实现以下功能,将0-7这8个数,送入数组下标为0-7的8个元素,如图9-11所示:
(1)数据块定义,如图9所示:
图9 DB1的定义
(2)程序编制,如图10所示:
图10 程序详情
(3)SCL的版本,如图11所示:
图11 SCL版本程序
Array【*】使用实例
实现以下功能:使用FC的Input定义数组Array[*] of Int,求变长数组元素的总和,可以按照以下步骤来完成。
一. 使用Array[*] ,必须使用如图12所示的指令,计算数组元素的上下限,从而得出元素个数:
图12 指令位置
二. 定义变量,如图13所示。赋初始值,计算上下限,如图14所示:
图13 定义形参
三、计算上下限程序,如图14所示:
(1)输入Array[*]类型的变量
(2)所求上下限的维数
(3)该维数下的下限/上限,DINT类型
图14 计算上下限
四. 求和程序,如图15所示:
图15 求和的程序
五. SCL的版本,如图16所示:
图16 SCL版本程序
六. OB1中调用实参为不同数组元素个数的数组,如图17所示:
图17 OB1调用程序
Array of FB的使用实例
实现以下功能:FB3多次调用FB4,在FB3内部循环调用,减少程序量。FB4的两个Input:Start,Stop,一个InOut:Run,建立Array[0..7] of FB4。同时建立变量 Array[0..7] of Struct,作为对应FB4的输入和输出,如图18所示:
图18 程序详情
版权声明:文章转自网络,版权归原作者所有。如有侵权,请联系我们删除!
私信回复:64,领64本西门子电子书!
相关问答
plc系统常量中哪个是自身硬件标识符?
非唯一硬件标识符代表激活时您的计算机的配置。硬件标识符不包括任何可标识的个人信息、计算机中所安装的其他软件或数据的任何信息,或有关计算机的具体种类或...
如何理解PLC编程中变量的概念,变量的由来和意义,以及如何使用?
如何理解PLC编程中变量的概念,变量的由来和意义,以及如何使用。首先PLC中的变量指的是内置的输入输出继电器、辅助继电器、状态、计数器、数据寄存器等各种软...
三菱plc中的d寄存器的数值怎么改?
1.D寄存器的数值可以改变。2.在三菱PLC中,D寄存器是用来存储数据的寄存器,可以通过编程或者人机界面来修改其数值。通过编程,可以使用指令将特定的数值写入D...
三菱PLC里面的MOV指令K0D0和K1234D0.K0,K1234表示的常数?_作业帮
[最佳回答]MOVK0D0就是将立即数"0"传送到数据寄存器D0,传送完后,数据寄存器D0内存的数就是"0"了;MOVK1234D0就是将立即数"12...
用手持编程器怎么修改三菱PLC内部时间继电器数值啊-ZOL问答
可以直接修改,需要PLC在STOP状态,选择你需要修改的时间继电器修改数值。有用(0)回复19932874直接用电脑有用(0)回复p9701.PLC型号是否设定正确;2.下载...
在PLC中,什么是十进制常数?
十进制常数就是我们日常用的十进制数,只是在PLC中还经常用到二进制数和十六进制数,所以才给它加上一个十进制数的前缀加以区分在PLC中,十进制数一般用K表示...
omronplc编程指令?
OmronPLC编程指令很多,以下是常见的几种:1.LD指令:将常数或位地址内容送到累加器中,常用于数据的加载操作。2.OUT指令:将累加器中的数据输出到位地址...
plc里有没有加速度?
plc有可以设计加速度的方法一.选用PLC内部2个计时控制功能功能块TON,并使他们交替周期性工作,同时选用一个加法器;二.采用近似折线的取值方式,当2个计时...
三菱plc编程指令?
展开全部以下是三菱plc常用的指令,还有不懂的可以问我一程序流程控制指令—FNC00~0900CJ条件转移01CALL子程序调用02SRET子程序返回03IRET中断...
请问PLC的程序是不是根据电路图来编写的?-ZOL问答
你可以这样理解在编写PLC程序的时候如果你手里只有对应电路图,那么你首先要做的是按照你现有的电路图来分析它的工作原理、设备的工作流程和控制方式等等,在实...