西门子S7-1200/1500的PLC编程里指示灯定时闪烁大概是最常被拿来练手的小功能。可就这么一个小功能我这些年没少看见有人翻车用两个定时器互相复位却出现奇偶扫描周期不一致用M点做时钟位又和报警输出冲突改完占空比下载后灯干脆不亮了。这篇文章不打算讲空泛的定时器原理而是直接把三种可落地的梯形图方案摆出来——双TON互锁、TON加比较器、系统时钟位每种都附上完整的梯形图写法和选型理由适合正在学S7-1200/1500、或者做设备调试时被闪烁逻辑折腾过的朋友。这三个方法里前两种用程序内部定时器实现第三种直接白嫖CPU自带的脉冲信号。它们没有绝对的好坏只看你手头场景适合哪种。我尽量把时序、踩坑点和使用边界都讲透你照着抄就能用改参数也能自己搞定。1. 动手前必懂扫描周期、线圈唯一性和IEC定时器1.1 扫描周期PLC不是同时干活的很多初学者容易把PLC梯形图理解成通电瞬间所有触点一起动作这是最大的误区。PLC的工作方式是循环扫描读输入→执行用户程序→写输出然后不断重复。一个扫描周期内程序按网络顺序从上到下执行前面的网络先执行后面的网络后执行。这个特性对闪烁逻辑影响很大。举个例子你写了两个定时器互相复位的网络它们不可能同一时刻完成动作一定有一个先、一个后。如果网络顺序和你的时序设计不匹配灯可能多亮一个扫描周期或者出现一次不期望的抖动。对指示灯来说影响不大但如果你把这个逻辑用在高频输出上问题就放大了。我用一个生活化类比解释PLC像食堂一个打饭窗口一次只能处理一个人的需求但速度快到肉眼以为所有人在同时打饭。你设计逻辑时必须按照排队顺序来想而不是所有人都同时动。1.2 线圈唯一性同一个输出只能写一次这是我在现场见过最多的问题。TIA Portal里同一个Q0.0如果出现在两个网络的输出线圈位置那么执行顺序靠后的网络会覆盖前面的结果。也就是说灯会不会亮取决于最后一个网络的状态。很多人写闪烁逻辑时在A网络给Q0.0赋值1又在B网络给Q0.0赋值0心里想的是这两个条件共同决定输出。但PLC不这么理解它会老老实实从上往下执行后写的覆盖先写的。结果就是灯要么常亮要么常灭怎么调都不对。正确做法是一个输出线圈只在一个网络里出现其他所有条件都通过中间M点来组合。比如先把定时器的状态送到M1.0、M1.1再在最后一个网络里把M1.0和其他条件串联最终驱动Q0.0。这样逻辑清晰交叉引用也好查。1.3 IEC定时器S7-1200/1500里没有T1这种全局定时器从S7-200/300/400时代过来的人习惯了直接用T1、T37这种全局定时器地址。但在S7-1200/1500和TIA Portal里定时器变成了IEC定时器也就是基于函数块的实例每个定时器都要挂一个背景数据块DB。这意味着两件事定时器数量几乎不受限制只要你CPU内存够想建多少建多少定时器的Q、ET等状态不是全局地址而是DB里的数据元素。你没法直接在别的网络写一个T1触点得先把Q引到M点再使用。下面三种方案里我会用中间M点来接收定时器的Q状态这是工程上最清晰、也最不容易出问题的写法。S7-1500同样如此虽然它的背景DB可以优化访问但Q引脚接M点这套做法一样适用。2. 方法一双TON互锁最经典的等宽闪烁电路2.1 为什么要用两个定时器你可能会想一个TON定时1秒到达后灯灭不就行了吗问题在于TON到达后如果输入条件还一直为1它的Q会保持为1不会自动变回0。你没法用一个定时器同时完成亮1秒和灭1秒两个动作。所以最朴素的想法是一个定时器管亮的时间另一个定时器管灭的时间两个定时器互相掐脖子——你到时间了我就复位我到你复位了就开始。这就像两个人轮流值班一个下班另一个上班循环往复。这套逻辑的好处是亮和灭的时间可以分别设置不要求等宽。比如你让灯亮2秒、灭0.5秒只需要把管亮的定时器PT设为T#2s管灭的定时器PT设为T#500ms结构完全不用改。2.2 完整梯形图与网络解释下面这套梯形图以通用启停逻辑为框架I0.0是启动按钮I0.1是停止按钮M0.0是运行标志。三个方案我都复用这个框架。网络1启停回路 I0.0_启动 I0.1_停止 M0.0_运行标志 ------| |-------------------|/|--------------------( ) M0.0_运行标志 ------| | 网络2灭灯计时 M0.0_运行标志 M1.1_亮灯计时中间位 IEC_Timer_Dark ------| |-------------------|/|-----------------------(TON) PT : T#1s // IEC_Timer_Dark 的 Q 输出引脚接到 M1.0_暗计时完成 网络3亮灯计时 驱动输出 M1.0_暗计时完成 Q0.0_指示灯 ------| |--------------------------------------------( ) M1.0_暗计时完成 IEC_Timer_Light ------| |--------------------------------------------(TON) PT : T#1s // IEC_Timer_Light 的 Q 输出引脚接到 M1.1_亮灯计时中间位这套逻辑的时序是这样的按下启动M0.0为1开始第一次扫描。此时M1.1为0网络2中M1.1常闭触点闭合暗灯定时器开始计时1秒。这一秒内暗灯定时器Q没有输出M1.0为0网络3里灯不亮亮灯定时器也不计时。1秒后暗灯定时器Q置位为1M1.0变为1。网络3导通灯亮同时亮灯定时器开始计时1秒。再来1秒后亮灯定时器Q置位为1M1.1变为1。下一个扫描周期网络2中M1.1常闭触点断开暗灯定时器被复位M1.0变0灯灭亮灯定时器也被复位M1.1变0。网络2里M1.1常闭触点的条件重新满足暗灯定时器再次开始计时循环从第2步开始。最终结果就是上电先灭1秒再亮1秒周期2秒占空比50%。2.3 初始相位和参数调整的细节用这套方案有一个容易被忽略的初始相位问题上电后灯先经历一个暗的时间然后才亮。如果你希望一上电就立即亮1秒可以调整定时器角色把亮灯定时器放在网络2里先计时。非等宽闪烁也很简单暗灯定时器PT设成你想要的灭灯时间亮灯定时器PT设成你想要的亮灯时间。比如设备运行指示灯通常亮1秒灭1秒人眼舒服故障报警灯则常用亮0.5秒灭0.5秒紧急感更强。这些都只需要改两个定时器的PT值结构不用动。这套方案最大的优点是时序逻辑完全由自己控制适合和别的动作联动。比如某个阀门要间歇动作开2秒、停3秒你控制两个定时器的PT就能直接复用。3. 方法二一个TON加比较器闪烁占空比随心调3.1 思路转换让定时器循环跑再用比较器截取窗口方法一虽然好懂但占空比调节要同时改两个定时器。如果你需要频繁换参数或者想通过触摸屏实时调整亮灭比例方法二会更轻松。思路很简单只用一个TON定时器做周期计时。这个定时器到达设定周期后立刻复位从头开始再计时这样它的当前累计时间ET就会在一个固定范围内反复从0涨到PT。然后我用一个比较指令判断ET在0到X之间时让灯亮这样亮的时间就被精确截出来了。3.2 完整梯形图与参数含义网络1周期循环计时 M0.0_运行标志 M1.1_周期到达中间位 IEC_Timer_Cycle ------| |-------------------|/|-----------------------(TON) PT : T#2s // IEC_Timer_Cycle 的 Q 输出引脚接到 M1.1_周期到达中间位 网络2占空比窗口判断 运行允许 M0.0_运行标志 CMP Q0.0_指示灯 ------| |------------------| |------------------------( ) IEC_Timer_Cycle.ET T#1s理解这个逻辑核心是理解ET的波形TON周期设为2秒所以ET从T#0s涨到T#2s到达后复位重新从0开始。比较器判断ET T#1s代表在一个2秒周期里前1秒条件成立后1秒条件不成立。所以灯前1秒亮后1秒灭循环反复。要想改占空比只改比较器右边的T#1s要想改闪烁频率只改定时器的PT。比如想要亮0.3秒、灭1.7秒就把比较值改成T#300ms周期还是2秒。想要1分钟闪一次就把PT改成T#1min比较值改成T#30s。注意比较器两个输入别接反。我把ET放在IN1T#1s放在IN2触点导通条件是IN1 IN2。如果你反着接会得到完全相反的闪灭逻辑当时监控时还很难看明白。3.3 停止状态容易踩的常亮坑方法二有个比方法一更隐蔽的坑如果TIA程序里M0.0为0TON不运行IEC_Timer_Cycle的ET会停在0。此时比较器ET T#1s是恒成立的如果你比较器后面不串联M0.0灯会一直亮着而不是灭掉。所以网络2里必须把M0.0运行标志和比较器触点串联。这是我在现场帮人排查过的问题对方说按下停止灯还在闪我一看就是少了这个串联触点。方法一没有这个问题因为M0.0为0时暗灯定时器不运行M1.0本来就是0灯自然灭。这也是方法二在结构上不如方法一直观的一个点。另外要注意ET的数据类型是Time比较器左右两边都得是Time类型的值。T#1s这种写法是正确的别顺手写成1或1000。如果你用的不是TIA Portal的IEC定时器而是自己用DINT变量累加的毫秒计数器那比较器就按整数比较两边数值含义要统一。4. 方法三系统时钟位几乎零成本的白嫖方案4.1 开启时钟存储器CPU自动给你发脉冲S7-1200和S7-1500的CPU本身就带一组时钟脉冲信号不用写任何定时器就能用。你只需要在组态里把它打开在设备组态中选中CPU打开属性→系统与时钟存储器勾选启用时钟存储器字节把字节地址设为比如100。这样MB100的每一位都会按固定频率输出方波占空比都是1:1。常见频率对应关系如下位地址频率周期M100.010 Hz0.1秒M100.15 Hz0.2秒M100.22.5 Hz0.4秒M100.32 Hz0.5秒M100.41.25 Hz0.8秒M100.51 Hz1秒M100.60.5 Hz2秒M100.70.1 Hz10秒这里1Hz意味着1秒内高低电平各0.5秒也就是灯亮0.5秒、灭0.5秒。如果需要非常快的闪烁用M100.010Hz如果要做周期很长的呼吸灯可以用M100.710秒一个周期。4.2 只用两个触点梯形图短到极致网络2指示灯闪烁 M0.0_运行标志 M100.5_1Hz Q0.0_指示灯 ------| |-------------------| |-----------------------( )你没有看错闪烁逻辑就这一行。如果不需要启停条件甚至可以只剩一个触点、一个线圈。这套方案的优势是资源占用几乎为0不消耗定时器不产生额外的扫描周期延时逻辑一目了然。现场如果有一排指示灯都要闪用系统时钟位就是最优解每个灯串一个不同频率的时钟位程序代码量极小调试成本低运维也清楚。4.3 时钟位的边界为什么它不是万能的系统时钟位虽然省事但局限性也很明显频率只能从表里选档不能自定义任意频率。想要1.8Hz、2.2Hz这种频率时钟位做不到。占空比固定1:1没法做亮3秒灭0.5秒这种非对称闪烁。它是CPU属性必须下载硬件配置才生效。如果你只下载程序块时钟位可能不工作。时钟位共享MB100这个字节如果你程序里不小心把M100.5当普通中间点写过它的脉冲信号就被覆盖了。所以设置地址时最好选一个程序里没用到的高位字节比如MB100、MB200而不是默认的M0区。我在一个项目里用过M0.3接故障灯快闪后来另一个工程师在程序里用M0.3做了普通中间继电器逻辑排查了很久才发现是两个用途撞了地址。从那以后我习惯把时钟存储器地址固定设到MB100并在程序注释里明确写上MB100为系统时钟禁止程序写入避免后人踩坑。5. 三种方法放一起比现场怎么选5.1 对比表一眼看清差异对比项双TON互锁TON比较器系统时钟位定时器占用2个1个0个占空比调节分别改两个PT改比较值即可固定1:1不可调频率调节两个PT都改改PT固定8档资源开销中中低极低初始相位控制可调受ET趋势影响不可控逻辑复杂度中等中高极低典型场景设备间歇动作、多逻辑联动报警灯、可调占空比指示批量指示灯、状态指示5.2 我的选型心法我自己的取舍标准很简单只要频率在表里、占空比不需要特殊处理优先用系统时钟位。三个指示灯、八个指示灯全部用时钟位代码清爽到爆炸。需要自定义占空比、或者要频繁改参数用TON加比较器。比如设备需要保养了这种黄灯亮0.3秒灭1.7秒比均匀闪烁更容易被注意到又不刺眼尤其适合。如果闪烁这个动作要和别的动作逻辑联动比如亮灯的同时打开注油阀闪烁3秒后启动下一工序用双TON互锁。因为你可以从定时器的Q状态引出各种中间M点灵活性最高。实际项目里我经常混用。一个典型场景设备面板上有运行灯、故障灯、维护灯。运行灯用系统时钟位1Hz慢闪故障灯用5Hz快闪维护灯用TON加比较器实现自定义占空比亮0.3秒灭2秒。这样一个项目里三种方案各司其职没有一种浪费。5.3 一个容易忽略的精度问题三种方案的实际闪烁周期都会受到扫描周期影响。OB1扫描周期如果是10ms那么定时器ET的精度大约就是10ms1秒的闪烁周期可能是0.99秒或1.01秒。对指示灯这个精度完全够。如果你在S7-1500里做高速输出、或者要做精密节拍控制别用OB1里的普通定时器应该把逻辑放到循环中断OB里并设置一个较短的循环时间比如10ms或1ms。这个思路比纠结用哪种闪烁方案更关键。6. 从现场调试里捞出来的坑与排查套路6.1 灯不闪反而常亮先查交叉引用现象下载程序后灯常亮按停止也不灭。排查打开TIA Portal的交叉引用功能搜索Q0.0。这时候你会看到Q0.0的写访问可能出现在好几个地方。如果确实有多个线圈写同一个Q0.0那就是覆盖问题。把除最终输出外的所有线圈改成中间M点重新下载问题解决。这是我踩过最多次的坑而且每次踩完都很懊恼——因为TIA的交叉引用功能就在那里我却总是先怀疑PLC坏了。6.2 定时器Q状态在别的网络用不了先引到M点现象方法一里你写了暗灯定时器Q触点在网络3中用但编译报错或者在线监视一直为0。原因IEC定时器的Q是引脚状态不是一个可以直接在任意网络引用的全局操作数。你需要在TON方框的Q引脚上接一个M点让M点接收这个状态其他网络再用M点。我在第2章给的梯形图里就是这么做的M1.0接暗灯定时器QM1.1接亮灯定时器Q。如果不这样做你会在TIA里绕很大一圈最后还是得乖乖回到M点中转。提示给M点起名字时别起定时器1完成中间位这种含糊的名字直接写暗灯计时完成亮灯计时完成后面看程序的人能少死很多脑细胞。6.3 系统时钟位下载后不工作可能没下硬件组态现象时钟表也勾了地址也设了在线监视M100.5却一直是0。原因时钟存储器属于CPU的硬件设置不是用户程序内容。很多人只下载了PLC程序没有下载硬件配置CPU里还是旧参数。解决在TIA Portal里执行下载到设备时勾选硬件配置部分或者直接选择全部下载。下载完成后可以通过在线与诊断里查看CPU属性确认时钟存储器字节地址是否生效。6.4 闪烁周期和设定值差一个扫描周期现象设了1秒实际亮灭周期是1.01秒或1.02秒用秒表能感觉出来。原因TON的计时精度受扫描周期限制并且网络执行顺序导致定时器复位和重新启动之间存在一个扫描周期的间隔。处理对指示灯无所谓。如果非要对时间敏感的场景较真把相关逻辑放到循环中断OB里保证固定的执行周期。S7-1200/1500都支持循环中断OB在CPU属性里可以设置循环时间。6.5 停止后灯竟然还闪一下现象按下停止按钮后灯还会再闪一次才彻底灭掉。原因这是双TON互锁方案里常见的复位延迟现象。停止信号到来时当前扫描周期可能已经执行到亮灯定时器那段网络灯在本周期内继续保持输出直到下一个扫描周期输出才被清零。处理如果要求停止后最多几十毫秒内必须灭灯可以在启停回路的最后加一个停止标志对输出做强制清零或者把输出刷新放到更靠后的OB里。实际应用中这个延迟通常在几十毫秒以内大多数现场完全能接受。结尾我的习惯用法搞这么多年设备调试我现在遇到灯光闪烁需求第一反应永远是问三个问题要不要自定义占空比要不要自动调节频率这个灯和别的动作有没有联动答案组合下来基本就落在上面三种方案里。我也经常用系统时钟位做运行指示用双TON做间歇动作逻辑两种思路在公司好几个项目里来回用目前没有因为闪烁逻辑本身出过问题。如果你刚接触S7-1200/1500建议把三种方案都在TIA Portal里建个测试项目跑一遍用PLCSIM仿真观察ET和Q的变化再把占空比参数改一改直观对比它们的行为差异。纸上谈兵看十遍不如自己动手调试半小时。真到现场遇到闪烁相关的疑难问题回来翻这篇文章应该能帮你省下不少排查时间。