ST定时器应用:TON、TOF、TP在ST中的指令调用与参数设置

发布于 2026-03-18 11:21:47 · 浏览 3 次 · 评论 0 条

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那样直接嵌入表达式);
  • 每个实例拥有独立的内部数据(如当前时间值、完成标志);
  • 所有输入/输出引脚均为BOOLTIME类型,无隐式类型转换
  • 它们的行为由IEC 61131-3标准严格定义,与厂商无关。

务必记住:声明实例名 ≠ 调用功能块。声明只是分配内存,真正触发执行必须在程序主体中通过()显式调用。


二、TON:接通延时定时器——“输入变真后,等够时间才输出变真”

TON在输入INFALSE变为TRUE时开始计时,当累计时间≥设定值PT时,输出Q置为TRUE,且ET(已过时间)持续更新。一旦IN变回FALSEQ立即变FALSEET清零。

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程序体中调用并设置参数

PROGRAMFUNCTION_BLOCK的主体代码中:

ton_conveyor_start(IN := start_button AND not conveyor_running, 
                   PT := T#3.5S);
  • IN:布尔型触发条件。必须为纯布尔表达式,不可为整数或字符串。
  • PTTIME类型设定时间。必须使用标准时间常量格式:
    • T#5S(5秒)、T#100MS(100毫秒)、T#2M(2分钟)、T#1H(1小时);
    • ❌ 禁止:5000(无单位)、"5S"(字符串)、TIME#5000(非法格式)。
  • QET是只读输出,不可在调用语句中赋值,只能在后续语句中读取:
    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在计时期间变为FALSEQ立即FALSEET归零;
  • IN保持TRUEPT被动态修改(如PT := T#10S):计时器重置并按新PT重新开始计时
  • ET值始终反映本次有效触发后的实际流逝时间,单位为TIME,可参与比较运算(如ET >= T#2S)。

三、TOF:断开延时定时器——“输入变假后,再维持输出真一段时间”

TOF在输入INTRUE变为FALSE时启动计时,Q保持TRUE直至ET ≥ PT;若IN在计时期间重新变TRUE,则Q立即变TRUEET清零。

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=FALSEQ=FALSEET=0
  • INFALSE→TRUEQ立即TRUEET保持0
  • INTRUE→FALSEQ保持TRUEET0开始累加;
  • 计时期间IN再次TRUEQ立即TRUEET归零,重新等待下次断开。

四、TP:脉冲定时器——“输入上升沿触发,固定宽度输出脉冲”

TP在IN上升沿FALSE→TRUE)瞬间,立即将QTRUE,并开始计时;当ET ≥ PT时,Q自动变FALSEIN后续状态不影响已触发的脉冲。

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(脉冲定时器)
触发条件 INFALSE→TRUE INTRUE→FALSE IN上升沿
Q初始状态 FALSE TRUE(当IN=TRUE时) FALSE
Q动作时机 ET ≥ PT时变TRUE ET ≥ PT时变FALSE 上升沿即变TRUEET≥PT时变FALSE
ET清零时机 IN=FALSE IN=TRUE 每次上升沿触发时
PT修改影响 立即重置,按新值重计时 立即重置,按新值重计时 立即重置,按新值重计时
典型用途 启动延时、预热等待 停机冷却、安全延时释放 指示灯脉冲、通信握手信号

六、常见错误与规避方法

  1. 错误:在声明区给PT赋值

    bad_ton : TON := (PT := T#5S); // ❌ ST语法错误:声明区不可初始化FB

    ✅ 正确:在调用语句中传参,或在首次扫描时用IF NOT first_scan THEN ... END_IF赋初值。

  2. 错误:混淆TON与TOF的IN信号源

    • 用启动按钮直接接TON IN ✅;
    • 用启动按钮直接接TOF IN ❌(会导致一按就启动,松开即延时关,逻辑错乱)。
  3. 错误:对TP的IN使用长信号

    pulse_tp(IN := motor_running, ...); // ❌ motor_running可能持续数分钟,TP会每周期触发一次

    ✅ 必须前置边沿检测,确保IN是单周期脉冲。

  4. 错误:未声明实例直接调用

    TON(IN := x, PT := T#1S); // ❌ 缺少实例名,编译失败

    ✅ 必须先声明(如my_ton : TON;),再调用(my_ton(IN := x, ...);)。

  5. 错误: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.Qton_xxx.ETton_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标准定义的本质。

评论 (0)

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

扫一扫,手机查看

扫描上方二维码,在手机上查看本文