R_TRIG、F_TRIG与TOF功能异常问题排查
问题原因与修正方案
核心问题
你编写的边沿触发块(R_TRIG、F_TRIG)和定时器块(TOF)仅在第一次扫描时被调用一次,后续扫描周期中完全得不到更新,导致无法检测输入信号的边沿变化,自然不会触发trigger_ticks的递减逻辑。
具体原因拆解
- PLC中的边沿触发器(
R_TRIG/F_TRIG)需要每个扫描周期都被调用,才能持续对比当前周期与上一周期的输入信号状态,从而检测到上升/下降沿。你的代码里这些块被放在re = FALSE的分支里,执行一次后re被设为TRUE,后续再也不会调用这些块,它们的内部状态完全停滞,无法再响应trigger_pos_sensor_left的新触发信号。 TOF定时器同理,仅调用一次的话,它的状态不会随时间推进更新,delay_timer.Q的状态也永远不会变化。
修正后的代码
将边沿触发器和定时器的调用移到条件分支外部,确保每个扫描周期都执行:
// 必须每个扫描周期都调用这些块,才能持续更新状态 trigger_sensor_rtrig(CLK := trigger_pos_sensor_left); trigger_sensor_ftrig(CLK := trigger_pos_sensor_left); delay_timer(IN := trigger_sensor_ftrig.Q, PT := T#10s); IF (re = FALSE )THEN trigger_ticks := 5; re := TRUE; END_IF IF (trigger_sensor_rtrig.Q = TRUE) AND (delay_timer.Q = OFF) THEN trigger_ticks := trigger_ticks - 1; END_IF
补充说明
修正后,R_TRIG会在每次trigger_pos_sensor_left出现上升沿时,将Q输出置为TRUE一个扫描周期,此时只要delay_timer.Q为OFF,就会触发trigger_ticks减1的逻辑,符合你的预期。
内容的提问来源于stack exchange,提问作者user3742046
相关产品推荐
相关产品推荐

