ST定时器应用:TON、TOF、TP在ST中的指令调用与参数设置
在结构化文本(Structured Text,ST)编程中,定时器是实现时间逻辑控制的核心元件。无论是在输送线启停延时、电机冷却等待,还是安全回路确认延时等场景中,TON(接通延时)、TOF(断开延时)、TP(脉冲定时器)这三类基本定时器都承担着不可替代的角色。它们不是“黑箱函数”,而是具备明确定义的输入、输出、内部状态和触发行为的标准化功能块。本文将完全基于IEC 61131-3标准,以纯文字方式手把手说明:如何在ST中声明、调用、配置参数并验证行为这三类定时器,所有操作均可在任意支持ST的PLC平台(如Codesys、TIA Portal ST编辑器、Unity Pro ST环境)中直接复现。
一、定时器本质:不是“计时工具”,而是“带时间属性的状态机”
在ST中,TON、TOF、TP不是指令(instruction),而是预定义的功能块(Function Block, FB)。这意味着:
- 每次使用都必须先声明实例(不能像
+或AND那样直接嵌入表达式); - 每个实例拥有独立的内部数据(如当前时间值、完成标志);
- 所有输入/输出引脚均为
BOOL或TIME类型,无隐式类型转换; - 它们的行为由IEC 61131-3标准严格定义,与厂商无关。
务必记住:声明实例名 ≠ 调用功能块。声明只是分配内存,真正触发执行必须在程序主体中通过()显式调用。
二、TON:接通延时定时器——“输入变真后,等够时间才输出变真”
TON在输入IN从FALSE变为TRUE时开始计时,当累计时间≥设定值PT时,输出Q置为TRUE,且ET(已过时间)持续更新。一旦IN变回FALSE,Q立即变FALSE,ET清零。
2.1 声明TON实例
在变量声明区(VAR或VAR_GLOBAL)中写:
myTon1 : TON; // 最简声明:使用默认数据类型
// 或显式声明(推荐,避免隐式类型歧义)
ton_conveyor_start : TON;
ton_door_lock_delay : TON;
✅ 正确:
TON是标准功能块名,首字母大写,无括号。
❌ 错误:TON()(语法错误)、ton()(小写,非标准)、TON(PT:=T#5S)(声明区不允许赋初值)。
2.2 在ST程序体中调用并设置参数
在PROGRAM或FUNCTION_BLOCK的主体代码中:
ton_conveyor_start(IN := start_button AND not conveyor_running,
PT := T#3.5S);
IN:布尔型触发条件。必须为纯布尔表达式,不可为整数或字符串。PT:TIME类型设定时间。必须使用标准时间常量格式:T#5S(5秒)、T#100MS(100毫秒)、T#2M(2分钟)、T#1H(1小时);- ❌ 禁止:
5000(无单位)、"5S"(字符串)、TIME#5000(非法格式)。
Q和ET是只读输出,不可在调用语句中赋值,只能在后续语句中读取:IF ton_conveyor_start.Q THEN conveyor_running := TRUE; END_IF; // ET值可读取用于诊断(如超时报警) IF ton_conveyor_start.ET > T#4S THEN timeout_alarm := TRUE; END_IF;
2.3 关键行为验证点
- 若
IN在计时期间变为FALSE:Q立即FALSE,ET归零; - 若
IN保持TRUE但PT被动态修改(如PT := T#10S):计时器重置并按新PT重新开始计时; ET值始终反映本次有效触发后的实际流逝时间,单位为TIME,可参与比较运算(如ET >= T#2S)。
三、TOF:断开延时定时器——“输入变假后,再维持输出真一段时间”
TOF在输入IN从TRUE变为FALSE时启动计时,Q保持TRUE直至ET ≥ PT;若IN在计时期间重新变TRUE,则Q立即变TRUE且ET清零。
3.1 声明与调用
// 声明
fan_cooling_timer : TOF;
// 调用(放在主程序循环中)
fan_cooling_timer(IN := fan_running, PT := T#60S);
⚠️ 注意:
IN应接设备“运行中”信号(高电平有效),而非“停止按钮”。因为TOF的逻辑是:“运行信号消失后,继续冷却N秒”。
3.2 典型应用逻辑链
// 主逻辑:按下停止按钮 → 切断风扇供电 → 启动TOF
IF stop_button THEN
fan_power := FALSE;
END_IF;
// TOF输入接风扇实际运行状态(反馈信号更可靠)
fan_cooling_timer(IN := fan_feedback, PT := T#60S);
// 输出控制冷却风机
cooling_fan := fan_cooling_timer.Q; // 60秒内保持真
// 安全兜底:TOF超时后强制关冷却
IF fan_cooling_timer.ET >= T#60S THEN
cooling_fan := FALSE;
END_IF;
3.3 行为边界测试
- 初始
IN=FALSE:Q=FALSE,ET=0; IN由FALSE→TRUE:Q立即TRUE,ET保持0;IN由TRUE→FALSE:Q保持TRUE,ET从0开始累加;- 计时期间
IN再次TRUE:Q立即TRUE,ET归零,重新等待下次断开。
四、TP:脉冲定时器——“输入上升沿触发,固定宽度输出脉冲”
TP在IN的上升沿(FALSE→TRUE)瞬间,立即将Q置TRUE,并开始计时;当ET ≥ PT时,Q自动变FALSE。IN后续状态不影响已触发的脉冲。
4.1 声明与调用
// 声明
pulse_light_200ms : TP;
// 调用(关键:必须确保IN是边沿敏感信号)
pulse_light_200ms(IN := rising_edge_sensor, PT := T#200MS);
4.2 上升沿检测的ST实现(必备前置)
TP本身不检测边沿,需外部提供单周期脉冲作为IN:
// 边沿检测变量声明(VAR)
last_sensor_state : BOOL;
sensor_rising : BOOL;
// 主程序中
sensor_rising := sensor_input AND NOT last_sensor_state;
last_sensor_state := sensor_input;
// 再将sensor_rising接入TP
pulse_light_200ms(IN := sensor_rising, PT := T#200MS);
4.3 应用示例:按键防抖与指示灯闪烁
// 防抖后按键信号驱动TP,生成精确200ms指示灯脉冲
led_pulse := pulse_light_200ms.Q;
// 复位TP(可选):当需要手动终止脉冲时,可将IN置FALSE
// 但注意:TP一旦触发,无法中途取消,只能等自然结束或重启
✅ TP唯一强制要求:
IN必须是宽度≤1个扫描周期的脉冲,否则可能重复触发。
五、三类定时器核心参数对比表
| 特性 | TON(接通延时) | TOF(断开延时) | TP(脉冲定时器) |
|---|---|---|---|
| 触发条件 | IN由FALSE→TRUE |
IN由TRUE→FALSE |
IN的上升沿 |
| Q初始状态 | FALSE |
TRUE(当IN=TRUE时) |
FALSE |
| Q动作时机 | ET ≥ PT时变TRUE |
ET ≥ PT时变FALSE |
上升沿即变TRUE,ET≥PT时变FALSE |
| ET清零时机 | IN=FALSE时 |
IN=TRUE时 |
每次上升沿触发时 |
| PT修改影响 | 立即重置,按新值重计时 | 立即重置,按新值重计时 | 立即重置,按新值重计时 |
| 典型用途 | 启动延时、预热等待 | 停机冷却、安全延时释放 | 指示灯脉冲、通信握手信号 |
六、常见错误与规避方法
-
错误:在声明区给PT赋值
bad_ton : TON := (PT := T#5S); // ❌ ST语法错误:声明区不可初始化FB✅ 正确:在调用语句中传参,或在首次扫描时用
IF NOT first_scan THEN ... END_IF赋初值。 -
错误:混淆TON与TOF的IN信号源
- 用启动按钮直接接TON
IN✅; - 用启动按钮直接接TOF
IN❌(会导致一按就启动,松开即延时关,逻辑错乱)。
- 用启动按钮直接接TON
-
错误:对TP的IN使用长信号
pulse_tp(IN := motor_running, ...); // ❌ motor_running可能持续数分钟,TP会每周期触发一次✅ 必须前置边沿检测,确保
IN是单周期脉冲。 -
错误:未声明实例直接调用
TON(IN := x, PT := T#1S); // ❌ 缺少实例名,编译失败✅ 必须先声明(如
my_ton : TON;),再调用(my_ton(IN := x, ...);)。 -
错误:ET参与布尔运算不加比较
IF my_ton.ET THEN ... END_IF; // ❌ ET是TIME类型,非BOOL,语法错误✅ 必须显式比较:
IF my_ton.ET >= T#2S THEN ... END_IF。
七、高级技巧:定时器级联与复位控制
7.1 级联实现长延时(突破单定时器最大PT限制)
PLC定时器PT上限通常为T#2H46M30S(取决于平台),若需T#10H:
// 第一级:2小时定时
ton_2h(IN := start_long_delay, PT := T#2H);
// 第二级:触发条件为第一级Q的上升沿
ton_10h(IN := ton_2h.Q AND NOT ton_2h_last_q,
PT := T#8H);
ton_2h_last_q := ton_2h.Q;
7.2 强制复位定时器(非标准但实用)
IEC标准未定义复位引脚,但可通过赋值清零内部状态:
// 在需要硬复位时执行(如急停触发)
IF emergency_stop THEN
ton_conveyor_start(IN := FALSE, PT := ton_conveyor_start.PT);
// 或更彻底:重新声明实例(部分平台支持)
END_IF;
八、调试建议:用变量监控替代“看波形”
由于无图形界面,ST调试依赖变量观测:
- 将
ton_xxx.Q、ton_xxx.ET、ton_xxx.IN全部加入在线监控表; - 使用
TIME_TO_DINT(ton_xxx.ET)转换为毫秒整数,便于数值比对; - 对TP,监控
IN信号宽度(用两个相邻扫描周期的布尔值判断是否单周期); - 在HMI上显示
ET值(格式化为STRING)是最直观的现场验证方式。
九、总结性行为公式(仅当文字描述不足时引入)
TON的输出逻辑可形式化为:
$$Q_{\text{TON}}(t) = \begin{cases}
\text{TRUE}, & \text{if } \exists\, t_0 < t \text{ such that } IN(t_0)=\text{FALSE} \land IN(t_0^+)=\text{TRUE} \\
& \text{and } \int_{t_0}^{t} IN(\tau)\,d\tau \geq PT \\
\text{FALSE}, & \text{otherwise}
\end{cases}$$
TOF的输出逻辑:
$$Q_{\text{TOF}}(t) = \begin{cases}
\text{TRUE}, & \text{if } IN(t)=\text{TRUE} \\
& \text{or } \left[ IN(t)=\text{FALSE} \land \int_{t}^{t_{\text{off}}} \neg IN(\tau)\,d\tau < PT \right] \\
\text{FALSE}, & \text{otherwise}
\end{cases}$$
TP的输出逻辑(设上升沿发生在$t_0$):
$$Q_{\text{TP}}(t) = \begin{cases}
\text{TRUE}, & t_0 \leq t < t_0 + PT \\
\text{FALSE}, & \text{otherwise}
\end{cases}$$
这些公式不是编程必需,但能帮你穿透表面语法,直击IEC标准定义的本质。

暂无评论,快来抢沙发吧!