CODESYS中TON定时器无法复位问题技术咨询
问题分析与解决
你遇到的问题核心是TON定时器的输出保持特性,和你看到的文档描述的差异在于:多数PLC实现的TON定时器在计时完成(ET ≥ PT)后,Q会保持为TRUE,直到定时器的输入IN出现从FALSE到TRUE的上升沿,或者定时器被显式复位——文档的描述简化了Q的后续保持逻辑。
代码问题拆解
- 第一次运行时,
state=0,timer_on.IN被设为TRUE,计时5秒后Q变为TRUE,你将IN设为FALSE并把state改为1。此时timer_on的ET已经等于PT,Q会保持TRUE状态。 - 当你把
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
相关产品推荐
相关产品推荐

