西门子S7-1200 PLC定时器深度解析:从TON/TOF/TP原理到实战编程技巧
2026/9/7 2:30:03 网站建设 项目流程

1. 项目概述:为什么定时器是PLC编程的基石

在西门子S7-1200 PLC的编程世界里,如果说逻辑运算(与、或、非)是构成程序的砖瓦,那么定时器就是让这些砖瓦“活”起来,实现时间维度控制的灵魂。很多刚接触博图(TIA Portal)的朋友,在学会了基本的位逻辑指令后,往往会卡在定时器这里。感觉指令就那么几个,TON、TOF、TP,但真用起来,要么计时不准,要么逻辑混乱,项目一复杂就理不清头绪。我刚开始用S7-1200做一个小型灌装线项目时,就曾因为对定时器理解不透彻,导致几个气缸的动作时序完全错乱,差点让设备“打架”。

定时器远不止是“延时一下”那么简单。它是实现设备顺序启动、工艺流程节拍控制、故障安全延时、信号防抖滤波的核心工具。无论是让电机A运行5秒后启动电机B,还是检测到一个按钮信号后,需要其稳定保持200毫秒才认为是有效输入,亦或是做一个周期性的闪烁指示灯,都离不开定时器。可以说,吃透了定时器,你就掌握了PLC控制中“时间”这一关键变量的指挥权。本章的学习笔记,我将结合大量实际项目中的踩坑经验,为你彻底拆解S7-1200的定时器家族,不止于手册上的指令说明,更聚焦于“什么时候该用谁”以及“怎么用才不出错”。

2. 核心需求解析:从简单延时至复杂时序

在动手写任何一行定时器程序之前,我们必须先想清楚:我到底要用它来满足什么需求?不同的应用场景直接决定了你应该选择哪种类型的定时器。根据我多年的经验,可以把定时器的核心需求归纳为以下几类,这也是我们学习时的主线。

2.1 需求一:纯粹的延时启动与延时停止

这是最常见、最基础的需求。例如,按下“启动”按钮后,希望主电机不是立刻转动,而是先响3秒警示铃,再启动电机。这就是一个典型的“延时启动”。对应的,按下“停止”按钮后,希望冷却风机继续运行10秒再停止,这就是“延时停止”。

在S7-1200中,这类需求通常对应两个指令:TON(接通延时定时器)TOF(关断延时定时器)。但这里有一个初学者极易混淆的关键点:TON并非只能用于“启动延时”,TOF也并非只能用于“停止延时”。它们的本质区别在于定时器开始计时的“触发条件”不同。TON是在其使能输入端(IN)从0变为1(上升沿)时开始计时;而TOF是在其使能输入端从1变为0(下降沿)时开始计时。理解了这个本质,你就能灵活运用,而不是死记硬背。

2.2 需求二:生成固定宽度的脉冲信号

第二个典型需求是生成一个确定宽度的脉冲,无论触发信号持续多久。比如,用一个瞬时按钮去触发一个气缸动作,我们希望气缸伸出并保持2秒,然后自动缩回,无论这个按钮被按下了1秒还是5秒。又比如,在通信中,需要生成一个宽度为100ms的复位脉冲。

这个需求就是TP(脉冲定时器)的专属舞台。TP定时器一旦被使能(IN端上升沿),会立即输出一个预设宽度的脉冲,计时期间即使输入信号消失,输出脉冲也会持续到时间到。这个特性对于需要严格定时宽度的控制场合至关重要。

2.3 需求三:构建周期性的时序逻辑

当需求从单次动作升级为周期性循环时,我们就进入了定时器的组合应用阶段。例如,一个简单的 blink 功能(指示灯以1秒为周期闪烁),或者一个复杂的工步流程:第一步10秒,第二步5秒,第三步8秒,循环执行。

这种需求通常无法用单个定时器完成,需要TON、TP甚至结合计数器进行“搭积木”。如何用最简洁、最稳定的逻辑搭建出这些时序,是衡量程序员功力的地方。这里会涉及到定时器的“自复位”接法、定时器串联等经典电路。

2.4 需求四:信号去抖与滤波

这是一个容易被忽略但极其重要的需求,特别是在处理机械按钮、行程开关等物理信号时。由于触点弹跳,一个按钮动作可能在几毫秒内产生多个快速的通断信号,如果PLC直接读取,会误认为是多次操作。

利用TON定时器可以轻松实现软件滤波。思路是:当检测到信号到来时,启动一个短延时(如20ms),延时时间到后再次检查信号是否仍为真,如果是,则判定为有效信号。这个简单的技巧能解决现场大量的误触发问题。

3. 指令深度拆解:TON, TOF, TP 三大将的实战剖析

