西门子SCL语言编程——IEC 定时器(二)
4 保持型延时接通定时器(TONR)
保持型延时接通定时器也叫时间累加器,用来累加时间。初始状态如下:
参数 IN 的信号状态变为“1”时,将执行时间测量,同时时间 PT 开始计时。时间 PT 计时过程中,如果 IN 参数信号状态为“1”,则记录的时间值将进行累加。如果“IN”输入处的信号状态变为“0”,时间测量将中断。如果“IN”输入处的信号状态重新变为“1”,时间测量将重新开始。累加后的时间将在参数 ET 中输出以供查询。达到时间 PT 时,参数 Q 的信号状态变为“1”。即使 IN 参数的信号状态变为“0”,Q 参数仍将保持为“1”。
不论参数 IN 的信号状态如何,参数 R 都将复位参数 ET 和 Q。保持型延时接通定时器参数:
保持型延时接通定时器的时序图如下:
5 复位定时器指令RESET_TIMER
RESET_TIMER可用于IEC定时器的复位,在 TIMER 参数中,将“复位定时器”指令分配给程序中所声明的 IEC 定时器。该指令必须在 IF 指令中编程。只有在调用指令时才更新指令数据,而不是每次都访问分配的 IEC 定时器。
以下示例说明了该指令的工作原理:
IF #started = false THEN
"TON_DB".TON(IN := "Tag_Start",
PT := "Tag_PresetTime",
Q => "Tag_Status",
ET => "Tag_ElapsedTime");
#started := true;
END_IF;
IF "TON_DB".ET < T#25s THEN
RESET_TIMER(TIMER := "TON_DB");
#started := false;
END_IF;
示例中定时镶嵌在了IF语句内部,这种结构有一个很大的缺陷就是必须借助复位定时器清除时间,我们可以把定时器放在IF语句外,而IF语句只包含定时器启动所用的"Tag_Start",这样就可以不用复位指令。
6 加载定时器预值指令PRESET_TIMER
PRESET_TIMER可用于设置IEC定时器的预设时间值,指令初始状态如下:
很多人刚刚接触S7-1200/1500时,很不习惯用IEC定时器,而S7-300/400中也有IEC定时器,只不过是在SFB中。然而IEC定时器有诸多好处,比如定时器时间长,易于嵌入FC/FB中,没有数量限制,而且在300/400中设定时间可以立即生效。对于1200/1500,虽然在定时器上修改不能立即生效,但可以利用加载预设值指令来完成任务。示例如下:
新建建立全局数据块DB1,声明定时器及中间变量:
新建FC/FB(根据实际情况由程序员选择),写入如下代码:
关联DB1变量定时器预设值PT至HMI(HMI中PT变量域为输入输出型)。
从DB1变量声明中得知预设值PT初始时间为20秒,程序运行后,定时器定时为20秒。正常情况,IF语句中比较的结果相等,判断出条件为假跳过IF语句,后一句赋值相等数可以忽略。
当操作人员更改PT值时,PT与Last_PT比较结果为不相等,IF语句判断后执行加载持续时间,并将PT的值赋值给Last_PT,一个扫描周期后又回到IF语句比较的结果相等的这种假条件。
再换个角度看,小于6行的代码是原有程序,大于6行的代码仅仅是为了更改预设值PT而加进去的。