S7-1200PLC定时器为IEC定时器,没有固定的类似S7-200CN中的T0、T37一样的编号,使用前需要在数据块中声明IEC_TIMER类型变量才可以使用。使用的数量收CPU的存储器容量限制。
定时器介绍
S7-1200定时器包含四种定时器:
1、TP:生成脉冲定时器。
IN由“0”变成“1”时,Q由“0”变为“1”。在ET未达到PT时间前,Q均 保持“1”输出状态,不受IN的状态变化影响。当ET=PT时,停止计 时,Q由“1”转换为“0”。
图1 TP生成脉冲定时器
2、TON:接通延时定时器。
IN为“1”时,定时器启动计时。当ET=PT时,Q输出为“1”,ET停止计时并 保持当前计时状态。任意时刻IN为“0”时,ET计时时间清零,Q输出恢 复为“0”。
图2 接通延时定时器
3、TOF:关断延时定时器。
IN由“0”变为“1”时,Q输出变为“1”,当IN由“1”变为“0”时,定时器计时 启动,当ET=PT时,Q输出变为“0”,并定时器停止计时,保持当前计 时值。任意时刻IN变为1时。Q输出变为“0”,并定时器计时值清零。
图3 TOF关断延时定时器
4、TONR:时间累加器。
IN由“0”变为“1”时,定时器开始计时,当IN由“1”变为“0”时,定时器停 止计时并保持当前计时值。当ET=PT时,Q输出变为“1”。当R 由“0”变为“1”时,定时器计时值复位,Q输出变为“0”。
图4 TONR时间累加器
在S7-1200指令中,定时器分为功能框定时器和线圈型定时器。如图5所示。
这两种定时器在使用上没有区别。
图5 定时器指令
定时器程序编写
前面我们有介绍到,S7-1200中的IEC定时器,需要先在数据块中声明IEC_TIMER类型的定时器变量,声明方法如下:
1、将DB块声明为1个IEC_TIMER定时器。过程如“图6”所示。
1、添加新块;
2、定义新DB块名称;
3、将类型修改为“IEC_TIMER”类型;
4、点击“确定”即可;
图6 DB块声明为IEC_TIMER
2、在全局DB块内,声明一个或多个IEC_TIMER类型变量。过程如“图7”所示
1、添加一个全局DB数据块,名称可任意定义;
2、在全局DB内,添加一个变量,类型设置为“IEC_TIMER”;
通过此方法可以在一个DB块内,添加多个IEC_TIMER变量,这样会比第一 种方法看起来更加简洁直观。
图7 在全局DB块内新建IEC_TIMER定时器
声明好IEC_TIMER变量后,我们可以回到Main主程序中,添加一个定时器来做个简单测试。下面以TON接通延时定时器为例,做个简单程序测试。
1、从指令树的基本指令中,将TON指令拖入到我们想要放的位置;
2、如果我们已声明过IEC_TIMER变量,则弹出的对话框我们可以直接点取消;
3、在TON定时器指令上方,输入我们所声明的定时器变量;
4、为定时器的IN和PT分配参数;Q和ET可以选择不分配变量;
其中PT为Timer类型变量;格式为“T#”再加时间,如2秒,可以 写入“T#2S”或者用“T#2000MS”
图8 TON指令调用
这样定时器的程序即完成。
问题注意点:
1、为什么TON定时器在IN为“1”时,定时器不计时?
1、S7-1200中IEC_TIMER定时器在使用时,如果在程序中未使用的该定时 器的ET或Q,则该定时器不会刷新,则计时器当前值不更新。
2、定时器的声明变量被重复使用。
图9 定时器计时不工作
2、定时器能否达到精准计时?
不能做到。
IEC_TIMER定时器的更新发生在定时器的ET或者Q被扫描到时。因此定 时器的计时值会受到扫描周期影响,不能做到精准计时,如果需要精准 技术,可采用循环中断(OB30)来实现。