十字路口交通信号灯大概是PLC学习里被写烂的一个题目,每个入行的人基本都做过,大专院校的课程设计、毕业设计里更是常客。可越是这种看起来简单的项目,真正接手去做的时候越容易翻车:两个方向的绿灯同时亮起来、通电瞬间信号灯乱跳、断电重启以后时序对不上、输出点烧掉……我前前后后做过三四个版本的交通灯控制,从三菱FX系列到西门子S7-200 SMART都试过,踩过不少坑。这篇文章我不讲虚的,就把这个经典项目的完整设计过程拆开给你看,从控制需求怎么拆、I/O怎么分配、硬件怎么选、梯形图怎么写,到现场调试会遇到什么问题,全部过一遍。东西适合正在做课程设计的学生,也适合刚入行准备独立接小项目的电气工程师参考。
1. 控制需求拆解:先想清楚信号灯到底在干什么
1.1 一个60秒周期的时序设计
先厘清控制需求。标准的十字路口,东西方向和南北方向各有一组红黄绿灯,两组灯按照时间顺序交替放行。我在这里以最常见的60秒循环为例:南北方向绿灯亮25秒,然后黄灯亮5秒,这30秒内东西方向始终是红灯;南北方向红灯亮起的同时,东西方向绿灯亮25秒、黄灯亮5秒,然后回到南北绿灯,如此循环。
做成表格就是这样的时序关系:
| 时间段 | 南北方向 | 东西方向 | 对应阶段编号 |
|---|---|---|---|
| 0s-25s | 绿灯亮 | 红灯亮 | 阶段1 |
| 25s-30s | 黄灯亮 | 红灯亮 | 阶段2 |
| 30s-55s | 红灯亮 | 绿灯亮 | 阶段3 |
| 55s-60s | 红灯亮 | 黄灯亮 | 阶段4 |
这里有一个很多人忽略的点:黄灯结束到下一个方向的绿灯亮,中间要不要留全红时间?理论上,为了清空路口内还没通过的车,规范做法是在黄灯结束后加1到3秒的全红时间,也就是四个方向都是红灯。这个要不要加,取决于路口的实际大小和车速。我后面写的方案里会把这个参数预留出来,实际做的时候按路口情况调就行。
在此基础上,还能扩展出夜间黄闪模式、手动控制模式、紧急车辆优先等需求。这些不一定是刚需,但设计系统的时候一开始就把I/O口和程序框架留出来,远比后面再来改方便得多。
1.2 I/O地址分配:动手前先把清单列死
电气项目里最忌讳的就是“边接线边想”,做交通灯也一样。我在动手写程序之前,一定会先把输入输出点地址表列出来,而且尽量多留一两个备用点。这套系统按最低配置来算,输入输出点其实很少,我常用的分配方案是这样的:
| 地址 | 信号含义 | 信号类型 | 备注 |
|---|---|---|---|
| X0 | 启动按钮 | 常开 | 按一下启动运行 |
| X1 | 停止按钮 | 常闭 | 按一下停止循环 |
| X2 | 急停按钮 | 常闭 | 串在运行回路里 |
| X3 | 夜间黄闪模式开关 | 开关量 | 闭合进入黄闪 |
| X4 | 手动/自动切换 | 开关量 | 闭合为手动 |
| X5 | 手动南北绿按钮 | 常开 | 手动时按下南北放行 |
| X6 | 手动东西绿按钮 | 常开 | 手动时按下东西放行 |
| Y0 | 南北绿灯 | 输出 | |
| Y1 | 南北黄灯 | 输出 | |
| Y2 | 南北红灯 | 输出 | |
| Y3 | 东西绿灯 | 输出 | |
| Y4 | 东西黄灯 | 输出 | |
| Y5 | 东西红灯 | 输出 |
为什么输入里要专门加手动控制和夜间模式?因为这是实际路口一定会遇到的需求。夜间车流量小,继续按正常周期跑既费电又让驾驶员等得不耐烦,黄灯闪烁提醒注意通行是通用做法。手动模式则是给交警用的,早晚高峰或者发生事故时,交警到场后需要直接控制某个方向的放行,不能干等着自动程序跑完一个周期。
输出侧注意一点:信号灯是典型的开关量负载,不需要模拟量,也不需要高速脉冲,所以选最普通的数字量输出PLC就能干这个活。但到底选继电器输出还是晶体管输出,这里头有讲究,我放到硬件那一节细说。
1.3 安全联锁:这是整个系统里最不能省的东西
交通灯系统出什么故障都可以,唯独不能出现两个方向同时绿灯,那是直接奔着事故去的。实际工程里必须做几层保护,层层兜底。
第一层是硬件互锁。东西绿灯和南北绿灯的中间继电器线圈回路里,互相串入对方继电器的一组常闭触点。什么意思呢?就是南北绿灯继电器吸合的时候,它的常闭触点会断开东西绿灯继电器的供电回路,反过来也一样。就算PLC程序跑飞了、输出点粘死了,硬件上两个方向也不可能同时得电。
第二层是软件互锁。梯形图里写东西绿灯输出时,串联南北绿灯的常闭触点;写南北绿灯输出时,串联东西绿灯的常闭触点。这层保护的作用是防止程序逻辑错乱。
第三层是逻辑互锁。如果程序本身用状态转移法来写,每个阶段只有一个状态位是接通的,天然不存在两个绿灯同时输出的可能。这种“用结构规避风险”的方式,比你写一大堆互锁触点更可靠,也更容易排查。我下面写梯形图的时候,核心就是用这个思路。
2. 硬件选型与外设电路设计
2.1 PLC选型:这类项目用小型机就够,但要注意输出类型
交通灯控制本身就是典型的小型数字量控制系统,算上备用点也就是十几个I/O,选一台微型或小型PLC完全够用。三菱FX3U-16MR/ES、西门子S7-200 SMART CPU SR20,都是这类项目里的常见选择。两者的共同点是体积小、性价比高、资料多,学生和刚入门的工程师上手都容易。
真正需要想清楚的是输出类型。三菱FX3U的16MR是继电器输出,可以直接接交流或直流负载,但机械触点有寿命限制,动作频繁以后触点电阻会变大,严重时甚至粘连。16MT是晶体管输出,响应快、寿命长,但只能接直流负载,而且输出电流一般只有0.5A左右。我的建议是:不管选哪种输出类型,都别让PLC输出点直接去带信号灯,输出点只驱动中间继电器线圈,信号灯电源独立供电。这样PLC输出点绝大部分时间都在驱动一个很小的直流线圈,负载极轻,寿命和稳定性都有保障。
如果项目里以后考虑接触摸屏、做远程监控,那就别选太寒酸的配置。三菱FX3U系列可以加以太网扩展模块,西门子S7-200 SMART自带以太网口,触摸屏直接网线连上去就能通讯。S7-1200当然更好,但对于一个十字路口信号灯来说,性能过剩,价格也高出一截,不是必须。
2.2 输出侧电路:为什么一定要加中间继电器
信号灯我习惯选DC24V的LED灯板,单灯功率5W到10W,一个路口六个灯,总功率也就四五十瓦。看起来不大,但这里边有个重要的工程思维:让便宜的器件去承担故障风险,保护贵重的PLC。
PLC输出点的标称电流一般是2A,理论上一路带十来个LED灯都没问题。但LED灯板内部有驱动电路,上电瞬间会有一个冲击电流,现场接线稍微有点问题或者灯板进水短路,故障电流就可能超过输出点能承受的范围,轻则烧输出继电器触点,重则烧CPU主板。修一次PLC的时间和费用,够买几十个中间继电器了。
我常用的做法是:每一路PLC输出接一个DC24V线圈的中间继电器,比如MY2NJ这种通用型号,底座式安装,更换方便。中间继电器的触点再控制信号灯的正极回路,信号灯负极统一接开关电源负极。输出回路里每一路串联一个1A到2A的保险管或者小型熔断器,接线端子用带弹簧的直插式端子,方便拆装。整体结构就是“PLC输出点——中间继电器线圈——中间继电器触点——熔断器——信号灯——直流电源负极”。
这里还要提醒一句,PLC的工作电源和信号灯电源尽量用两个独立的开关电源,或者至少把PLC的24V传感器电源和负载电源分开。信号灯频繁通断,电流波动挺大的,如果和PLC共用电源,容易导致PLC电压跌落重启,系统就乱套了。我给PLC配一个60W左右的开关电源,信号灯单独配一个100W的开关电源,各自前面加一个空开,互不干扰。
2.3 输入侧电路:按钮和急停的接法有讲究
输入侧的接线相对简单,按钮和选择开关的一端接PLC输入点,另一端接PLC输入COM端,用PLC自带的24V电源供电就行。但有两个细节值得注意。
第一个是停止按钮和急停按钮要用常闭触点。这是电气安全里“失效安全”的原则:正常工作时,常闭触点是一直闭合的,只有按下去才断开。万一线路断了、接触器坏了、触点掉了,系统会自动停机,不会出现“按了停止却停不下来”的情况。如果你用常开触点做停止,断线了系统还照常跑,那真出事了按什么都没用。
第二个是手动模式和自动模式的切换逻辑。手动模式不是简单地把自动输出断开,而是让手动按钮的信号优先接管输出。具体实现我在程序部分会写,但硬件上要注意选择开关的挡位,最好选带中间锁定位的那种,避免在自动和手动之间瞬间跳变。另外,手动按钮用点动式的,不要用自锁式的,交警在现场是按一下放行一段时间,不是一直按住。
3. 控制逻辑与梯形图实现
3.1 用“状态转移”代替“定时器硬堆”来控制循环
很多新手写交通灯程序,习惯用一串定时器首尾相连地死循环:T0时间到启动T1,T1时间到启动T2……这样写也不是不行,但调试的时候很难受,你根本不知道程序当前在哪一步,而且定时器复位时稍不留神就会出现一个扫描周期的输出抖动。
我更推荐用状态转移的方式。把整个60秒周期拆成四个状态,每个状态用一个辅助继电器表示,当前状态用定时器计时,时间到了就复位当前状态、置位下一个状态。程序结构清晰,排障时看状态继电器的开关状态,一眼就知道系统停在哪个阶段。
三菱FX系列的指令表核心逻辑是这样的:
// 初始上电,进入阶段1 LD M8002 SET M10 // 运行标志自锁回路 LD X000 OR M0 ANI X001 ANI X002 OUT M0 // 阶段1:南北绿 + 东西红,历时25秒 LD M10 AND M0 OUT Y000 OUT Y005 OUT T0 K250 // 阶段1结束,切到阶段2 LD T0 SET M11 RST M10 // 阶段2:南北黄 + 东西红,历时5秒 LD M11 AND M0 OUT Y001 OUT Y005 OUT T1 K50 // 阶段2结束,切到阶段3 LD T1 SET M12 RST M11 // 阶段3:南北红 + 东西绿,历时25秒 LD M12 AND M0 OUT Y002 OUT Y003 OUT T2 K250 // 阶段3结束,切到阶段4 LD T2 SET M13 RST M12 // 阶段4:南北红 + 东西黄,历时5秒 LD M13 AND M0 OUT Y002 OUT Y004 OUT T3 K50 // 阶段4结束,回到阶段1 LD T3 SET M10 RST M13这里用到的M10到M13四个辅助继电器,含义分别是“南北绿灯阶段”“南北黄灯阶段”“东西绿灯阶段”“东西黄灯阶段”。任何时刻只有一个状态位是ON,相当于程序内部先做了一层互锁,两个绿灯同时输出的问题在根源上就被避免了。
对应的算法状态转移关系是固定的环:阶段1用定时器T0计时25秒后跳到阶段2,阶段2用T1计时5秒后跳到阶段3,阶段3用T2计时25秒后跳到阶段4,阶段4用T3计时5秒后跳回阶段1。四个定时器各管各的时间,互不干扰,改配时的时候只需要改对应的K值就行。比如想加3秒全红时间,就在阶段2和阶段3之间插入一个新状态,把周期拉长到63秒。
如果用的是西门子S7-200 SMART,思路完全一样,只是指令写法变成TON定时器,定时器号选T37这类100ms时基的,PT值填250就代表25秒;S7-1200则直接用IEC定时器TON,PT可以填T#25S,更直观。
三菱FX系列里还有步进梯形图指令STL,本质也是状态转移,每个状态对应一个S状态继电器,程序写出来更接近流程图。我个人的习惯是教学和简单项目用辅助继电器加SET/RST,复杂项目用STL,但底层的控制思想是完全一样的。
3.2 初始化和停止逻辑:上电不乱、停机要安全
程序里有一个容易被忽略但很关键的环节:初始化和停止后的状态处理。
先讲初始化。PLC上电的时候,所有辅助继电器的状态是不确定的,有的可能是之前断电前留下的状态,有的可能是上电瞬间随机出来的。如果你不处理,系统一上电就可能跳到任意一个阶段,路口直接乱套。我一般在程序开头用M8002这个初始脉冲,在PLC由STOP切到RUN的第一拍,把所有状态继电器清零,然后强制置位M10,让系统从阶段1开始跑。这样每次上电都是固定的起始状态。
再讲停止。很多人按了停止按钮,就把输出全部断开,灯全灭了,这在路口是不允许的。信号灯全灭比错误显示更危险,驾驶员根本分不清前方是什么状况。我的处理是:停止时进入全红状态,也就是南北红灯和东西红灯同时亮,持续提示所有方向禁行。等重新启动时,系统从阶段1重新开始,而不是接着停止前的阶段继续跑,这样时序最干净。
停止逻辑具体这样写:停止按钮按下,复位M0运行标志,同时复位M10到M13所有状态位,然后置位一个“全红状态”的辅助继电器M14,让它去驱动Y002和Y005两个红灯输出。重新按下启动按钮,M0置位,先复位M14,再置位M10,系统回到正常循环。
3.3 黄闪模式、手动控制、绿灯闪烁的实现
黄闪模式是夜间或低流量时段的标配。实现方式很多,最简单有效的是用PLC自带的1秒脉冲。三菱FX系列里M8013就是一个周期1秒的脉冲继电器,ON和OFF各占0.5秒。黄闪模式下,南北黄灯Y001和东西黄灯Y004都通过M8013控制,相当于用0.5秒的节奏交替点亮熄灭,视觉效果就是标准黄闪。如果你用的PLC没有自带的秒脉冲,也可以自己用两个定时器搭一个,比如T4计0.5秒、T5再计0.5秒,循环往复,效果一样。
手动模式的处理放在输出层,而不是改状态转移逻辑。自动模式下,输出直接跟随M10到M13状态位;手动模式下,X5按下时强制Y000南北绿灯和Y002南北红灯的逻辑,X6按下时强制Y003东西绿灯和Y005东西红灯。注意手动操作时要保持另一方向红灯常亮,且两个手动按钮之间也要互锁,不能同时按下。
还有一个被经常问到的需求:怎么让绿灯闪烁3秒?比如某些路口的左转待转区信号灯,绿色箭头会先闪烁3秒再切黄灯。思路很简单,在绿灯阶段最后的3秒里,让绿灯输出经过一个秒脉冲调制。实现方法是增加一个状态或标志,在当前绿灯阶段剩余时间小于等于3秒时,绿灯输出不再直接接通,而是用M8013的触点串进去控制。路口实际编程时可以用比较指令把剩余时间算出来,或者干脆多分一个阶段出来:比如阶段1A是南北绿灯亮22秒,阶段1B是南北绿灯闪3秒,两段都是东西红灯,然后进入黄灯阶段。这样程序虽然多了一个状态,但逻辑非常直观,调试也方便。
3.4 倒计时显示和车辆检测扩展
倒计时数码显示是很多路口信号灯的标配,但本质上是另一个独立模块。PLC在这里主要做两件事:把当前阶段的剩余秒数算出来,然后通过输出点以动态扫描的方式刷新数码管。剩余秒数可以从定时器当前值换算,也可以用一个秒脉冲计数器,每过一秒把剩余时间寄存器减一。两个方向的数码管各是两位,需要8个输出点做段选,再加上位选控制,输出点占用会明显增加,所以选型时I/O点数要提前多留一些。
车辆检测扩展的思路是通过地磁感应线圈或红外传感器,检测某个方向是否有排队车辆,然后在这个方向的基础绿灯时间上动态增加时长。比如南北方向基础绿灯25秒,检测到有车就每一辆加3秒,上限60秒。程序实现不复杂,用一个计数器累计检测信号,再把计数结果换算成定时器的时间常数即可。真正的难点在现场干扰处理,地感线圈的检测信号很弱,布线稍有不慎就会误触发,这些内容以后有机会单独写一篇展开说。
4. 调试流程与常见问题排查
4.1 先仿真后上电:用仿真软件把逻辑跑顺
我调试这类项目有个铁打的习惯:不接任何硬件,先把程序在仿真器里跑一遍。三菱GX Works2自带GX Simulator仿真器,不需要真实PLC就能模拟运行,软件里可以直接看到Y0到Y5各输出点的时序变化,也能监控M10到M13的状态跳转。西门子S7-200 SMART用PLCSIM,S7-1200用TIA Portal的仿真功能,都有类似效果。
仿真能帮你发现什么?第一是逻辑错误,比如定时器时间到之后状态有没有跳过去、跳过去之后输出有没有跟着变;第二是互锁漏洞,比如强制让M10和M12同时为ON,看输出层有没有兜底措施;第三是边界问题,比如停止按钮按下去之后系统能不能稳定进入全红状态,再次启动能不能从阶段1重新开始。这些如果在仿真阶段就暴露出来,改起来成本很低,真到了现场接好线再发现,一个问题可能就要折腾半天。
仿真的局限也很明显,传感器信号、接线松动、电源波动这些真实世界的东西它模拟不了。所以仿真通过不等于万事大吉,现场调试是绕不开的。
4.2 现场最常见的几个故障和处理思路
我做过这么多次交通灯项目,现场最容易翻车的其实是接线和电源,而不是PLC程序本身。
信号灯不亮但输出点和中间继电器都正常,优先检查接线端子和灯板正负极。LED灯板是带极性的,接反了不会亮;端子压线不实,稍微一震动就接触不良,用万用表通断档测一下就能确认。
输出点有动作但整组灯全不亮,先测开关电源输出有没有24V。信号灯的电源回路里如果有熔断器烧了、空开跳了,也会出现这个现象。我遇到过一回,灯板内部短路,把整路熔断器烧了,后来把所有灯具的接线端子都检查了一遍,拆掉一个进过水的灯板才恢复。
最危险的故障是两个方向同时绿灯。如果是程序逻辑错误,仿真阶段就应该发现;如果仿真没问题但现场出现了,大概率是中间继电器触点粘连或者PLC输出点烧熔了。这时候硬件互锁就是最后的保命措施,所以我前面反复强调,硬件互锁绝对不能省。真出了这个故障,优先断电,然后逐个测量中间继电器触点是否断开,找到问题器件换掉。
运行一段时间后时序乱套,重点查PLC有没有频繁重启。用万用表监测PLC电源电压,如果发现电压跌落明显,十有八九是信号灯电源和PLC电源混在一起了,或者开关电源容量不够。解决办法是分开供电,把开关电源容量放大一档,这是最稳妥的组合。
还有个常见问题:定时时间不准。25秒的绿灯实际可能只有24秒左右,这个和三菱100ms定时器的刷新方式有关,受扫描周期影响会有几十毫秒到上百毫秒的误差,对交通灯来说完全无感。但如果项目要求精确计时,换用10ms定时器或者加专门的时钟指令就行。
4.3 常见问题速查表
| 故障现象 | 可能原因 | 排查与处理方法 |
|---|---|---|
| 两个方向同时绿灯 | 程序互锁失效、中间继电器触点粘连、PLC输出点烧熔 | 立即断电,检查硬件互锁回路,更换粘连继电器,修复输出点 |
| 信号灯不亮但输出有动作 | 接线松动、灯板正负极接反、熔断器烧断 | 万用表测通断,检查端子压接质量,确认灯板极性 |
| 整组灯全不亮 | 开关电源断电、总熔断器跳开 | 测量电源输出,检查空开和熔丝 |
| 运行一段时间时序乱套 | PLC电压跌落、开关电源容量不足 | 分开PLC电源与灯电源,加大电源容量 |
| 停止后灯全灭 | 停止逻辑没有设计全红状态 | 修改程序,停止时强制进入全红 |
| 黄闪不闪或常亮 | 秒脉冲继电器使用错误、定时器参数错误 | 检查M8013或自建秒脉冲逻辑 |
| 手动模式没反应 | 模式切换开关接触不良、手动按钮接错 | 用万用表测量X4/X5输入点是否有效闭合 |
| 绿灯闪烁时间不对 | 定时器K值设置错误 | 核对定时器时基与K值换算关系 |
5. 从交作业到真工程:这个项目还能怎么升级
5.1 自适应配时:让绿灯时间跟着车流量走
固定周期配时是最基础的方案,但真实路口的车流量一天之内波动很大,早晚高峰和深夜需要的绿灯时间完全不同。自适应配时的思路是在路口四个方向埋入地磁感应线圈或者安装视频检测器,持续统计车流量,然后由PLC根据排队长度动态调整绿灯时间。
具体到一个单路口,简单的实现是:南北方向基础绿灯25秒,如果检测到南北方向仍有车辆排队,每个周期延长5秒,最长不超过60秒;东西方向同理。程序里只需要在定时器时间常数的计算逻辑上做一些修改,把K值改成寄存器里的动态值。要做到更精细的优化,可以用模糊控制算法,输入是各个方向的排队长度,输出是下一周期的绿灯分配时间,PLC通过比较和运算指令就能实现。这个方向的研究在智能交通里已经非常成熟,作为课程设计的提升点也很有亮点。
5.2 远程监控和多路口联动
如果现场有几台PLC分布在不同的路口,组网就变得必要。三菱FX3U可以加FX3U-ENET以太网模块,西门子S7-200 SMART直接用自带的网口,通过交换机把各个路口的PLC连到一个局域网里,触摸屏或者上位机组态软件就能同时监控所有路口的运行状态、故障报警和配时参数。
多路口协调是更高级的玩法,也就是常说的“绿波带”:让一条主干道上的几个路口信号灯按照车速和路距算好相位差,车辆以规定速度行驶时能一路绿灯通过。实现方法是在PLC之间通过通信指令交换当前运行阶段和剩余时间,主路口定时广播自己的相位,从路口根据设定的偏移量切换信号。这种联动不涉及复杂的算法,核心是通信协议和时钟同步,但对初学者理解工业网络很有帮助。
现在也有AI辅助生成PLC代码的工具,能快速搭出框架,十来分钟就能生成一个可运行的交通灯程序。但我要泼一盆冷水:AI生成的逻辑往往只考虑了“功能正常”,对互锁、失效安全、现场调试这些工程细节考虑得很少。你可以用它拉初版,但安全相关的逻辑必须自己一条一条核对,甚至亲手重写。PLC程序不是跑通就完事,出故障时能不能安全地停下来,比正常运行时好不好用重要得多。
这个项目我前前后后带过不少学生和新人做过,说两句最深的体会。交通灯看起来只是几个灯轮流亮,但它把PLC项目里最核心的东西全包含了:I/O规划、时序逻辑、互锁安全、抗干扰、调试方法。你能把这个项目从“能亮”做到“不乱亮、不闪断、断电重启不乱套”,再能根据路口的实际情况去加功能、调参数,那PLC这一关就算真正过了。最后再分享一个小技巧:做这类项目,程序注释一定要写清楚每个中间继电器的含义,比如M10就写成“南北绿灯阶段”,M14写成“停止全红状态”。调试到半夜的时候,你会感谢当时写注释的自己。