1. 定时器与计数器在工业控制中的核心地位
在现代工业自动化系统中,时间控制和数量统计是两大基础需求。定时器与计数器作为满足这些需求的核心指令,几乎出现在每一个PLC控制程序中。从简单的延时启动到复杂的多段速控制,从基本的产品计数到先进的生产批次管理,这些功能都离不开定时器和计数器的精确应用。
理解定时器和计数器的工作原理,掌握其编程技巧,是衡量PLC程序员专业水平的重要指标。本章将通过实际案例,深入解析这两类指令的高级应用。
2. PLC定时器指令深度解析
2.1 定时器的基本类型与工作原理
根据IEC 61131-3标准和各PLC厂商的实现,定时器主要分为以下几种类型:
接通延时定时器(TON – Timer ON Delay)
- 功能:输入条件成立后,定时器开始计时,达到预设时间后输出导通
- 特点:计时过程中输入断开则定时器复位
- 应用:设备启动延时、过程保持时间控制
断开延时定时器(TOF – Timer OFF Delay)
- 功能:输入条件从通到断时开始计时,达到预设时间后输出断开
- 特点:计时过程中输入重新接通则定时器立即复位
- 应用:设备停机延时、安全保持时间控制
保持型定时器(TP – Pulse Timer)
- 功能:输入条件接通瞬间产生一个固定宽度的脉冲输出
- 特点:输出脉冲宽度固定,不受输入条件变化影响
- 应用:信号脉冲生成、设备点动控制
累计定时器(TONR – Retentive Timer ON)
- 功能:累计输入条件成立的时间,即使中间断开也不清零
- 特点:需要专用复位指令才能清零
- 应用:设备累计运行时间、维护周期管理
2.2 定时器的数据结构与参数设置
以西门子S7-1200/1500系列为例,定时器的典型数据结构:
structuredtext复制下载
TON_Instance : TON;
// 输入参数
TON_Instance.IN : BOOL; // 使能输入
TON_Instance.PT : TIME; // 预设时间值
// 输出参数
TON_Instance.Q : BOOL; // 定时器输出
TON_Instance.ET : TIME; // 当前计时值
时间值的表示方法:
- T#500ms // 500毫秒
- T#2s // 2秒
- T#1m30s // 1分30秒
- T#1h15m // 1小时15分钟
- S5T#2s // 兼容S5系列的2秒表示
2.3 定时器应用案例精解
案例1:电机星三角启动的时序控制
星三角启动是三相异步电动机的常用降压启动方式,需要精确的时间控制完成星形到三角形的转换。
text复制下载
// 网络1:启动命令与总控制
| I0.0 | I0.1 | M0.0 |
|----| |----|/|---------(S)-----|
| 启动按钮 停止按钮 运行标志 |
| |
| I0.1 | M0.0 |
|----| |---------(R)-----|
停止按钮 复位运行标志
// 网络2:星形启动阶段
| M0.0 | T0.Q | Q0.0 | Q0.1 |
|----| |----|/|----|/|---------( )-----|
| |
| M0.0 | T0 |
|----| |-------------------(TON)-----|
运行标志 T#5S
星形运行定时器
// 网络3:三角形运行阶段
| M0.0 | T0.Q | Q0.0 | Q0.2 |
|----| |----| |----|/|---------( )-----|
运行标志 星形时间到 星形输出 三角形输出
// 网络4:互锁保护
| Q0.1 | Q0.2 |
|----|/|----|/|---------( )-----|
星形输出 三角输出 主接触器
工作过程:
- 按下启动按钮I0.0,运行标志M0.0置位
- 主接触器Q0.2和星形接触器Q0.1得电,电机星形启动
- 同时定时器T0开始5秒计时
- 5秒后T0输出导通,星形接触器Q0.1断开,三角形接触器Q0.0得电
- 电机转入三角形运行模式
- 停止按钮I0.1可随时中断运行
案例2:自动包装线的定时灌装控制
在液体灌装生产线上,需要根据灌装时间控制灌装量,保证每瓶产品重量一致。
text复制下载
// 网络1:灌装启动控制
| I0.2 | T1.Q | M0.1 |
|----| |----|/|---------(S)-----|
灌装位置 灌装完成 灌装进行中
// 网络2:灌装时间控制
| M0.1 | T1 |
|----| |-------------------(TON)-----|
预设时间根据产品设置
PT := "Product_Time".Value
// 网络3:大流量灌装阶段(前80%时间)
| M0.1 | T2.Q | Q0.3 |
|----| |----|/|---------( )-----|
| |
| M0.1 | T2 |
|----| |-------------------(TON)-----|
PT := T1.PT * 80%
// 网络4:小流量灌装阶段(后20%时间)
| M0.1 | T2.Q | Q0.4 |
|----| |----| |---------( )-----|
灌装进行中 大流量时间到 小流量阀
// 网络5:灌装完成处理
| T1.Q | M0.1 | M0.2 |
|----| |---------(R)---------(S)-----|
灌装时间到 复位灌装中 设置完成标志
// 网络6:完成信号输出
| M0.2 | T3 | Q0.5 |
|----| |-------------------(TP)---------( )-----|
完成标志 T#500ms 灌装完成信号
脉冲定时器
关键技术点:
- 使用两级灌装(先大流量后小流量)提高精度
- 预设时间存储在数据块中,可根据产品类型调整
- 灌装完成输出脉冲信号,通知传送带移动
案例3:设备周期性维护提醒
基于累计运行时间,在需要维护时提醒操作人员。
text复制下载
// 网络1:设备运行时间累计
| Q0.0 | TONR_Instance |
|----| |-------------------[TONR]-----|
电机运行 PT := T#500h // 维护间隔
IN Q ET
// 网络2:维护提醒触发
| TONR_Instance.Q | I0.3 | M1.0 |
|---------| |---------|/|---------(S)-----|
累计时间到 确认按钮 维护提醒标志
// 网络3:声光报警输出
| M1.0 | M1.1 | Q1.0 |
|----| |----|/|---------( )-----|
| |
| M1.0 | T4 | Q1.1 |
|----| |-------------------(TP)---------( )-----|
维护提醒 T#1s 闪烁周期 维护指示灯
脉冲定时器
// 网络4:报警确认与复位
| I0.3 | M1.0 | TONR_Instance |
|----| |----| |---------[ ]-----|
确认按钮 维护提醒 RESET
复位累计定时器
3. PLC计数器指令深度解析
3.1 计数器的基本类型与工作原理
加计数器(CTU – Count Up)
- 功能:每个上升沿使计数值加1
- 复位:R输入为1时,计数值清零
- 应用:产品计数、生产批次统计
减计数器(CTD – Count Down)
- 功能:每个上升沿使计数值减1
- 装载:LD输入为1时,计数值设为预设值
- 应用:物料消耗计数、剩余数量显示
加减计数器(CTUD – Count Up/Down)
- 功能:根据CU和CD输入进行加减计数
- 特点:可同时实现加法和减法计数
- 应用:仓库库存管理、工位物料平衡
3.2 计数器的数据结构与参数设置
典型加减计数器的数据结构:
structuredtext复制下载
CTUD_Instance : CTUD;
// 输入参数
CTUD_Instance.CU : BOOL; // 加计数输入
CTUD_Instance.CD : BOOL; // 减计数输入
CTUD_Instance.R : BOOL; // 复位输入
CTUD_Instance.LD : BOOL; // 装载输入
CTUD_Instance.PV : INT; // 预设值
// 输出参数
CTUD_Instance.Q : BOOL; // 计数达到输出
CTUD_Instance.CV : INT; // 当前计数值
3.3 计数器应用案例精解
案例1:自动装配线的产品计数与包装
在装配线末端,需要对成品进行计数,每满一定数量自动包装。
text复制下载
// 数据块定义
TYPE Product_Data :
STRUCT
Total_Count : DINT; // 总产量
Batch_Size : INT := 12; // 每箱数量
Batch_Count : INT; // 当前箱计数
Box_Number : INT; // 箱号
END_STRUCT
END_TYPE
VAR_GLOBAL
Line1_Data : Product_Data;
END_VAR
// 网络1:产品检测与总计数
| I0.4 | C1 |
|----| |----[CTU]-----|
产品传感器 PV := 999999
CU CV Q
// 网络2:总产量记录
| C1.CU | ADD |
|----| |-----[ ]-----|
加计数脉冲 IN1: Line1_Data.Total_Count
IN2: 1
OUT: Line1_Data.Total_Count
// 网络3:箱内计数
| I0.4 | C2 |
|----| |----[CTU]-----|
产品传感器 PV := Line1_Data.Batch_Size
CU CV Q
// 网络4:满箱检测与包装启动
| C2.Q | M2.0 |
|----| |---------(S)-----|
箱满标志 包装启动标志
// 网络5:包装机控制
| M2.0 | T5 | Q2.0 |
|----| |-------------------(TON)---------( )-----|
包装启动 T#3S 包装机运行
包装时间
// 网络6:包装完成处理
| T5.Q | C2 | M2.0 |
|----| |-----[R]---------(R)-----|
包装时间到 复位箱计数器 复位包装标志
// 网络7:箱号更新
| T5.Q | ADD |
|----| |-----[ ]-----|
包装完成 IN1: Line1_Data.Box_Number
IN2: 1
OUT: Line1_Data.Box_Number
案例2:立体仓库货位管理
使用加减计数器管理仓库中每个货位的库存数量。
text复制下载
// 货位数据结构
TYPE Storage_Cell :
STRUCT
Cell_ID : INT; // 货位编号
Max_Capacity : INT := 50;// 最大容量
Current_Stock : INT; // 当前库存
In_Count : CTUD; // 入库计数器
Out_Count : CTUD; // 出库计数器
Status : WORD; // 状态字
END_STRUCT
END_TYPE
// 网络1:1号货位入库计数
| I1.0 | Cell1.In_Count |
|----| |-------[CTUD]-----|
入库传感器 CU CV Q
PV := Cell1.Max_Capacity
// 网络2:1号货位出库计数
| I1.1 | Cell1.Out_Count |
|----| |-------[CTUD]-----|
出库传感器 CD CV Q
// 网络3:实时库存计算
| Always_ON | Cell1.Current_Stock |
|------| |---------:= Cell1.In_Count.CV -
Cell1.Out_Count.CV;
// 网络4:库存状态判断
// 库存充足(>最低库存)
| Cell1.Current_Stock | Compare1 |
|---------|>|-------------[ ]-----|
IN1: Cell1.Current_Stock
IN2: 10 // 最低库存
OUT -> Cell1.Status.0
// 库存高位(>90%容量)
| Cell1.Current_Stock | Compare2 |
|---------|>|-------------[ ]-----|
IN1: Cell1.Current_Stock
IN2: Cell1.Max_Capacity * 0.9
OUT -> Cell1.Status.1
// 库存空(=0)
| Cell1.Current_Stock | Compare3 |
|---------|=|-------------[ ]-----|
IN1: Cell1.Current_Stock
IN2: 0
OUT -> Cell1.Status.2
案例3:生产线工位节拍控制与效率统计
通过计数器实现生产节拍监控和效率分析。
text复制下载
// 网络1:生产节拍定时
| I2.0 | T10 |
|----| |-------------------(TON)-----|
生产开始 PT := T#30S // 标准节拍
节拍定时器
// 网络2:节拍超时检测
| T10.Q | M3.0 |
|----| |---------(S)-----|
节拍超时 超时标志
// 网络3:正常完成计数
| I2.1 | T10.Q | C10 |
|----| |----|/|----[CTU]-----|
完成信号 未超时 正常完成计数
CU CV Q
PV := 99999
// 网络4:超时完成计数
| I2.1 | T10.Q | C11 |
|----| |----| |----[CTU]-----|
完成信号 已超时 超时完成计数
// 网络5:效率统计计算(每小时)
| T11.Q | Calc_Efficiency |
|----| |-------[ ]-----|
小时脉冲 功能块调用
// 效率计算功能块
FUNCTION_BLOCK Calc_Efficiency
VAR_INPUT
Total_OK : INT; // 总合格数
Total_NG : INT; // 总不合格数
Total_Timeout : INT; // 总超时数
END_VAR
VAR_OUTPUT
Efficiency : REAL; // 综合效率
OEE : REAL; // 设备综合效率
END_VAR
VAR
Total_Output : INT;
END_VAR
// 计算逻辑
Total_Output := Total_OK + Total_NG;
IF Total_Output > 0 THEN
Efficiency := (Total_OK / Total_Output) * 100.0;
// OEE = 时间开动率 × 性能开动率 × 合格品率
OEE := (Time_Running / Time_Total) *
(Ideal_Cycle_Time * Total_OK / Time_Running) *
(Total_OK / Total_Output) * 100;
END_IF;
4. 定时器与计数器的复合应用
案例:自动混料系统的配方控制
在化工、食品等行业,需要按照配方精确控制多种物料的添加时间和数量。
text复制下载
// 配方数据结构
TYPE Recipe_Step :
STRUCT
Material_ID : INT; // 物料编号
Add_Time : TIME; // 添加时间
Quantity : INT; // 添加数量
Mix_Time : TIME; // 混合时间
Next_Step : INT; // 下一步序号
END_STRUCT
END_TYPE
VAR_GLOBAL
Current_Recipe : ARRAY[1..10] OF Recipe_Step;
Current_Step : INT := 1;
Step_Timer : TON;
Material_Counter : CTU;
END_VAR
// 网络1:混料过程主控
| I3.0 | I3.1 | M4.0 |
|----| |----|/|---------(S)-----|
启动按钮 急停按钮 混料进行中
// 网络2:步骤执行控制
| M4.0 | M4.1 | Step_Timer |
|----| |----|/|-------[TON]-----|
混料进行中 步骤完成 IN Q ET
PT := Current_Recipe[Current_Step].Add_Time
// 网络3:物料添加控制
| Step_Timer.IN | T12.Q | Q3.0 |
|-------| |---------|/|---------( )-----|
步骤进行中 加料脉冲 阀1控制
| |
| Step_Timer.IN | T12 |
|-------| |-------------------(TP)-----|
PT := T#200ms // 脉冲宽度
脉冲发生器
// 网络4:物料计数
| T12.Q | Material_Counter |
|----| |-------[CTU]-----|
加料脉冲 CU CV Q
PV := Current_Recipe[Current_Step].Quantity
// 网络5:数量达到检测
| Material_Counter.Q | M4.1 |
|----------| |---------(S)-----|
数量达到 步骤完成标志
// 网络6:步骤切换
| M4.1 | ADD | Current_Step |
|----| |-----[ ]-------------------:= ----------|
步骤完成 IN1: Current_Step
IN2: 1
OUT: 临时变量
// 网络7:混合阶段控制
| M4.1 | M4.2 | T13 |
|----| |----|/|-------[TON]-----|
步骤完成 混合完成 混合定时器
PT := Current_Recipe[Current_Step].Mix_Time
// 网络8:混合器控制
| T13.IN | Q3.1 |
|----| |---------( )-----|
混合进行中 混合电机
// 网络9:过程完成判断
| Current_Step | Compare_End |
|---------|>|-------------[ ]-----|
当前步骤号 IN1: Current_Step
IN2: 10 // 总步骤数
OUT -> M4.3 // 过程完成
5. 高级应用与优化策略
5.1 多定时器协同工作
案例:交通信号灯控制
使用多个定时器实现复杂的时序控制,包括主灯时间、黄灯时间、全红时间等。
text复制下载
// 交通灯时序控制
VAR
Main_Green_Timer : TON; // 主绿灯时间
Main_Yellow_Timer : TON; // 主黄灯时间
Side_Green_Timer : TON; // 支路绿灯时间
Side_Yellow_Timer : TON; // 支路黄灯时间
All_Red_Timer : TON; // 全红时间
Phase : INT; // 相位控制
END_VAR
// 相位1:主路绿灯,支路红灯
| Phase=1 | Main_Green_Timer |
|----| |---------[TON]-----|
PT := T#30S
// 相位2:主路黄灯,支路红灯
| Main_Green_Timer.Q | Main_Yellow_Timer |
|----------| |---------[TON]-----|
PT := T#5S
// 相位3:全红过渡
| Main_Yellow_Timer.Q | All_Red_Timer |
|------------| |---------[TON]-----|
PT := T#2S
// 相位4:支路绿灯,主路红灯
| All_Red_Timer.Q | Side_Green_Timer |
|--------| |---------[TON]-----|
PT := T#20S
// 相位5:支路黄灯,主路红灯
| Side_Green_Timer.Q | Side_Yellow_Timer |
|-----------| |---------[TON]-----|
PT := T#5S
// 相位6:全红过渡
| Side_Yellow_Timer.Q | All_Red_Timer |
|-------------| |---------[TON]-----|
PT := T#2S
// 相位切换逻辑
CASE Phase OF
1: IF Main_Green_Timer.Q THEN Phase := 2; END_IF;
2: IF Main_Yellow_Timer.Q THEN Phase := 3; END_IF;
3: IF All_Red_Timer.Q THEN Phase := 4; END_IF;
4: IF Side_Green_Timer.Q THEN Phase := 5; END_IF;
5: IF Side_Yellow_Timer.Q THEN Phase := 6; END_IF;
6: IF All_Red_Timer.Q THEN Phase := 1; END_IF;
END_CASE;
5.2 计数器的批量操作
案例:生产批次管理
使用计数器数组管理多条生产线的批次信息。
text复制下载
// 生产线数据数组
VAR
Line_Counter : ARRAY[1..5] OF CTU; // 5条生产线计数器
Batch_Size : ARRAY[1..5] OF INT := [100, 150, 200, 120, 180];
Batch_Complete : ARRAY[1..5] OF BOOL;
Total_Production : DINT := 0;
END_VAR
// 循环处理所有生产线
FOR i := 1 TO 5 DO
// 设置各线批次大小
Line_Counter[i].PV := Batch_Size[i];
// 检测批次完成
Batch_Complete[i] := Line_Counter[i].Q;
// 累计总产量
IF Line_Counter[i].CU THEN
Total_Production := Total_Production + 1;
END_IF;
// 批次完成处理
IF Batch_Complete[i] THEN
// 触发包装
Batch_Pack_Request[i] := TRUE;
// 重置计数器
Line_Counter[i].R := TRUE;
ELSE
Line_Counter[i].R := FALSE;
END_IF;
END_FOR;
5.3 性能优化与注意事项
- 定时器资源管理
- 优先使用多实例定时器而非多个独立定时器
- 合理选择时间基值,避免不必要的精度损失
- 对于长定时(小时级以上),考虑使用时钟脉冲+计数器组合
- 计数器精度选择
- 根据计数范围选择适当的数据类型(INT/DINT)
- 对于高速计数,使用专用高速计数器模块
- 考虑计数器溢出处理机制
- 抗干扰设计
- 输入信号增加软件滤波,防止误计数
- 关键计数过程增加校验机制
- 定期备份计数值到非易失存储器
- 调试与监控
- 为重要定时器/计数器添加详细注释
- 建立状态监控界面,实时显示关键参数
- 实现历史数据记录和趋势分析功能
结语
定时器和计数器作为PLC编程的基础指令,其应用水平直接影响控制系统的精度和可靠性。从简单的延时控制到复杂的时序管理,从基本的数量统计到高级的生产分析,这些指令在工业自动化中发挥着不可替代的作用。
掌握定时器和计数器的精髓,不仅需要理解其工作原理,更需要在实际项目中不断实践和创新。随着工业4.0和智能制造的发展,定时器和计数器的应用将更加智能化和网络化,但作为控制基础的核心理念将始终不变:精确的时间控制和可靠的数量管理,是工业自动化的永恒主题。