S7-1200的定时器是IEC标准定时器,作为“函数块”存在,这意味着每次使用都需要一个专属的“实例”(Instance),可以理解为一个独立的工作单元。在博图中,你从指令列表拖出一个TON,系统会提示你为其分配一个背景数据块(如DB1)或一个多重实例的标签名(如MyTimer)。这个实例存储了定时器的所有状态:当前时间、输出状态等。下面我们进入实战环节。

3.1 TON(接通延时定时器):最常用的时间闸门

指令形态与参数:一个TON指令块,通常有以下几个管脚:

  • IN(Bool):使能输入。定时器工作的开关。
  • PT(Time):预设时间。你希望定时器计时的时长,例如 T#5S 表示5秒。
  • Q(Bool):输出。当已计时时间ET>=PT时,输出为True。
  • ET(Time):已流逝时间。当前定时器已经计了多久的时间。

工作逻辑(核心):

  1. IN信号从 False 变为 True(上升沿)时,定时器开始从0累积计时ET
  2. 在计时过程中,只要IN保持为 True,ET就持续增加。
  3. ET>=PT时,Q输出变为 True,并保持,直到IN变为 False。
  4. 一旦IN信号变为 False,无论计时是否完成,定时器立即复位:ET归零,Q输出变为 False。
  5. 如果在计时未完成(ET<PT)时,IN信号抖动了一下(先变False再变True),定时器会复位后重新开始计时。这是很多时序错误的根源!

实战案例与编程:假设要实现“启动按钮按下3秒后,电机运行”。

// 假设: “启动按钮” %I0.0, “电机” %Q0.0 // 在Main [OB1] 中: IF “启动按钮” THEN “TON_DB”.IN := TRUE; ELSE “TON_DB”.IN := FALSE; END_IF; “TON_DB”.PT := T#3S; // 预设3秒 IF “TON_DB”.Q THEN “电机” := TRUE; ELSE “电机” := FALSE; END_IF;

注意:上面是结构化文本(SCL)的写法,便于理解逻辑。在梯形图(LAD)中,通常用常开触点驱动TON的IN端,用TON的Q触点直接驱动输出线圈。但本质逻辑完全一致。

关键陷阱与心得:

  • 陷阱1:使能信号的稳定性。如工作原理第5点所述,如果你的IN信号在延时期间发生抖动(例如,来自现场传感器的信号不稳定),定时器会不断重启,导致Q永远无法输出。解决方案是使用一个中间变量(如StartSignal_Latch)对启动信号进行锁存保持,确保在定时期间IN信号恒定为True。
  • 心得1:ET的妙用。ET输出是一个Time类型的变量,你可以用它来做更灵活的判断。比如,你不仅想知道电机是否该启动,还想在触摸屏上显示“距离启动还剩XX秒”,那么就可以用PT - ET来计算剩余时间(注意处理ET>PT的情况)。
  • 心得2:定时精度。S7-1200的定时器精度与程序扫描周期有关。定时器在每次OB1扫描周期结束时更新状态。这意味着,如果你的PT设为T#100ms,而程序扫描周期是50ms,那么实际延时可能在100ms到150ms之间。对于超高精度定时需求(如毫秒级),需要考虑使用“时间中断组织块”(OB30系列)或硬件定时器。

3.2 TOF(关断延时定时器):优雅的收尾者

指令形态与参数:管脚与TON类似:IN,PT,Q,ET

工作逻辑(核心):

  1. IN信号从 True 变为 False(下降沿)时,定时器开始从0累积计时ET
  2. 在计时过程中,Q输出保持为 True
  3. ET>=PT时,Q输出变为 False,ET停止计时。
  4. 如果在计时过程中,IN信号再次变为 True,则定时器立即复位:ET归零,Q输出立即变为 True(注意这里和TON的区别!)。

实战案例与编程:假设要实现“停止按钮按下后,冷却风扇继续运行10秒”。

// 假设: “电机运行” %M0.0, “冷却风扇” %Q0.1 // “电机运行”信号在电机运行时为TRUE “TOF_DB”.IN := “电机运行”; // 电机运行时,IN为True,风扇直接运行 “TOF_DB”.PT := T#10S; “冷却风扇” := “TOF_DB”.Q;

这个逻辑非常简洁:只要电机运行,风扇就运行。电机停止(IN下降沿)后,风扇靠TOF定时器继续保持10秒的输出。

关键陷阱与心得:

  • 陷阱:对“复位”的理解。TOF在计时过程中如果IN信号重新变True,会立即复位定时器并使Q变True。这有时是需要的,但有时会导致意外。例如,在上述案例中,如果电机在停止后的第5秒又被点动了一下(IN有一个短暂脉冲),那么风扇会在已经吹了5秒后,Q立即变True(风扇保持转),并且定时器清零,这意味着之前5秒的计时作废了,电机再次停止时,风扇又会重新计时10秒。这可能不是工艺想要的。因此,TOF的IN信号必须是稳定、无抖动的
  • 心得:TOF常用于“掉电保持”类逻辑。除了设备停机后的延时,TOF还非常适合用于故障报警的复位延时、安全门关闭后的安全延时等场景,其“在延时期间维持输出”的特性非常符合这些物理过程。

