第三章 定时器与计数器:时间与数量的掌控者

说实话,在PLC编程里,定时器和计数器就像人的左右手。你想想看,哪个项目能离开它们?从最简单的延时启动,到复杂的生产计数,都离不开这两个家伙。今天我就带你彻底搞懂S7-1200/1500里的定时器和计数器。

3.1 定时器家族:TP、TON、TOF、TONR

西门子的定时器有四种基本类型。我刚开始学的时候也容易搞混,后来总结了一个规律:看触发信号和输出信号的关系

核心记忆法:

  • TP:脉冲定时器——给个触发,输出一个固定宽度的脉冲
  • TON:接通延时——触发后等一会儿才接通
  • TOF:断开延时——断开后等一会儿才断开
  • TONR:保持型接通延时——可以累计时间,断电不丢

3.1.1 TP(脉冲定时器)

TP定时器,说白了就是「给个触发,输出一个固定长度的脉冲」。不管你的触发信号多长,输出时间都是你设定的PT值。

我在项目中遇到过这样一个场景:需要给一个气缸一个200ms的脉冲信号,但按钮可能被按很久。用TP定时器就完美解决了——不管按钮按多久,气缸只动作200ms。

// TP定时器示例(SCL)
"TP_DB".TP_Instance(
    IN := "Start_Button",    // 触发信号
    PT := T#200MS,           // 脉冲宽度200ms
    Q => "Cylinder_Out",     // 输出到气缸
    ET => "Elapsed_Time"     // 当前计时值
);

3.1.2 TON(接通延时定时器)

这个最常用。触发信号来了,等PT时间到了,输出才接通。嗯,这里要注意:如果触发信号在计时过程中消失了,定时器会复位

我曾经犯过一个低级错误:用TON做电机启动延时,结果启动按钮按的时间不够长,电机死活启动不了。后来改成自锁电路才解决。

小技巧:TON定时器的ET值可以实时读取,用来做进度条显示特别方便。

3.1.3 TOF(断开延时定时器)

TOF和TON正好相反。输入信号接通时,输出立即接通。输入断开后,输出保持PT时间才断开。

你想想看,什么场景用这个?风机停机后的延时关闭、传送带停止后的吹气清理,都是典型应用。

3.1.4 TONR(保持型接通延时)

这个厉害了。TONR可以累计计时时间,即使触发信号断开,计时值也不会清零。只有用R输入才能复位。

我记得有个项目需要记录设备累计运行时间,用TONR就特别合适。断电后时间还在,再上电继续累加。

注意:TONR的累计时间不会自动清零。如果你需要每次启动都重新计时,记得在启动条件里加上复位逻辑。

3.2 计数器家族:CTU、CTD、CTUD

计数器比定时器简单一些,但坑也不少。三种计数器:

类型功能典型应用
CTU加计数器产品数量统计
CTD减计数器库存消耗计数
CTUD加减计数器位置控制、双向计数

3.2.1 CTU(加计数器)

每来一个上升沿,计数值加1。当计数值大于等于PV值时,输出Q接通。

我建议你养成一个好习惯:计数器用完后一定要复位。不然下次启动时,计数值还是上次的,容易出问题。

// CTU计数器示例(LAD)
// 每次传感器检测到产品,计数值+1
// 达到100个时,输出满箱信号
CTU_Instance(
    CU := "Product_Sensor",   // 计数输入
    R := "Reset_Button",      // 复位
    PV := 100,                // 设定值
    Q => "Box_Full",          // 满箱信号
    CV => "Current_Count"     // 当前值
);

3.2.2 CTD(减计数器)

从PV值开始往下减。减到0时输出Q接通。这个在物料管理里特别好用。

举个例子:仓库里有100个零件,每取走一个,计数器减1。减到0时报警提示补货。

3.2.3 CTUD(加减计数器)

既能加又能减。CU脚加1,CD脚减1。这个在位置控制里用得最多。

我曾经用CTUD做了一个简易的定位系统:电机正转加计数,反转减计数,到达目标位置就停止。虽然精度不如编码器,但胜在简单可靠。

避坑指南:

  • 计数器的计数频率有限制,别拿它当高速计数器用
  • PV值最大32767(16位),如果需要更大范围,用32位计数器
  • 复位信号优先级最高,任何时候复位都会清零

3.3 应用案例:传送带包装计数系统

光说不练假把式。我们来看一个完整的案例:

需求:一条传送带上有产品经过,每10个产品为一组,包装成一箱。包装完成后,传送带停止2秒,然后继续。

实现思路:

  1. 用CTU计数器统计产品数量
  2. 计数值到10时,触发包装动作
  3. 用TON定时器实现2秒延时
  4. 延时结束后复位计数器,继续生产
// 主程序(SCL)
IF "Product_Sensor" THEN
    "CTU_Instance"(CU := TRUE, R := "Reset_Flag", PV := 10);
END_IF;

IF "CTU_Instance".Q THEN
    // 到达10个,触发包装
    "Pack_Action" := TRUE;
    // 启动2秒定时器
    "TON_Instance"(IN := TRUE, PT := T#2S);
    
    IF "TON_Instance".Q THEN
        // 2秒到,复位
        "Reset_Flag" := TRUE;
        "Pack_Action" := FALSE;
    ELSE
        "Reset_Flag" := FALSE;
    END_IF;
END_IF;

经验之谈:实际项目中,产品传感器最好加一个去抖处理。不然产品抖动会导致误计数。我一般用TON做个10ms的去抖。

3.4 知识体系总览

下面这张图帮你理清定时器和计数器的整体关系:

定时器与计数器知识体系 定时器(Timer) TP 脉冲定时器 TON 接通延时 TOF 断开延时 TONR 保持型 计数器(Counter) CTU 加计数 CTD 减计数 CTUD 加减计数 典型应用案例 电机启停延时控制 产品包装计数系统 设备运行时间累计 物料库存管理

这张图把定时器和计数器的关系理得很清楚。左边是四种定时器,右边是三种计数器,下面是它们的典型应用。你写程序的时候,对着这张图选型就行。

最后提醒一句:定时器和计数器的背景数据块(DB)一定要分配好。我见过有人把所有定时器都放在同一个DB里,结果程序一复杂就乱套。我的习惯是:每个功能块单独建一个DB,名字和功能对应,比如"Conveyor_Timer_DB"、"Pack_Counter_DB"。

好了,定时器和计数器就讲到这里。这些东西看着简单,但用好了能解决很多实际问题。下次遇到需要延时或计数的场景,你知道该用哪个了吧?

专注资料整理