You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CODESYS中TON定时器无法复位问题技术咨询

问题分析与解决

你遇到的问题核心是TON定时器的输出保持特性,和你看到的文档描述的差异在于:多数PLC实现的TON定时器在计时完成(ET ≥ PT)后,Q会保持为TRUE,直到定时器的输入IN出现从FALSE到TRUE的上升沿,或者定时器被显式复位——文档的描述简化了Q的后续保持逻辑。

代码问题拆解

  1. 第一次运行时,state=0,timer_on.IN被设为TRUE,计时5秒后Q变为TRUE,你将IN设为FALSE并把state改为1。此时timer_on的ET已经等于PT,Q会保持TRUE状态。
  2. 当你把state改回0时,再次执行timer_on(IN := TRUE, PT := T#5s),但此时Q本来就是TRUE,直接触发内层IF逻辑,立刻把state改回1,导致“立刻变回1”的现象。

解决方法

方法1:状态切换时复位定时器

在state不为0时强制复位定时器,确保state回到0时定时器处于初始状态:

VAR
    state : INT := 0;
    timer_on : TON;
END_VAR
IF (state = 0) THEN
    timer_on(IN := TRUE, PT := T#5s);

    IF (timer_on.Q = TRUE) THEN
        state := 1;
        timer_on(IN := FALSE); // 计时完成后先复位定时器
    END_IF
ELSE
    // state不为0时保持定时器复位状态
    timer_on(IN := FALSE);
END_IF

方法2:上升沿触发定时器启动

通过检测state从非0变为0的上升沿,确保每次state回到0时定时器重新开始计时:

VAR
    state : INT := 0;
    timer_on : TON;
    state_prev : INT := 1; // 初始值设为非0,确保第一次state=0时触发上升沿
END_VAR
// 检测state从非0变为0的上升沿
VAR_TEMP
    state_rising : BOOL;
END_VAR
state_rising := (state = 0) AND (state_prev <> 0);
state_prev := state;

IF (state = 0) THEN
    // 仅在上升沿时启动定时器,确保重新计时
    timer_on(IN := state_rising, PT := T#5s);
    // 若需要持续保持IN为TRUE直到计时完成,替换为:timer_on(IN := TRUE, PT := T#5s);
ELSE
    timer_on(IN := FALSE);
END_IF

// 单独处理计时完成逻辑
IF (timer_on.Q = TRUE) THEN
    state := 1;
    timer_on(IN := FALSE);
END_IF

关键说明

不同PLC的TON定时器实现可能略有差异,但核心逻辑一致:TON的Q在计时完成后会保持激活状态,必须通过IN的上升沿或显式复位才能让Q回到FALSE。你的原代码没有在state切换后复位定时器,导致Q一直处于激活状态,才会出现异常触发的情况。

内容的提问来源于stack exchange,提问作者user3742046

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 14:53:11