3.3 TP(脉冲定时器):精准的脉冲发生器

指令形态与参数:管脚同样包含IN,PT,Q,ET

工作逻辑(核心):

  1. IN信号从 False 变为 True(上升沿)时,定时器立即开始计时,同时Q输出立即变为 True
  2. 在接下来的整个PT时长内,无论IN信号是否变为 False,Q输出都保持为 True,ET持续增加。
  3. ET>=PT时,定时时间到,Q输出变为 False,ET停止计时。
  4. 只有在定时结束后(Q已为False),下一个IN的上升沿才能再次触发一个新的脉冲。

实战案例与编程:假设要实现“每按一次测试按钮,报警灯亮2秒”。

// 假设: “测试按钮” %I0.2, “报警灯” %Q0.2 “TP_DB”.IN := “测试按钮”; “TP_DB”.PT := T#2S; “报警灯” := “TP_DB”.Q;

逻辑极其简单:按钮按下,灯亮2秒后自动熄灭。即使你一直按着按钮,灯也只亮2秒。

关键陷阱与心得:

  • 陷阱:无法被中途打断。TP一旦被触发,就会“固执”地完成整个脉冲宽度。如果你需要一个可以被中途停止的定时脉冲(例如,启动信号发出后,如果遇到急停应立即终止动作),那么TP不适合。这种场景需要TON配合逻辑来实现。
  • 心得:TP是“边沿触发,定时保持”的典范。它完美地将“触发事件”和“状态保持时间”解耦。在需要单次、定长动作的场合,如清空废料、短时吹气、发送通信脉冲等,TP是首选,逻辑清晰且可靠。

4. 高级应用与经典电路:从会用到精通

掌握了单个指令的用法,只是第一步。真正的功力体现在如何将它们组合起来,解决复杂的实际问题。下面分享几个我项目中常用的经典定时器电路。

4.1 构建一个闪烁电路(Blink)

闪烁电路是设备状态指示的标配。用两个TON即可轻松实现。

// 生成一个周期为2秒(亮1秒,灭1秒)的闪烁信号 `Flash_1s` // “Clock_1Hz” 是一个内部使用的BOOL变量 “TON_On”.IN := NOT(“Clock_1Hz”) AND NOT(“TON_On”.Q); // 巧妙的自复位触发 “TON_On”.PT := T#1S; IF “TON_On”.Q THEN “Clock_1Hz” := TRUE; END_IF; “TON_Off”.IN := “Clock_1Hz”; “TON_Off”.PT := T#1S; IF “TON_Off”.Q THEN “Clock_1Hz” := FALSE; END_IF;

逻辑解析:TON_On负责在Clock_1Hz为False时开始1秒计时,时间到则将Clock_1Hz置True。TON_Off负责在Clock_1Hz为True时开始1秒计时,时间到则将Clock_1Hz置False。如此循环,形成一个方波。你可以通过修改两个TON的PT值来独立调整亮和灭的时间。

4.2 构建一个顺序启动流程

假设有三个设备:传送带、加热器、搅拌机。要求:启动后,传送带先运行;5秒后加热器启动;加热器启动3秒后搅拌机启动。

// 假设启动信号为“Sys_Start”,停止信号为“Sys_Stop” // 设备控制变量:“Conveyor”, “Heater”, “Mixer” // 全局复位信号:“Sys_Reset” // 步骤1:系统启动锁存及传送带控制 IF “Sys_Start” THEN “Sys_Running” := TRUE; // 系统运行标志 ELSIF “Sys_Stop” OR “Sys_Reset” THEN “Sys_Running” := FALSE; END_IF; “Conveyor” := “Sys_Running”; // 传送带随系统启停 // 步骤2:第一段延时,控制加热器 “TON_Heater”.IN := “Sys_Running”; “TON_Heater”.PT := T#5S; “Heater” := “TON_Heater”.Q; // 步骤3:第二段延时,控制搅拌机 “TON_Mixer”.IN := “TON_Heater”.Q; // 注意!这里用上一个定时器的Q作为下一个的IN “TON_Mixer”.PT := T#3S; “Mixer” := “TON_Mixer”.Q;

逻辑解析:这是一个典型的定时器串联用法。TON_Heater在系统启动后开始5秒计时,其Q输出直接控制加热器。同时,TON_Heater.Q的上升沿又作为TON_Mixer的触发信号,开始3秒计时,从而控制搅拌机。这种串联结构逻辑清晰,易于扩展和调试。

4.3 信号去抖滤波电路

这是一个非常实用的技巧,用于处理机械开关的抖动。

