【西门子s7-200】s7-200plc的数据如何永久保存 西门子S7-200子程序调用问题
一、首先我们简要了解下CPU的存储结构,CPU的存储区分为两大类:
1.RAM
易失型,需要供电为使其中的数据保持
存放的数据类型:V区、M区、T区、C区和工作存储区
2.EEPROM
数据永久保持型,就是我们常说的断电保持型
存放的数据类型:V区、M区(默认为MB0—MB13,可设置)、某些C和plc程序(包括程序块,系统块,数据块)
其中,RAM中的数据在断电后根据型号不同可以保持50--100小时,主要是通过CPU内部超级电容放电来提供电源,如果需要长时间保持数据则需要插入电池卡,可保持200天。电池卡订货号:6ES7 291—8BA20—0XA0 又叫BC293
二、我们再来了解下CPU永久存储的原理
我们通常说的PLC断电可保持存储区只的都是,断电时可将数据存入EEPROM中,即只有V区和M区(在系统块中可以设置)才可以;当CPU断电瞬间,设置好的V区和M区会瞬间将数据写入EEPROM中,当再次上电CPU会将EEPROM中的数据再写到对应V区和M区中,实现永久保存。
三、现在我们来详细介绍S7-200 CPU内永久保持型存储区EEPROM的方法
1.M区:MB0--MB13(默认设置),只需在系统块----断电数据保持---设置成自己需要的存储区即可,下载时需要将下载系统块进PLC中。
先编写程序如下,监控,都对MB0和VB0写入3 然后关掉电源
然后再上电,监控MB0数据依旧保持为3 VB0数据变为0
2. V区:通过SMB31和SMB32来实现
SMB31和SMW32是S7-200一个特殊寄存器,专门用于将V区写入EEPROM
SMB31为传输请求和存储类型
SMW32为存储的V区位置
详细说明请参考上图或在“帮助”搜索“SMB31”
使用方法:编写程序如下
1. 将“3”写入”VB50”
2. 激活V10.0 将VB50中的数据对应的存入EEPROM中
3. 断电再上电,仍旧保持
3. T与C的断电保持
计数器(C)和TONR型定时器可以断电保持,但是无法写入EEPROM中,是通过RAM存储,需要电池卡供电。
TON(T32-63)和TOF(T96-T55)类型定时器无法断电保持,请不要再系统块中设置这些存储区,否则下载程序是会报错。
4.数据块中编写
原理和初始化类似,每当上电后,数据块中写的数据会自动写入对应的存储区中,下载时要将数据块下载到PLC中。
在数据块中将 “3”写入VB0
编写程序
下载到CPU,监控,VB0的值即为3 而VB1为0
西门子S7-200子程序调用问题
S7-200的程序有三种:主程序、子程序、中断程序。
主程序只有一个,名称为OB1。
子程序可以达到64个,名称分别为SBR0~SBR63。子程序可以由子程序或中断程序调用。
中断程序可以达到128个,名称分别为INT0~INT127。中断方式有输入中断、定时中断、高速计数中断、通信中断等中断事件引发,当CPU响应中断时,可以执行中断程序。
由这三种程序可以组成线性程序和分块程序两种结构。
一、线性程序结构
_线性程序是指一个工程的全部控制任务都按照工程控制的顺序写在一个程序中,比如写在OB1中。程序执行过程中,CPU不断地扫描OB1,按照事先准备好的顺序去执行工作,如图:
显然,线性程序结构简单,一目了然。但是,当控制工程大到一定程序之后,仅仅采用线性程序就会使整个程序变得庞大而难于编制、难于调试了。
二、分块程序结构
分块程序是指一个工程的全部控制任务被分成多个小的任务块,每个任务块的控制任务根据具体情况分别放到子程序中,或者放到中断程序中。程序执行过程中,CPU不断地调用这些子程序或者被中断程序中断,
分块程序虽然结构复杂一些,但是可以把一个复杂的过程分解成多个简单的过程。对于具体的程序块容易编写,容易调试。从总体上看,分块程序的优势是十分明显的。
使用子程序,可使编程结构优化,******限度地使用以往(或分享他人)的资源。
子程序须由主程序或其他子程序调用,内部计算时使用临时变量。而临时变量与全局变量之间衔接,就是通过参数调用。您可以看到西门子子程序变量声明栏中有各种类型,in、out、in-out、temp,可根据需要进行声明和定义符号(注意系统关键字)
可以在子程序中将“结果”声明成out类型,并定义符号,如“run”。调用时,可看到右侧的“引脚”run,可以填写您喜欢的任意地址,如 q0.0
1.PLC的子程序其实就是一个普通的调用函数,在汇编语言里面可以看做跳转到某段程序里面运行,结束后返回。
2.call子程序时,IN会把数值先送给分配好的局部变量,然后运行子程序。结束时,系统自动把分配好的局部变量传输给OUT。
3.局部变量是公共区间,所有程序中的局部变量都会使用这片区域。它保存的值不会程序调用的结束而自动清零,因此所有程序使用局部变量之前应该遵守先赋值,再使用的原则。同样的,应该警惕子程序返回CRET指令对局部变量OUT的影响,先赋值,再退出。
4.局部存储区是应该用于临时的,存放中间过程的。
5.对于计数,建议用保持寄存器V区间。
以下是相关提问:
1、西门子PLC S7-200的断电永久保存数据的程序怎样写的?最好附上现成的程序?
S7-200可配置断电保存区域,配置好以后把需要断电保存的数据存在此区域就行了,不需要编制程序。另外就是S7-200默认是不带电池的,想要掉电保存数据,要单独采购他的电池。不然数据只能保存1周左右(靠里面的法拉电容)。
2、西门子S7-200PLC的子程序的执行问题。
西门子S7-200PLC的子程序的执行问题。西门子S7-200PLC的子程序执行到一半就不给能流了,那么该子程序会继续执行直到该子程序结束?还是一旦没有能流输入子程序,子程序就马上停止执行,回到主程序继续执行下一步?
能够中断子程序完成执行的方法只能是plc从run转向stop,例如,停电了。否则,一定是主程序调用子程序,子程序调用完成,继续执行主程序,即使调用过程中发生中断,也是停止子程序,调用中断程序,执行完中断程序,继续子程序,然后主程序这样一个过程。
追问就是主程序里面,子程序执行中途输入失去能流,子程序也会继续执行,直到该子程序执行完成,再进行主程序下一条,是这样子吗
追答子程序执行中,系统不会去检测是否失去能流,因为主程序的执行参数被压入系统堆栈,只有当子程序执行完毕后,才会将参数弹出堆栈,因此,不存在子程序调用过程中失去能流的可能。
追问那我调用子程序,怎么让子程序中途跳出执行