RSLgix5000中子程序的内部使用的输入、返回参数称之为“形参”,子程序的调用者提供“实参”,以通过子程序完成某种控制要求。子程序是由“形参”代替“实参”来执行的,对于一般的如BOOL,DINT等的数据类型,可以很容易地实现“实参”对“形参”的赋值。但是,计时器等由于利用了CPU系统的资源,例如“时钟中断”等,因而不能像上述类型数据那样可以用赋值的方式实现。要想使用计时器就必须得声明一个,以便系统能对此计时器进行操作。如果子程序的“形参”可以是普通的计时器,那么对于N个子程序的调用,这个“形参”计时器就必须实现N个计时器的功能,显然对于只能完成一次计时的普通计时器是无法完成的,所以子程序中是不可能有普通计时器作为“形参”的。这样就可以理解为什么RSLgix5000子程序中,不能使用计时器作为“形参”。
但是,众所周知,西门子S7系列plc的Step 7编程软件中的FB,FC功能块,也就是子程序,可以实现计时器作为子程序的“形参”,这如何解释呢?其实,在STEP 7功能块,或者说是子程序中出现的计时器,虽然外形和普通计时器一样,但是根据上面的论述,我们可以确定其并非是
因此,西门子Step 7中的子程序中的计时器CONTROL ENGINEERING China版权所有,本质上依然使用了声明过的,子程序外部的普通计时器。对于RSLgix5000来说,要实现子程序中的计时器功能也是一样,使用子程序外部的计时器。
RSLgix5000子程序使用计时器的方法
由于在RSLgix5000梯形图子程序中,没有实现“形参”功能的“伪计时器”,所以只能在全局变量中声明的计时器。为了便于在子程序中使用这些计时器,我们将这些计时器放在数组里,这样子程序只需一个数组下标变量,就可以使用这些计时器。但是,很遗憾,在RSLgix5000梯形图中是无法使用数组下标变量的,因此,我们就只能使用ST即结构化文本,一种类似于PASCAL语言的编程工具,它提供完整的数组支持。
举一个例子,如果要实现3个计时器的时间设置工作控制工程网版权所有,对于梯形图来说,即使是使用数组,由于它不能使用数组下标变量CONTROL ENGINEERING China版权所有,也只能是采用一个一个的赋值方式,即,T[1].PRE = 1000,T[2].PRE = 1000,T[3].PRE = 1000等等。如果子程序也采用一个一个赋值的方式,就没有任何优势,还不如不使用子程序来实现,这样的子程序是毫无意义的(不带“形参”的子程序除外)。如果采用ST结构化文本,由于其数组下标可使用变量,就可以用子程序实现,子程序如下所示。
FOR I := 1 TO 3 BY 1 DO
T[I] := 1000;
END_FOR;
这样就很适合子程序使用,不管是有100个还是1000个计时器,也都只是使用这一个子程序,就可以完成所有计时器的计时时间设置工作。由于梯形图无法完成这样的工作控制工程网版权所有,因此子程序中的计时器数组的使用,只能用ST结构化文本实现。
例如有2个相同控制要求的设备,用子程序来实现,如果每个设备需要使用3个计时器,那么需要声明含有2×3=6个计时器的计时器数组。设备1使用前3个计时器,设备2使用后3个计时器。在子程序中,设置一个DINT型的“形参”作为起始计时器号,例如设备1使用1,即从下标为1的计时器数组开始;设备2使用4,即从下标为4的计时器数组开始。
需要说明的是,在RSLgix5000中,ST结构化文本所用的计时器同梯形图所用计时器不一样,在ST结构化文本中是FBD_TIMER类型,使用时用TONR指令声明。
一个实例
我们以两个水泵的控制为例子进行说明。水泵A的启动输出信号为START_A;出水阀门A的打开输出信号为OPEN_A;水泵A启动反馈为STARTED_A;出水阀门A开到位反馈为OPENED_A;水泵A的启动运行输入信号PUMP_START_A;水泵A启动完成标志PUMP_A_STARTED。水泵B的启动信号为START_B,出水阀门B的打开输出信号为OPEN_B;水泵B启动反馈为STARTED_B;出水阀门B开到位反馈为OPENED_B;水泵B的启动运行输入信号PUMP_START_B;水泵B启动完成标志PUMP_B_STARTED。
控制要求为水泵启动5秒后打开出水阀门,水泵使用3秒的输出脉冲启动