// 原始输入信号:“Btn_Raw” (%I0.3) // 滤波后输出信号:“Btn_Filtered” // 去抖时间设为20ms “TON_Debounce”.IN := “Btn_Raw”; “TON_Debounce”.PT := T#20MS; // 关键逻辑:只有当原始信号为真,且定时器计时完成,才认为是一次有效的、稳定的按下 “Btn_Filtered” := “Btn_Raw” AND “TON_Debounce”.Q;

逻辑解析:当按钮被按下(Btn_Raw变True),定时器开始20ms计时。由于触点抖动,Btn_Raw可能在20ms内多次跳变,导致TON_Debounce反复复位重启。只有当按钮被稳定按下超过20ms后,TON_Debounce.Q才会变为True。此时,Btn_RawANDTON_Debounce.Q 的结果才为True,产生一个干净的、无抖动的Btn_Filtered信号。对于释放抖动,可以用同样的原理在下降沿处理。

5. 常见问题与调试技巧实录

即使理解了原理,在实际调试中还是会遇到各种稀奇古怪的问题。下面是我总结的“定时器故障排查清单”。

5.1 问题一:定时器不计时或计时不准

  • 可能原因1:使能信号(IN)不稳定。这是头号杀手。用监控表在线查看定时器实例的IN引脚状态,看它是否在计时期间发生了从1到0的变化。如果是,你需要前级逻辑进行信号保持或滤波。
  • 可能原因2:预设时间(PT)设置错误。检查PT值格式是否正确。T#500MST#2ST#1M30S都是合法格式。直接写数字500是无效的。
  • 可能原因3:扫描周期影响。对于极短的定时(如小于程序扫描周期),定时器可能无法正常工作。对于ms级高精度定时,必须使用循环中断组织块(OB30+)。在循环中断OB里调用定时器,该OB会以固定的硬件中断周期执行,不受主循环扫描时间影响。
  • 可能原因4:定时器实例被重复使用或覆盖。确保每个定时器都有独立的背景数据块或标签名。不要在多个地方对同一个定时器实例的IN进行写操作,会造成冲突。

5.2 问题二:定时器输出(Q)不按预期动作

  • 可能原因1:逻辑条件竞争。在同一扫描周期内,如果你先复位了定时器的IN,然后又根据它的Q去做逻辑,那么Q可能还没来得及更新就被复位了。理解PLC的“顺序扫描”机制至关重要。必要时,使用中间变量暂存状态,或在下一个扫描周期进行判断。
  • 可能原因2:对TON/TOF/TP的复位行为理解有误。再仔细回顾一下第3节中关于三种定时器在IN信号变化时如何复位的描述。这是根本差异。
  • 可能原因3:输出被其他地方覆盖。检查程序,确保控制同一个输出点(如%Q0.0)的指令只有一处,或者使用了置位/复位指令进行管理,避免“双线圈”输出。

5.3 问题三:如何在线监控和调试定时器

  • 技巧1:使用“监控表”强制与修改。在博图的监控表中,添加你的定时器实例(如TON_DB),你可以看到INQETPT的当前值。你可以在线修改PT值来测试,也可以强制IN信号来模拟现场条件。
  • 技巧2:使用“轨迹”功能进行波形分析。对于复杂的时序问题,监控表的静态数值不够直观。使用博图的“轨迹”功能,将INQET等信号添加进去,在线记录一段时间内的波形变化。你可以清晰地看到信号跳变和定时器动作的先后关系,是排查时序问题的利器。
  • 技巧3:善用ET当前值。在HMI画面上显示重要定时器的ET当前值,可以帮助操作人员了解设备进程(如“加热剩余时间:XX秒”),也便于你远程调试时了解定时器是否在正常计时。

5.4 关于定时器背景数据块的深入理解

每次从指令栏拖出一个TON/TOF/TP,博图都会让你选择“单个实例”、“多重实例”或“全局DB”。对于初学者,我强烈建议为每个重要定时器使用独立的“全局DB”。这样在监控和查找时非常方便。在DB中,定时器实例是一个结构体,包含了其所有内部状态。理解这一点,你甚至可以通过直接读写DB中的变量来与定时器交互(虽然不推荐常规这么做),但这对于理解其工作原理很有帮助。

定时器是PLC程序从“静态逻辑”迈向“动态时序”的关键一步。它并不复杂,但需要清晰的概念和严谨的逻辑。我的建议是,在笔记本上亲手画出TON、TOF、TP三种定时器在IN信号不同变化下的QET波形图,这个练习胜过读十遍手册。当你拿到一个时序控制需求时,先别急着写程序,在纸上画出理想的信号时序图,然后思考用哪个定时器、如何组合能最精准地实现它。这种“先设计,后编程”的习惯,能让你避开大多数陷阱,写出稳定可靠的工业控制程序。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询