
1. 为什么Smart200的Bool延时不是“加个TON就行”——从现场调试失败说起刚接手一个老厂改造项目客户指着控制柜里那台Smart200 PLC说“就一个按钮按下去灯亮松开后灯再亮3秒才灭——这总该5分钟搞定吧”我点头答应打开TIA Portal拖出一个TON定时器IN接按钮常开触点Q接灯输出PT设为3000ms。下载、上电、测试——按钮一按灯亮一松手灯立刻灭。延时不存在的。客户在旁边皱眉“你们西门子PLC连这点功能都做不了”那一刻我才意识到Smart200的Bool信号延时根本不是把TON往梯形图里一扔就完事的“填空题”而是一道需要同时理解硬件扫描机制、指令执行逻辑、信号边沿特性的综合应用题。它不像继电器时代用RC电路靠物理电容充放电自然产生延时也不像高级PLC有内置的“延时置位/复位”专用指令。Smart200的TON、TOF这些标准定时器其输入IN端口接收的是电平信号Level Signal而非边沿信号Edge Signal。按钮松开瞬间IN从1变0TON立即复位Q输出立刻断开——你根本没机会让定时器“走完”那3秒。这背后是PLC最底层的运行逻辑每个扫描周期CPU读取所有输入点状态→执行用户程序→刷新所有输出点。TON指令在每个周期内检测IN是否为1是则累加ET否则清零ET并置Q为0。它不记忆“刚刚发生了什么”只关心“此刻是不是1”。所以要实现“松开后延时关闭”你必须在按钮松开的那个瞬间捕获这个“从1到0”的跳变并用这个跳变去触发一个独立的、不受按钮当前电平影响的计时过程。这就是“关闭延时”Off-Delay的本质——它不是对按钮电平的延时而是对按钮释放事件的延时响应。同理“接通延时”On-Delay表面看是按钮按下后等3秒再动作但若按钮存在机械抖动实际中几乎必然存在直接用TON接按钮电平可能因抖动导致IN反复通断ET被多次清零重计最终延时时间严重不准甚至无法触发。所以真正的工业级Bool延时必须包含信号消抖、边沿检测、状态保持三个核心环节。这也正是为什么网上搜“Smart200延时”一堆人抱怨“TON不管用”“延时不准”“松开就停”——他们缺的不是指令而是对PLC扫描周期与信号时序关系的系统性理解。我后来在车间角落的旧笔记本上画了张草图横轴是时间纵轴是按钮电平。一条锯齿状的线代表真实抖动的按钮信号上面标着“扫描周期Tc10ms”下面画着TON的ET累加曲线——每次抖动低电平出现ET就被清零曲线永远爬不到3000ms。这张图成了我给新同事讲延时原理的第一课。它提醒我们PLC编程不是画梯形图而是设计一套能在确定时间窗口内可靠响应物理世界变化的逻辑系统。Smart200虽小但它的扫描机制和指令行为和S7-1200、S7-1500一脉相承。搞懂它才能真正吃透西门子PLC的底层逻辑。2. Smart200 Bool延时的三大技术路径TONSR锁存器、自定义FB、以及被低估的“置位/复位”指令组合面对“按钮松开后灯延时3秒灭”这个需求我在TIA Portal里试了至少五种方案最终锁定三条真正稳定、易维护、且符合西门子官方推荐实践的技术路径。它们不是简单的“哪个更快”而是针对不同场景、不同维护要求、不同代码可读性的最优解。2.1 路径一TON SR锁存器——教科书级经典解法新手必会这是西门子官方教材和大多数培训课程首选的方法核心思想是用SR锁存器“记住”按钮释放事件再用TON对这个“记住的状态”进行计时。具体实现分三步边沿检测与消抖用SM0.51Hz时钟脉冲或更优的SM0.1首次扫描脉冲配合一个简单的“上升沿检测”电路即“前一周期输入为0当前周期输入为1”生成一个仅持续一个扫描周期的脉冲作为SR锁存器的置位S信号。同时用按钮的常闭触点或取反后的信号生成下降沿脉冲作为复位R信号。这样按钮按下产生一个S脉冲松开产生一个R脉冲彻底规避抖动影响。状态保持将S脉冲接入SR锁存器的S端R脉冲接入R端。锁存器的输出Q就代表“按钮已被按下”这一状态。这个Q是自保持的只要没收到R信号它就一直为1。延时执行将锁存器Q作为TON的IN输入。按钮按下Q1TON开始计时按钮松开R脉冲到来Q立刻变为0TON的IN变为0TON复位Q输出断开——但此时TON的ET已经累加了3秒Q输出会在3秒后才断开。等等不对这里有个关键陷阱TON的Q输出是“IN为1且ET≥PT”时才为1一旦IN变0Q立刻为0。所以不能直接用TON的Q去驱动灯而要用TON的Q去控制另一个SR锁存器的S端再用按钮松开的R脉冲去复位这个锁存器。最终灯的输出由这个二级锁存器的Q控制。这个方案的优势在于完全使用标准指令无需任何额外库或编程知识梯形图清晰易懂调试时每个中间变量S脉冲、R脉冲、一级Q、TON的ET、二级Q都能在监控表里实时查看。我曾用它在现场一台Smart200上调试恒压供水系统的“压力超限报警延时确认”功能客户工程师看着监控表里ET从0跳到3000再看到灯在3秒后熄灭当场就明白了原理。它的缺点是梯形图略长占用网络节点稍多但对于Smart200这种I/O点不多的小型PLC完全不是问题。2.2 路径二自定义功能块FB——一次封装全站复用当项目里出现超过5处需要“关断延时”的地方比如电机停机延时冷却、阀门关闭延时泄压、报警灯延时熄灭再一个个画TONSR不仅效率低而且极易出错。这时我果断创建了一个名为“BOOL_OFF_DELAY”的自定义FB。它的接口极其简洁输入InputIN原始Bool信号、PT延时时间数据类型TIME输出OutputQ延时后的Bool信号、ET已延时时间数据类型TIME静态变量StaticM_TONTON定时器实例、M_SRSR锁存器实例、M_LAST_IN存储上一周期IN值用于边沿检测FB内部逻辑就是路径一的精炼版用M_LAST_IN和当前IN计算出上升沿/下降沿脉冲驱动SR锁存器再用锁存器输出驱动TONTON的Q再驱动最终输出Q。创建好后在主程序里调用它就像调用一个黑盒子“CALL BOOL_OFF_DELAY (IN:I0.0, PT:T#3S, QQ0.0);”。这个方案的价值在于工程化与可维护性。当客户日后要求把所有关断延时从3秒改成5秒我只需在FB的默认参数里改一次所有调用点自动生效。如果发现某个延时不准我只需检查FB内部一处逻辑而不是翻遍整个程序找TON。更重要的是它强制统一了代码风格——所有延时逻辑都遵循同一套消抖、边沿检测、状态保持的标准流程杜绝了“张三用TON直连李四用CTU计数器”的混乱局面。我在一个食品包装线上部署了这个FB整条线28个气缸的“到位确认延时”全部用它后期维护工程师说“找延时逻辑就一个FB进去看一眼全明白。”2.3 路径三置位/复位指令S/R的巧妙组合——最精简的“一行式”解法这是我在翻阅西门子《S7-200 SMART系统手册》附录时发现的冷门技巧适用于对代码长度极度敏感的场合比如Smart200 RAM只有50KB程序已接近上限。它不依赖TON而是利用S/R指令的“置位优先”特性结合一个辅助Bit实现等效延时。核心思路用按钮松开的下降沿脉冲去“置位”一个辅助Bit如M0.0同时启动一个TON但TON的Q不直接输出只用来“复位”这个辅助Bit。具体梯形图第一行I0.0按钮常闭触点串联M0.0输出到M0.0自身形成自锁回路即S指令效果。第二行TON的IN接M0.0PT设为3秒TON的Q输出到M0.0的复位端R指令效果。逻辑是按钮松开瞬间I0.0由1变0第一行的常闭触点闭合M0.0被置位1M0.01使TON的IN1TON开始计时3秒后TON的Q1将M0.0复位0整个回路断开。而灯的输出直接接在M0.0上。这个方案只有两行梯形图占用资源极少。但它牺牲了可读性——没有经验的人看到这段代码第一反应是“这M0.0怎么自己控制自己”需要花时间理解其反馈回路本质。我只在几个紧急抢修项目中用过比如替换一台故障PLC客户要求“半小时内恢复”而原程序已无空间添加TON指令。它证明了PLC编程的终极目标不是写出最炫的代码而是用最可靠、最易懂的方式解决现场那个具体的物理问题。对于日常开发我依然首推路径一或二。3. Smart200仿真环境下的延时调试陷阱为什么你的TON在仿真里“准”到了现场就“飘”Smart200的仿真功能S7-PLCSIM Advanced或TIA Portal自带的仿真器是调试利器但也是埋下隐患的温床。我见过太多次这样的场景程序员在电脑上仿真TON设定3秒监控ET精确走到3000Q准时输出欢呼“搞定”结果下载到真实PLC现场一测延时要么2.8秒要么3.5秒甚至有时根本不触发。问题不出在代码而出在仿真与真实硬件之间那几毫秒的“时间感知差异”。3.1 仿真器的“理想时间” vs 真实PLC的“物理时间”PLC仿真器运行在Windows系统上它的时间基准是PC的系统时钟精度可达微秒级。而真实的Smart200 PLC其扫描周期Cycle Time受多重因素影响CPU处理能力Smart200 CPU ST20/ST30/ST40的扫描周期典型值分别为0.15ms/0.2ms/0.25ms但这只是执行用户程序的时间。加上I/O读写、通信任务、系统管理实际循环时间会浮动。I/O响应延迟按钮信号从物理触点闭合到PLC输入模块采样、滤波、送入CPU存在固有延迟。Smart200数字量输入模块的典型响应时间是10ms交流或3ms直流这意味着按钮按下后CPU最快也要3ms后才能在I0.0读到1。输出刷新延迟同理CPU执行完程序将Q0.0置1到输出模块真正驱动外部继电器或LED还有几毫秒的延迟。仿真器把这些物理延迟统统忽略它假设“输入在t0时刻改变程序在t0.1ms后执行输出在t0.2ms后生效”。而真实世界里从你手指按下按钮到灯亮起整个链路可能耗时15ms以上。TON指令的PT参数是CPU内部的计时器设定值它只负责“CPU内部计时”不负责“从按钮到灯的端到端延时”。所以仿真里TON的3秒是纯CPU时间现场的3秒是你期望的“从按钮松开到灯灭”的总时间它必须包含I/O延迟。3.2 解决方案用“相对时间”替代“绝对时间”并实测校准我的做法是在真实硬件上用示波器或高速摄像头测量“按钮松开”到“灯灭”的实际时间然后反向调整TON的PT值。例如实测发现从松开按钮到灯灭是3.2秒而你期望3秒那就把TON的PT从T#3S改为T#2S800MS。这个2.8秒就是CPU内部需要计时的目标值它补偿了I/O链路的0.2秒延迟。更进一步我编写了一个简易的“延时校准FB”。它接受一个“目标延时”Target_Time和一个“实测延时”Measured_Time作为输入自动计算出应设置的PT值PT : Target_Time - (Measured_Time - Target_Time)。当然这需要你在现场先做一次实测。我通常在项目交付前带着手持式示波器去客户现场对每个关键延时点做三次测量取平均值然后更新所有TON的PT参数。客户看到我拿着仪器认真测量比单纯改个数字更有说服力。提示不要迷信仿真器的“完美计时”。它最大的价值是验证逻辑正确性比如边沿检测是否有效、锁存器是否自保持而非验证时间精度。时间精度必须在真实硬件上用真实信号来验证。4. 从“能用”到“可靠”Smart200 Bool延时的五大实战避坑指南在十几个Smart200项目里踩过的坑让我总结出五条血泪经验。它们不写在任何官方手册里却是保证延时功能在产线上7×24小时稳定运行的关键。4.1 坑一用“常开触点”直接接TON忽视按钮抖动——后果是延时时间随机波动机械按钮在按下/松开瞬间触点会因弹性产生多次弹跳导致I/O点在几毫秒内反复通断。Smart200的输入滤波时间默认为6.4ms这意味着一次抖动可能被滤波器平滑掉但若抖动周期恰好落在滤波窗口外或者多个按钮同时抖动引发干扰TON的IN就会被反复置1/清0ET永远无法稳定累加。我的解法强制在所有按钮信号进入TON之前先经过一个“软件消抖”环节。最简单的是用一个CTU增计数器设定计数值为3时钟脉冲用SM0.51Hz每1秒采样一次按钮状态。只有连续3次采样都为1才认为按钮真正按下连续3次为0才认为真正松开。虽然牺牲了响应速度最大延迟3秒但对于非实时控制如设备启停、报警确认完全够用且100%可靠。对于要求快速响应的场合则采用路径一中的边沿检测法它本质上也是一种“单周期脉冲”消抖。4.2 坑二TON的PT参数用“字面值”硬编码——后果是修改延时时要满程序找TON我曾接手一个别人写的程序里面散布着20多个TON指令PT参数全是T#3000MS。客户说“把所有延时改成5秒”我花了整整半天逐个打开每个TON块修改。后来我学会了所有时间参数必须定义为全局DB块中的变量。例如在DB1中定义DB1.DBW0为WORD类型命名为g_iDelayTime_ms初始值3000。所有TON的PT都设为T#DB1.DBW0。改一个值全站生效。4.3 坑三忽略TON的“复位优先”特性导致延时被意外中断TON指令有一个隐藏特性当IN为0时无论ET是否达到PTQ都会立刻为0且ET被清零。这意味着如果在延时期间按钮因干扰短暂断开哪怕只有1个扫描周期TON就会复位ET归零延时重新开始。这在电磁干扰强的车间如靠近大功率变频器非常常见。我的解法在TON的IN端不直接接原始信号而是接一个“抗干扰滤波器”。最简单的是用一个RS触发器R端接按钮信号经消抖S端接一个固定为1的信号如SM0.0这样只要按钮松开一次RS的Q就置1并保持直到你用另一个信号如急停去复位它。TON的IN接这个RS的Q就能确保延时过程不被瞬时干扰打断。4.4 坑四在同一个扫描周期内对同一个TON多次调用——后果是ET累加异常PLC程序是顺序扫描执行的。如果在一个OB1主循环里TON指令被写了两次比如在两个并行支路中那么第二次调用时TON的内部状态ET已经是第一次调用后的值。这会导致ET被错误地累加两次延时时间翻倍。我的解法严格遵守“一个TON实例一个唯一地址”的原则。在创建TON时务必为其指定一个唯一的背景数据块Instance DB并在程序中只调用这个实例一次。TIA Portal的编译器会警告“重复调用”但很多新手会忽略。4.5 坑五用TON的Q直接驱动输出线圈未加“安全确认”——后果是PLC重启后输出状态不确定TON的Q输出依赖于其内部状态。如果PLC突然断电重启TON的ET和Q都会丢失变成初始值0。这意味着如果灯在延时期间断电重启后灯会立刻熄灭因为Q0而不是继续延时到灭。对于安全相关功能如“停机后冷却风扇需延时运行”这是不可接受的。我的解法对于关键延时输出增加一个“上电保持”逻辑。用SM0.1首次扫描脉冲去初始化一个辅助Bit该Bit的状态保存在保持性存储区如V存储区。TON的Q只负责“启动延时”而最终输出由这个保持性Bit与TON的Q共同决定。这样即使断电保持性Bit的状态也能在重启后恢复确保延时逻辑的连续性。这些坑每一个都曾让我在客户现场加班到凌晨。它们不是理论问题而是每天都在发生的现实挑战。记住PLC编程的终点不是让程序在电脑上跑通而是让它在充满灰尘、振动、电磁干扰的真实工厂里十年如一日地精准执行。5. 延时之外Smart200 Bool信号处理的进阶思考——从“开关”到“状态机”把Bool信号仅仅当作“开/关”两个离散状态来处理是入门级思维。在复杂的自动化设备中一个按钮、一个传感器往往承载着更丰富的状态信息。Smart200虽小但通过Bool延时的深入实践我们可以将其升级为一个轻量级状态机处理器。5.1 “长按”与“短按”的识别延时是状态转换的判据一个启动按钮短按0.5秒是点动运行长按2秒是连续运行。这本质上是一个基于时间的状态判断。实现方法用一个TON监测按钮按下时间。按钮按下TON开始计时按钮松开检查ET值若ETT#500MS则为短按执行点动逻辑若ETT#2S则为长按执行连续运行逻辑若介于两者之间则忽略防抖。这个逻辑的关键在于TON的ET值在按钮松开瞬间被“冻结”并读取。它要求TON的IN必须在按钮松开后立刻断开即用按钮常开触点否则ET会继续累加。我通常用一个SR锁存器来“捕获”松开事件再用这个事件去读取TON的ET。5.2 “脉冲宽度调制”PWM雏形用延时控制占空比Smart200没有专用PWM指令但可以用两个TON配合一个SR锁存器模拟出简单的PWM信号。例如控制一个加热丝的功率设定周期为100ms占空比50%即“开50ms关50ms”。用TON1PTT#50MS控制“开”的时间TON2PTT#50MS控制“关”的时间两个TON的Q输出互锁形成一个振荡器。通过修改TON1的PT就能动态调节占空比。这在小型温控系统中非常实用。我曾用此法为一个实验室烘箱设计温度微调功能成本远低于购买专用温控器。5.3 “故障确认延时”延时是安全逻辑的过滤器在安全回路中一个急停按钮被按下系统必须立刻停止。但一个温度传感器偶尔的误报如瞬时尖峰不应立刻触发停机。这时“故障确认延时”就至关重要只有当传感器信号持续异常超过3秒才判定为真实故障。这正是Bool延时最核心的价值——它为控制系统增加了一层“时间维度”的过滤将瞬时噪声与真实故障区分开来。实现上就是路径一的“关断延时”逻辑的逆用传感器异常信号高电平作为TON的INTON的Q作为“确认故障”信号。只有IN持续为1达3秒Q才为1触发停机。这些进阶应用都源于对“Bool延时”本质的深刻理解它不是一个孤立的功能而是连接物理世界按钮、传感器与控制逻辑状态、安全、调节的一座时间桥梁。当你不再把它看作“加个TON”而是看作“构建一个基于时间的状态判断系统”时Smart200的潜力才真正被释放出来。我在车间墙上贴了一张便签上面写着“PLC不是计算器它是时间的雕塑家。” 每一次延时的精准实现都是对物理世界节奏的一次尊重与驯服。