S7-200 PLC交通灯控制:梯形图顺序控制实战拆解
交通灯控制估计是S7-200玩家绕不开的入门项目也是我带新人时最爱拿来考人的一关。做PLC梯形图这行久了你会发现很多设备控制说白了就是输入输出加逻辑而交通灯这个东西恰恰把输入输出、定时器、辅助继电器、顺序控制这几个最基础也最核心的点全串起来了。它不是那种“看一遍学会”的项目而是“搭一遍程序、调一遍时序、踩一遍坑”才能真正吃透的实战题。这篇文章我准备用一套可以直接下载到S7-200里跑的程序完整拆一遍两相位交通灯的控制逻辑。从时序需求分析、I/O分配到梯形图核心网段怎么搭、定时器链怎么互相咬着走再到调试时那些“骚操作”全部按实战笔记的方式给你捋清楚。不管你是刚接触PLC的学生还是想复习顺序控制的工程师哪怕你之前练过抢答器这类PLC控制系统设计只要会启保停和定时器的基础用法这套拆解都能让你少走不少弯路。1. 项目概述与需求拆解1.1 为什么练手要选交通灯控制很多人觉得交通灯太简单不就是绿灯亮了红灯灭嘛真上手写程序才发现没那么轻松。我见过好几个新人程序写出来仿真一看东西方向绿灯还没走完南北方向绿灯也亮了四岔路口直接“全绿”那场面交警来了都得愣三秒。问题出在哪就是没有把时间顺序和状态切换理清楚。交通灯这个项目好在哪它和抢答器这类输入型练习不一样抢答器练的是“谁先按下谁锁定、其他失效”的互锁和置位逻辑而交通灯练的是纯时间驱动的顺序控制在任意一个时刻系统必须处于某一个确定阶段阶段和阶段之间不能重叠、不能跳变而且要能无限循环下去。这种“状态机”思想差不多是所有复杂自动化设备的基础。另外S7-200作为入门级PLC指令集简洁编程软件不管是原厂STEP 7-Micro/WIN还是兼容的AutoShop功能都很直观特别适合拿来做这种带时间轴的项目。你会在这里接触到定时器的分辨率、循环复位的时机、双线圈的避让这些问题这些经验后面做任何顺序控制项目都用得上。1.2 控制需求建模先把时序表列明白我习惯写程序前先不碰电脑拿张纸把需求拆清楚。交通灯的控制对象是十字路口两个方向东西方向和南北方向。每个方向有红、黄、绿三色灯总共6个输出点。这次我采用一个比较标准的两相位方案绿灯结束后加一段“绿闪”提醒再切黄灯然后才轮到另一个方向。具体时序如下阶段时间东西方向南北方向S120秒绿灯红灯S23秒绿灯闪烁红灯S32秒黄灯红灯S420秒红灯绿灯S53秒红灯绿灯闪烁S62秒红灯黄灯S6结束后回到S1形成循环。注意几个细节。第一绿闪不是单独一路输出它还是绿灯那个输出点只是用1秒时钟信号去控制它通断第二任意时刻两个方向绝不会同时出现允许通行的信号这是交通灯控制的底线第三S1到S6六个阶段必须严格依次切换不能出现阶段重叠。把这张时序表吃透了后面的梯形图其实就是“怎么把这六个阶段用定时器和辅助继电器表示出来”的问题。这张表也是你后面调试时判断程序行为是否正确的依据。2. 控制方案选型与I/O分配2.1 三种程序思路怎么选同一个交通灯控制老手和新手的写出来的程序可能完全不一样。我在带人的时候会故意让他们多试几种方案这里把几种主流思路列出来对比一下。第一种是定时器链方案也是最直观的思路。用多个定时器前一个定时器到点后触发下一个定时器像链条一样一节咬一节。优点是容易理解适合做基础教学缺点是阶段多了以后定时器之间的互锁条件会变得很绕改一个动作可能要牵连好几个地方。第二种是阶段标志位方案我这次程序用的就是这种思路。给每个阶段设一个辅助继电器M1.0到M1.6哪个阶段导通对应的M点就是1其他都是0。阶段之间的切换用定时器触发“复位当前阶段、置位下一阶段”来实现。优点是逻辑清楚、排障方便你看一眼M点状态就知道现在跑到了第几步。第三种是SM0.5加计数器的方案用S7-200内部1秒时钟脉冲SM0.5去驱动计数器再用比较指令判断当前计数值落在哪个时间区间里。这个方案程序最精简但需要你对比较指令和数值范围有比较好的把握新手容易把时间区间边界算错。我自己的建议是如果是学习阶段优先用第二种方案把阶段标志位的逻辑吃透后面再去看第一种和第三种你会发现它们之间其实是相通的。2.2 输入输出分配与接线注意这套程序我用到的输入输出相当简单一个启动按钮、一个停止按钮加6个灯。具体分配如下地址功能说明I0.0启动按钮常开触点按下启动运行I0.1停止按钮常闭触点按下停止并复位Q0.0东西绿灯含绿闪时段Q0.1东西黄灯Q0.2东西红灯Q0.3南北绿灯含绿闪时段Q0.4南北黄灯Q0.5南北红灯接线时有几个经验点。S7-200的CPU有继电器输出和晶体管输出两种类型继电器输出带负载能力强一些但动作频率不能太高交通灯这种低频开关用继电器输出完全没问题直接用外部24V电源给信号灯供电就行。公共端的处理要特别小心。S7-200的输出端子是按组划分公共端的比如Q0.0到Q0.3可能共用同一个COM端Q0.4到Q0.5又是另一个COM端。接负载时每组负载的电源极性要一致不能一组接24V正极做公共、另一组接24V负极做公共否则轻则灯不亮重则烧输出点。还有一点信号灯如果是感性负载比如带变压器的老式灯建议在负载两端并联续流二极管或者阻容吸收不然断电瞬间的反向电动势容易冲击输出继电器触点触点寿命会明显缩短。3. 梯形图核心逻辑拆解3.1 总控启停电路程序一上来我先做运行标志位M0.0的控制这是整套程序的“总闸”。逻辑很简单按下启动按钮I0.0M0.0置1并自锁按下停止按钮I0.1M0.0断开。但是停止按钮我建议你用常闭触点接入PLC这样接线断线时系统会自动停机符合安全习惯。这个网段在梯形图里其实是一个最经典的启保停电路我按S7-200的指令列表方式写出来方便你理解实际编程时在梯形图里照这个逻辑搭Network 1 启动/停止控制 LD I0.0 O M0.0 AN I0.1 M0.0运行标志M0.0后面会作为所有阶段标志位的总使能条件。它不直接驱动任何外部负载只负责控制内部逻辑的通断这也是一个很重要的工程习惯把“设备级控制”和“逻辑级控制”分开后面改起来互不干扰。3.2 阶段标志位与六段定时器链这是整套程序的心脏。我用M1.0到M1.6六个辅助继电器分别代表S1到S6六个阶段。初始状态即按下启动按钮那一刻置位M1.0表示系统从阶段1开始运行。按下启动按钮后先用一个上沿指令EU捕捉启动瞬间把M1.0置位同时把M1.1到M1.6复位确保系统从S1开始而不是从乱七八糟的中间状态开始。这一步非常重要否则你上次停机时停在哪个阶段下次启动就从哪个阶段继续交通灯会进入不确定状态。接下来是关键的部分——阶段切换。每个阶段由一个定时器计时计时到点后执行“当前阶段复位 下一阶段置位”。以S1到S2的切换为例Network 2 阶段S1东西绿灯 20秒 LD M1.0 TON T37, 200 Network 3 阶段S1到S2切换 LD T37 R M1.0, 1 S M1.1, 1注意这里T37的PT值是200因为S7-200里T37属于100ms分辨率定时器PT值乘以100ms才是实际定时时长。200乘以100ms等于20秒。这是新人最容易踩的坑有人直接把PT填20结果绿灯只亮2秒有人填2000绿灯亮到天荒地老。后面的S2到S3、S3到S4……都是同一种套路只不过换不同的定时器编号和阶段标志位。S6段结束后要回到S1所以S6的定时器到点后执行“复位M1.6、置位M1.0”即可。这里有个很容易犯的错S6到S1的切换和系统启动的初始化都用S M1.0指令看起来一样但含义完全不同。启动初始化是“不管之前在哪都回到S1”而S6切换是“正常走完一个循环回到S1”。两者并存时要注意启动时的复位指令要把六个阶段全部复位一遍避免残留状态影响循环。3.3 输出映射与双线圈避让阶段标志位本身并不直接驱动外部灯那样写会非常啰嗦。更好的做法是单独拉一组输出网段把“阶段状态”翻译成“输出信号”。以东西绿灯Q0.0为例它什么时候亮阶段S1常亮阶段S2闪烁。翻译成梯形图Network 10 东西绿灯输出 LD M1.0 O M1.1 AN SM0.5 // 用1秒时钟信号实现绿闪 Q0.0等等这里有个陷阱。如果你写的逻辑是“M1.0接通时Q0.0为1M1.1接通时Q0.0为1”然后把两个线圈分开写比如LD M1.0 Q0.0 LD M1.1 AN SM0.5 Q0.0这就在程序里对Q0.0写了两次输出线圈也就是常说的“双线圈”。S7-200扫描机制下后一个线圈的最终状态会覆盖前一个线圈的状态结果就是M1.0接通时Q0.0反而可能不亮程序行为完全失控。正确做法是像前面那样把同一个输出的所有导通条件先做“或”运算合并最后只写一次输出线圈。这个原则对所有输出点都适用不光是绿灯。其他几个灯的逻辑同理。红灯最简单比如东西红灯Q0.2只在S4、S5、S6阶段亮LD M1.3 O M1.4 O M1.5 Q0.2注意S7-200梯形图里的“或”指令就是LD后面接O你也可以在梯形图里直接把三个触点并联效果一样。4. 梯形图“骚操作”与调试技巧4.1 每行注释怎么用最有价值很多人在AutoShop或者STEP 7-Micro/WIN里写程序注释能省则省觉得“我自己写的还能看不懂”结果两周后回来看T37是多少秒、M1.2是哪个阶段全靠猜。这里我强烈建议你养成“每行注释”的习惯。AutoShop里可以在每个梯形图网段和每一行后面直接添加注释说明原厂的STEP 7-Micro/WIN也有对应的Network Comment和语句注释功能。别小看这一点实际工程维护时最值钱的就是这些注释。但注释不是乱写要遵守几个原则。第一注释要写“意图”而不是“行为”。比如“T37到点后复位S1置位S2”这种注释等于把梯形图翻译了一遍没意义。应该写“东西绿灯20秒结束切换到绿闪阶段”这样你一眼就知道这段逻辑在真实场景里是干什么的。第二阶段标志位这种核心变量建议在程序开头集中注释最好画一个简单的输出状态表放进注释里。我自己习惯在程序第一个网段用注释块把六个阶段、对应定时器编号、对应输出状态全部列清楚后续查问题根本不用翻时序表。第三定时器编号和分辨率要标注清楚。S7-200的定时器编号不同分辨率不同我见过有人用T37计时20秒没问题后来换了个定时器T33PT值照抄200结果实际只跑了2秒因为T33是10ms分辨率。这种问题查起来折腾死人但如果你注释里写了“T37100ms分辨率PT20020秒”排查起来就是一眼的事。4.2 监控、状态表与交叉引用的组合拳程序写完不等于完事调试才是真正考验功力的环节。S7-200的编程软件里有几个功能是必须用熟的组合起来效率翻倍。首先是程序状态监控。把PLC切到RUN模式打开程序状态监控梯形图上所有触点、线圈的实时通断状态都会用颜色标识出来。这时候你看M1.0到M1.6这六个辅助继电器应该能明显看到它们像跑马灯一样一个接一个亮过去顺序和时序表完全一致。其次是状态表。状态表这个功能好用在能把分散的变量集中在一个表格里同时监视不用在梯形图里来回翻。我会建一个状态表把M0.0、M1.0到M1.6、T37到T42、Q0.0到Q0.5全部放进去。定时器的当前值在状态表里会实时变化你可以直接看到当前计到多少了是不是按时序表在走。然后是交叉引用。这是排查双线圈问题最趁手的工具。你只需要在交叉引用表里搜Q0.0它会列出程序里所有出现过Q0.0的位置。如果发现同一个输出出现在两处以上别犹豫就是双线圈老老实实合并逻辑。还有一个骚操作是强制功能。调试时如果发现某个输出接线的灯不亮可以先判断是程序问题还是接线问题。用强制功能直接把Q0.0强制为1如果灯亮了说明接线没问题问题在程序如果灯不亮那就去查线路。这个方法能让排查范围直接缩小一半。4.3 绿灯闪烁的两种写法绿闪这个功能看着简单写法上其实有讲究我把我用过的几种方式都说说。第一种写法把SM0.5直接串在输出逻辑里。SM0.5是S7-200内置的1秒时钟脉冲1秒ON、1秒OFF。前面3.3节里东西绿灯Q0.0的输出逻辑就是这么干的M1.1阶段时SM0.5每1秒通断一次绿灯就一闪一闪。这种写法最直接。第二种写法用定时器自己生成闪烁信号。有些场景下你不一定方便用SM0.5或者想要非对称闪烁比如亮1.5秒、灭0.5秒就需要自己写。方法是用T50和T51两个定时器互相触发T50定时1.5秒到点后触发T51定时0.5秒T51到点后再触发T50循环往复形成一个周期2秒的振荡电路。T50的常开触点就是“亮”的时间段。这里要提醒一点SM0.5是1秒恒定的方波但PLC程序的扫描周期会带来微小的延迟如果后续有多处地方都用到SM0.5你会发现各处的闪烁可能存在肉眼不易察觉的相位差。如果两个方向的绿灯闪烁要求严格同步实际场景一般没这么严格那就用一个辅助继电器做闪烁中转站先把SM0.5的状态锁存到M2.0程序里统一用M2.0触点。具体采用哪种方式看你对代码简洁度和灵活性的取舍。我一般情况下直接用SM0.5图省事如果闪烁节奏有特殊要求再上自定义振荡电路。5. 实战中的常见问题与避坑清单5.1 常见问题速查整理了一下这套程序在实际运行中遇到过的典型问题按现象、原因、解决方法排了个表故障现象可能原因排查方向按下启动按钮没有反应PLC没在RUN模式启动线路接线错误M0.0自锁失效先看PLC状态灯再在状态表监视M0.0某个方向灯全不亮输出点接线松了公共端电源缺失输出触点烧坏用强制功能强制Q输出判断是接线还是驱动问题绿灯一直闪把SM0.5错误串到了常亮阶段闪烁标志写串了检查各阶段输出逻辑特别是M1.1和M1.4相关网段出现两个方向同时“放行”阶段标志位重叠双线圈输出干扰定时器链切换逻辑错误用状态表观察M1.0到M1.6是否有相邻两个同时为1断电重启后时序混乱启动初始化没做彻底掉电保持区地址冲突检查启动时是否有R M1.0, 6的复位操作定时时间不对定时器分辨率没弄清楚PT值算错对照注释确认定时器编号的分辨率再算PT值停止后再启动灯从中间阶段开始停止时阶段标志没复位启动时初始化没执行检查停止逻辑和启动初始化网段5.2 我踩过的坑和解决思路这部分是掏心窝的话了。第一次做交通灯项目时我以为自己五分钟就能搞定结果在定时器链的复位逻辑上卡了一下午。当时我用的就是很原始的定时器链写法T37控制S1T37到点后T38开始计时结果我发现T38计时到后整个链条会从头重新开始但T37因为使能条件又满足了导致它又开始计时两个阶段的定时器同时在工作输出直接乱套。后来我想明白了一个道理定时器链的核心不只是“前一个到点触发后一个”而是“后一个触发后必须断开前一个”。这就是为什么要用阶段标志位因为M1.0导通时只有M1.0导通M1.1导通时M1.0必然已经断开不存在定时器同时计时的隐患。还有一个坑是公共端接线。我以前接过一个项目继电器输出模块的Q0.0到Q0.3共用一组公共端我把Q0.0接的负载用了24V正极做公共Q0.1却用了24V负极做公共结果一上电保险丝就跳闸。后来量了才发现两组负载电源极性不一致相当于把24V电源正负短接了。调试阶段还有个很实用的经验把时间先缩短。别一上来就20秒、3秒、2秒地测等一个循环要50秒改个程序看效果要等到花儿都谢了。我调试时会把所有定时器的PT值除以1020秒变2秒、3秒变0.3秒先快速验证逻辑对不对确认无误后再把时间改回去。这个小技巧能帮你一次调试节省大量时间。5.3 调试提速的小技巧最后分享几个我实际调试过程中摸索出来的加速技巧。第一善用“单次扫描”功能。如果程序里时序总是乱可以在RUN模式下用“单次扫描”逐小段执行程序观察每个扫描周期里M点状态的变化情况。这个功能很多新手不知道但它对定位逻辑错误非常有用。第二程序下载前先编译编译报错时看清楚是“重复输出”还是“非法指令”。如果是“重复输出”直接跳转到交叉引用把重复输出的地方全部找出来合并。第三如果PLC支持在线修改那调参数会方便得多。把定时器PT值做成VW区变量比如用VW0存放阶段S1的时间、VW2存放S2的时间这样不用重新编译下载就能在状态表里修改定时时间。我之前给一个客户做方案验证就是用这种方式现场调时间比重新下载程序快了不知道多少。第四养成交叉引用和程序状态监控同时开的习惯。左边开着交叉引用右边开着状态表中间是梯形图界面出问题三个面板来回看很多疑难杂症就是这么一点点抠出来的。这套交通灯程序如果你能独立敲完、独立调试通过你对S7-200的顺序控制、定时器用法、输出映射、常见坑点基本就有比较完整的认识了。我自己现在写稍微大点的程序比如多工位装配设备、自动包装线底层逻辑本质上还是那套东西只是阶段多了I/O多了时序复杂了但思考方法和做交通灯的时候一模一样。所以这个项目真别嫌它简单把简单的东西做明白复杂的东西才有基础去啃。最后再补充一个扩展思路这套程序你完全可以加一个“夜间模式”用一个切换开关区分白天和夜间夜间只有黄灯闪烁其余灯全灭。实现起来也不难就是在总控逻辑里串一个模式选择触点核心逻辑完全不用动。搞完这个你再回头看交通灯项目会发现它其实是一棵很值得挖的“老树”每次挖都能有新东西。