IEC61131-3 ST语言必备 - 定时器与计数器标准功能块
ST/PLC
IEC61131-3 ST 语言必备 - 定时器与计数器标准功能块
1. 定时器(IEC 标准)
1.1 TON - 接通延时定时器
作用: 输入信号持续一段时间后,输出才为 TRUE。
VAR
TON_Timer : TON;
Timer_Result : BOOL;
ElapsedTime : TIME;
END_VAR
TON_Timer(
IN := Start_Signal, // 输入信号
PT := T#5s, // 预设时间 5 秒
Q => Timer_Result, // 输出(延时后为 TRUE)
ET => ElapsedTime // 已过去时间
);
IF Timer_Result THEN
// 5 秒后执行
Action := TRUE;
END_IF;
1.2 TOF - 断开延时定时器
作用: 输入信号断开后,输出继续保持一段时间。
VAR
TOF_Timer : TOF;
Running : BOOL;
END_VAR
TOF_Timer(
IN := Run_Signal,
PT := T#10s,
Q => Running
);
// 信号断开后继续运行 10 秒
1.3 TP - 脉冲定时器
作用: 输入触发后,输出固定宽度的脉冲。
VAR
TP_Timer : TP;
Pulse_Out : BOOL;
END_VAR
TP_Timer(
IN := Trigger,
PT := T#1s,
Q => Pulse_Out
);
// 每次 Trigger 为 TRUE,产生 1 秒宽度的脉冲
1.4 定时器特性对比
| 定时器 | 触发条件 | 输出时机 | 典型应用 |
|---|---|---|---|
| TON | IN 变为 TRUE | 延时后 Q 变为 TRUE | 延时启动 |
| TOF | IN 变为 FALSE | 延时后 Q 变为 FALSE | 延时停止 |
| TP | IN 上升沿 | 固定宽度脉冲 | 脉冲生成 |
1.5 定时器状态说明
每个定时器都有以下输出:
IN:输入信号PT:预设时间(Preset Time)Q:输出信号ET:已过去时间(Elapsed Time)
2. 计数器(IEC 标准)
2.1 CTU - 加计数器
VAR
CTU_Counter : CTU;
Count_Done : BOOL;
Count_Value : INT;
END_VAR
CTU_Counter(
CU := Pulse_Input, // 计数输入(上升沿计数)
RESET := Reset_Btn, // 复位
PV := 100, // 预设值
Q => Count_Done, // 计数完成
CV => Count_Value // 当前值
);
IF Count_Done THEN
// 计数达到 100
Process_Complete := TRUE;
END_IF;
2.2 CTD - 减计数器
VAR
CTD_Counter : CTD;
Count_Done : BOOL;
END_VAR
CTD_Counter(
CD := Pulse_Input, // 减计数输入
LOAD := Load_Btn, // 加载预设值
PV := 50, // 预设值
Q => Count_Done, // 计数到 0
CV => Current_Count // 当前值
);
// 从 50 减到 0 时 Count_Done 为 TRUE
2.3 CTUD - 加减计数器
VAR
CTUD_Counter : CTUD;
Reached_Max : BOOL;
Reached_Min : BOOL;
END_VAR
CTUD_Counter(
CU := Up_Btn, // 加计数
CD := Down_Btn, // 减计数
RESET := Reset_Btn,
LOAD := Load_Btn,
PV := 50,
Q => Reached_Max, // 达到预设值
QU => Reached_Max, // 达到预设值
QD => Reached_Min, // 减到 0
CV => Current_Count
);
2.4 计数器特性对比
| 计数器 | 计数方向 | 复位 | 典型应用 |
|---|---|---|---|
| CTU | 递增 | RESET 清零 | 产品计数 |
| CTD | 递减 | LOAD 加载预设值 | 倒计时 |
| CTUD | 双向 | RESET 清零 | 库存管理 |
3. 实战应用
3.1 延时启动功能块
FUNCTION_BLOCK FB_DelayedStart
VAR_INPUT
Start : BOOL;
DelayTime : TIME := T#3s;
END_VAR
VAR_OUTPUT
Running : BOOL;
Countdown : TIME;
END_VAR
VAR
StartTimer : TON;
ManualStop : BOOL;
END_VAR
// 启动延时
StartTimer(IN := Start AND NOT ManualStop, PT := DelayTime);
Countdown := StartTimer.ET;
IF StartTimer.Q THEN
Running := TRUE;
END_IF;
// 手动停止
IF ManualStop THEN
Running := FALSE;
END_IF;
END_FUNCTION_BLOCK
3.2 周期性任务调度
PROGRAM PeriodicTask
VAR
CycleTimer : TON;
CycleCounter : CTU;
TaskReady : BOOL;
MinuteCounter : INT;
END_VAR
// 1 秒周期
CycleTimer(IN := TRUE, PT := T#1s);
IF CycleTimer.Q THEN
CycleTimer(IN := FALSE); // 复位
CycleTimer(IN := TRUE); // 重新启动
// 计数
CycleCounter(CU := TRUE, RESET := FALSE, PV := 60);
IF CycleCounter.Q THEN
// 每分钟执行
TaskReady := TRUE;
MinuteCounter := MinuteCounter + 1;
CycleCounter.RESET := TRUE; // 复位计数器
END_IF;
END_IF;
IF TaskReady THEN
// 执行周期性任务
Execute_Task();
TaskReady := FALSE;
END_IF;
END_PROGRAM
3.3 产品计数与批次管理
FUNCTION_BLOCK FB_ProductCounter
VAR_INPUT
SensorSignal : BOOL;
BatchSize : INT := 100;
ResetCount : BOOL;
END_VAR
VAR_OUTPUT
CurrentCount : INT;
BatchComplete : BOOL;
TotalProduced : INT;
END_VAR
VAR
ItemCounter : CTU;
END_VAR
// 计数(上升沿检测)
IF SensorSignal THEN
ItemCounter(
CU := TRUE,
RESET := ResetCount,
PV := BatchSize
);
END_IF;
CurrentCount := ItemCounter.CV;
BatchComplete := ItemCounter.Q;
IF BatchComplete THEN
TotalProduced := TotalProduced + BatchSize;
ItemCounter.RESET := TRUE; // 自动复位开始下一批
END_IF;
END_FUNCTION_BLOCK
3.4 闪烁指示灯
FUNCTION_BLOCK FB_Blink
VAR_INPUT
Enable : BOOL;
OnTime : TIME := T#0.5s;
OffTime : TIME := T#0.5s;
END_VAR
VAR_OUTPUT
Output : BOOL;
END_VAR
VAR
OnTimer : TON;
OffTimer : TON;
END_VAR
IF NOT Enable THEN
Output := FALSE;
OnTimer(IN := FALSE);
OffTimer(IN := FALSE);
RETURN;
END_IF;
// 亮灭交替
IF NOT Output THEN
OnTimer(IN := TRUE, PT := OnTime);
IF OnTimer.Q THEN
Output := TRUE;
OnTimer(IN := FALSE);
END_IF;
ELSE
OffTimer(IN := TRUE, PT := OffTime);
IF OffTimer.Q THEN
Output := FALSE;
OffTimer(IN := FALSE);
END_IF;
END_IF;
END_FUNCTION_BLOCK
4. 注意事项
⚠️ 定时器使用要点:
- 定时器是功能块,需要实例化后才能使用
- 每次调用都需要传入 IN 参数
- PT 不能为负数或零
- 不同 PLC 品牌的定时器实现可能有细微差异
⚠️ 计数器使用要点:
- CU/CD 是边沿触发,不是电平触发
- RESET 优先级高于计数输入
- CV 是只读输出,不能直接赋值
文档版本:1.0 | 更新日期:2026-04-28 | 作者:JianLin Studio