在实际应用中,我们常会用到计时时长远超过S5定时器的大定时时长的情况。比如,我们要求某一设备在满足运行条件后,持续运行8个小时。此时,单独用S5定时器很难实现这一控制要求。
实现上述控制要求的方法有多种,这里,介绍一种"利用计数器扩展定时时长"的方法,并简要引出S7中计数器的概念。
一、控制任务归纳
控制任务为:某一设备在满足运行条件后,持续运行8个小时
做以下假设:
1、假设该设备的各运行条件汇总为M10.0,且M10.0=1时,运行条件满足;
2、该设备的运行命令由Q2.0给出,即Q2.0=1时,设备运行;
3、为方便讨论,这里不考虑本设备故障、来自其他设备的连锁/互锁、及快/急停等各种信号的影响。
二、利用计数器扩展定时时长
1、计数器的相关概念
S7的系列CPU为计数器保留了一片存储区域。一个计数器包括一个16位的字和一个二进制的位。计数器的字用来存储当前的计数值,而计数器的触点状态反映在它的位上。如图1所示,为计数器的字。
图1 计数器的"字"
程序中,计数器的表示方法为:"C+计数器号",如C10表示10号计数器。
计数器的计数范围为:0-999。
仅当计数器的当前计数值为0时,计数器的触点状态位才为0;否则,其触点/线圈状态位1;
计数器分为加计数器、减计数器及加/减计数器,这里,我们用到了减计数器。
2、设计计数脉冲
我们可以首先设计一个"方波"信号,具体实现办法可参见《西门子S7 300仿真实验平台——编程实现矩形波、方波发生器》
这里,需要确定方波的周期。如图2所示。
图2 定时器及计数器的初始值的确定
如图3所示,为方波发生器,当M0.0=1时,定时器T1和T2周期性的工作,并在"#temp1"输出一个周期为288s的方波信号。
图3 方波发生器
3、实现延时时长为8h的"延时断"功能
有了图3所示的"方波发生器"后,我们只需利用减1计数器记录100个方波脉冲,即:
288s*100=28800s=8h
即可实现定时8小时的功能,如图4所示。
图4 时长为8h的"延时断"
数值则无法再用。在两次P0U执行之间,临时变量不保持其数值。
局部变量是分配给每个子程序的临时存贮区。
当子程序被调用时,系统分配局部变量区给子程序;子程序执行完成后,该局部变量区被释放。释放时其中存贮的值也同时丢失,不能再下一扫描周期再被子程序使用。
局部变量区的大小为64个字节,其中后4个字节被系统所占用,实际可供子程序使用的为60个字节。
由于局部变量区的数据不能带到上一扫描周期,因此只能用于存迪程序运算中的中间值,可以减少对全局变量区的占用。
由于局部变量区在子程序被调用时才被分配,且分配时并不对数据区进行初始化,所以其初始值是不确定的。因此在程序中用到这些存贮区的值的指令前,必须有对该存贮区地址的赋值操作,否则可能会出现错误的执行结果。尤其在子程序中存在大量的跳转指令时,很容易出现漏掉对局部变量赋值的情况,要格外注意。
每个子程序调用的输入/输出参数的大限制是16,如果您尝试下载的程序超过此一限制,IN和out加起来共16个超过16个就会出错,本人做一个程序的时候发现了这个问题,在这里提醒各位同行。
1、子程序或者中断程序不能访问分配给主程序的局部存储器。子程序不能访问分配给主程序、中断程序或者其他子程序的局部存储器。同样的,中断程序也不能访问分配给主程序或子程序的局部存储器。
2、有关局部变量:S7-200有64个字节的局部存储器,其中60个可以用作临时存储器或者给子程序传递参数。
如果用梯形图或功能方块图编程,STEP7--Micro/WIN保留这些局部存储器的后四个字节。
局部存储器和变量存储器很相似,但只有一处区别。变量存储器是全局有效的,而局部存储器只在局部有效。全局是指同一个存储器可以被任何程序存取(包括主程序、子程序和中断中断程序程序)。局部是指存储器区和特定的程序相关联。S7--200给主程序分配64个局部存储器;给每一级子程序嵌套分配64个字节局部存储器;同样给中断程序分配64个字节局部存储器。
子程序或者中断程序不能访问分配给主程序的局部存储器。子程序不能访问分配给主程序、中断程序或者其他子程序的局部存储器。同样的,中断程序也不能访问分配给主程序或子程序的局部存储器。S7--200plc根据需要分配局部存储器。也就是说,当主程序执行时,分配给子程序或中断程序的局部存储器是不存在的。当发生中断或者调用一个子程序时,需要分配局部存储器。新的局部存储器地址可能会覆盖另一个子程序或中断程序的局部存储器地址。
局部存储器在分配时PLC不进行初始化,初值可能是任意的。当在子程序调用中传递参数时,在被调用子程序的局部存储器中,由CPU替换其被传递的参数的值。局部存储器在参数传递过程中不传递值,在分配时不被初始化,可能包含任意数值。
3、CPU226的项目中多可以创建128个子程序,其他CUP可以创建64个子程序。子程序可以嵌套调用,即在子程序中调用别的子程序,一共可以嵌套8层。在中断程序中调用的子程序不能再调用别的子程序。不禁止递归调用(子程序调用自己),但是应慎重使用递归调用。
4、子程序中的定时器:停止调用子程序时,线圈在子程序内的位元件的ON/OFF状态保持不变。如果在停止调用时子程序中的定时器正在定时,100ms定时器将停止定时,当前值保持不变,重新调用时继续定时;但是1ms定时器和10ms定时器将继续定时,定时时间到时,它们的定时器位变为1状态,并且可以在子程序之外起作用。
如何输入个局部变量赋值欲在局部变量表中赋值,请遵循以下步骤:
1. 确保正确的POU在程序编辑器窗口中显示,如有必要,点击所需的POU标记。(因为每个POU都有自己的局部变量表,您需要确保对正确的POU赋值。)
2. 如果局部变量表处于隐藏状态,下拉水平分裂条,显示局部变量表。
3. 为需要定义的变量选择具有正确说明类型的行,在"名称"域中为该变量键入一个名称。(如果您在OB1或中断例行程序中赋值,局部变量表只包含TEMP变量。如果您在子程序中赋值,局部变量表包含IN、IN_OUT、OUT和TEMP变量。)您不需要在局部变量表中的变量名前加井号。井号只用在程序代码中的局部变量前。
注释:
* 局部变量名多可包含23个字母数字字符和下划号,也可包含扩展字符(ASCII 128至ASCII255)。个字符只能是字母或扩展字符。将关键字用作符号名属于非法,名称的个字符是数字,或名称包含非字母数字字符或扩展字符集中的字符也属于非法。
** 局部变量表变量名被下载并存储于CPU内存中,使用较长的变量名可能减少用于存储程序的内存空间。
4. 在"数据类型"域中点击鼠标指针,并使用列表框为局部变量选择适当的数据类型。
注释:
当您将局部变量指定为子程序的参数时,您必须保证为局部变量指定的数据类型不与子程序调用中使用的操作数发生冲突。为"名称"和"数据类型"域提供数值后,程序编辑器会自动为局部变量指定L内存地址。
如何在局部变量表中输入附加赋值
对于OB1和中断例行程序,局部变量表显示一组已被预先定义为TEMP变量的行。在OB1或中断例行程序中,只能使用这种说明类型。欲在表中增加更多行,只需点击后一行中的一个单元格,然后使用ENTER键移过该行并向下移动,即自动生成一个新行。
对于子程序,局部变量表显示按照以下顺序预先定义说明类型的一组行:IN、IN_OUT、OUT和TEMP。您不能改变该顺序。局部变量在该表中的顺序必须符合当您为子程序调用指令进行操作数赋值时对应的操作数顺序。如果您希望增加附加局部变量,必须用鼠标右键点击现有行,并使用弹出菜单插入与点击行类型相同的另一局部变量。选择插入(Insert)>行(Row),在所选行的上方插入新行,或选择插入(Insert)> 行下方(BelowRow),在所选行下方插入新行。
水电厂(泵站)排水系统控制系统
(a) 控制功能:当水位上升至FX3调定值时,工作泵启动,启动水泵前先打开相应的电磁阀,示流信号器动作,启动水泵;当水位上升至FX2调定值时,备用泵启动,启动水泵前先打开相应的电磁阀,示流信号器动作,启动水泵;当水位上升至FX1调定值时,发报警信号;当水位下降至FX2调定值时,备用泵停止,水泵停止后延时关闭电磁阀;当水位下降至FX3调定值时,主用泵停止,泵停后延时关闭电磁阀,水泵运行后,如果出水管无水,示流器不动,延时关闭水泵。排水系统控制系统的电机起动回路也采用软启动回路。
(b) 通信功能:PLC将电源状况、水泵运行状态、水位状况、水泵启动状态传送给公用设备LCU;公用LCU将这些信号传送给控制中心,从而使控制中心完成对排水系统的监控。
4.水电厂(泵站)供水系统控制系统
(a) 控制功能:给供水泵,示流信号器动作,发信号给机组LCU,如果示流信号器中断就投入备用泵,向机组发故障信号;机组停机后发讯给电磁阀使其关闭。在采用水泵供水后,控制功能;机组开机前发命令给自流供水电磁阀,如果自供水无水,就发命令如果清水池水位过低,发报警信号;机组中的热交换流器差压计和滤水器差压计的压差过高就发报警信号。供水系统控制系统的电机起动回路也采用软启动回路。