
每年毕业季都有不少带着“基于PLC的十字路口交通信号灯控制系统设计”这个题目来找我聊方案。很多人以为这是个入门级项目四个红绿灯一个PLC接几根线写几十行梯形图完了。结果一写程序就翻车——要么灯顺序全乱要么走到黄灯就卡死要么按下启动按钮第一次能跑、第二次复位就鬼畜。这个题看着简单真正考验的是状态转换思维。它不是一个“什么时候亮哪盏灯”的问题而是“在任意一个瞬间系统的当前状态是什么、维持多长时间、下一步切到哪”的问题。这篇把整个设计流程捋一遍从需求拆分、时序设计、PLC选型到梯形图和SCL状态机的具体写法再到VMware里跑TIA和PLCSIM的仿真联调最后讲现场接线和答辩扩展方向。面向正在做课程设计、毕业设计的朋友也适合刚入门的PLC学习者用来理解状态控制思想。1. 先想清楚十字路口交通灯到底要控制什么1.1 控制对象不是四盏灯而是“相位”拿到题目先别急着开软件。你面对的不是四个红绿灯而是一组存在冲突的车流。一个标准的十字路口东西方向和南北方向的车流在时间上必须隔离否则就撞了。控制系统的核心任务就是把互不冲突的车流组合分成若干个“相位”让它们依次放行同时保证冲突相位之间永远不能同时绿灯。一个常见的误区是直接想“东西绿灯30秒南北绿灯30秒轮着来”。这太粗糙了。比如东西向直行绿灯放行的时候东西向左转车能不能走南北向左转车会不会和对向直行车冲突人行横道什么时候放行这些问题不梳理清楚程序写出来也经不起推敲。1.2 两相位模型快速理解控制逻辑的最小系统先从一个简化模型入手。双向两车道的十字路口不考虑左转专用相位只有两个基本相位相位A东西方向绿灯南北方向红灯相位B南北方向绿灯东西方向红灯每个相位结束前加一段黄灯用来清空已经进入路口但还没通过停车线的车辆。黄灯时间通常取3秒左右这是经验值车速60km/h时3秒黄灯能覆盖从停车线到路口内部的制动/通过距离。绿灯时间的取值要看路口流量课程设计一般取20到35秒都有。所以最简单的循环是东西绿30秒 → 东西黄3秒 → 南北绿30秒 → 南北黄3秒 → 回到东西绿一个周期66秒。这个模型是理解所有复杂交通灯控制的起点。1.3 带左转的四相位模型实际项目的完整版如果题目要求扩展到左转专用相位很多毕业设计会加这个要求就变成四相位相位1东西直行右转放行南北全红相位2东西左转放行南北全红相位3南北直行右转放行东西全红相位4南北左转放行东西全红每个相位之间还要插入黄灯过渡甚至在全红相位之间加1到2秒“全红清空时间”目的是把滞留在路口中间的车彻底清完再放对向车。这是现实中非常关键的一环——理论上叫“清空间隔”实际中就是防止“抢黄灯”车辆和下一相位第一辆车在路口中间相遇。一个参考时间分配直行25秒左转15秒黄灯3秒全红1秒。单周期总时长是4×(2531)2×15不对四个相位都要包含绿灯、黄灯、全红左转相位的绿灯是15秒。按相位算(2531)(1531)(2531)(1531)96秒。这个阶段做对后续程序怎么写都顺时序错了后面全是白费功夫。2. 方案选型为什么这类题目天然适合PLC以及怎么定具体型号2.1 继电器、单片机、PLC为什么选PLC老一代的交通灯确实有用继电器搭的用一堆时间继电器循环控制。但继电器方案的定时精度差改一个时间参数要重新接线维护起来是灾难。单片机做交通灯也完全可行实验室里用STM32点亮LED模拟红绿灯的课设到处都是。但有个前提单片机方案要自己做电源电路、驱动电路、抗干扰设计而且出了问题单片机程序看不到中间状态调试效率低。PLC在这里最大的优势是“状态可见”。梯形图的每一个触点、每一个输出在在线监控时都是实时的哪一步没走对一眼就能看到。这对应付课程设计和毕业设计太关键了——评委问“你这个程序怎么调试的”你可以现场打开在线监控指着状态位说“当前停在第三步因为定时器没有计时完成条件不满足”。这种说服力是单片机方案不具备的。另外交通灯控制属于典型的开关量控制PLC最擅长的就是这个。输入少、输出少、逻辑简单稳定性还高为什么不选PLC。2.2 西门子还是三菱看你的使用场景型号选择上软件仿真条件方便就用西门子S7-1200配TIA Portal博途原因是PLCSIM仿真成熟、支持SCL状态机编程、可视化在线监控做得好适合一个人折腾。如果学校实验室大量用三菱FX系列就做FX3U配GX Works2用STL步进梯形图写这是教材经典案例参考资料最多。S7-200 SMART也是常见选项价格便宜适合实训室但它的编程软件和S7-1200不同扩展性弱一些。我的建议是如果你不是有明确要求优先选S7-1200因为TIA Portal是三菱之外国内工业界用得最广的生态学完直接能用课程设计答辩也更有说头。2.3 输出类型的选择细节交通灯控制的输出是开关量信号但你要搞清楚PLC输出模块的类型。继电器输出和晶体管输出的区别在于继电器输出带负载能力强交流直流都能带但响应慢、有机械寿命晶体管输出只能带直流负载但响应快、无触点寿命问题。信号灯如果是直流24V的LED灯组晶体管输出完全够用而且晶体管输出支持高频闪烁——后面要做的“绿灯最后3秒闪烁”功能继电器输出也能实现因为闪烁频率只有1Hz继电器跟得上。真正常见的坑是NPN型和PNP型输出的区分PLC的数字量输出接口上NPN型是低电平有效PNP型是高电平有效接错型号灯组不亮。选型时直接问商家“这个型号是源型输出还是漏型输出”再和灯组的公共端接法对上就行。顺便说一句以后你接触PLC控制变频器启停本质和这里控制信号灯一模一样都是数字量输出点给开关信号。区别只在驱动的负载是灯还是变频器端子原理是完全相通的。3. 时序图与状态划分程序逻辑的源头3.1 先把“状态表”画出来而不是急着写程序我见过太多人一上来就在梯形图里拖定时器结果拖到一半自己都晕了。正确做法是先画一张状态转换表把每个时刻的状态编号列清楚再对照表写程序。以两相位为例状态划分如下表状态编号动作描述持续时间切换条件S1东西绿灯亮南北红灯亮30秒T1计时到S2东西黄灯亮南北红灯亮3秒T2计时到S3东西红灯亮南北绿灯亮30秒T3计时到S4东西红灯亮南北黄灯亮3秒T4计时到S1循环回到第一个状态-T4计时到这张表就是程序的骨架。任何交通灯程序只要能在纸上把这张表画清楚代码就只是翻译问题。很多卡在“灯乱跳”的人问题往往出在状态表本身就模棱两可。四相位同理只是多插几个状态。建议用一个整数变量作为状态指针从1到8四相位各含绿灯、黄灯再加全红就更多这样程序里只需要判断“现在处于第几步”逻辑清晰且不容易出错。3.2 绿灯最后3秒闪烁是怎么来的“plc怎么让绿灯闪烁3秒”是最近搜索量很高的一个问题恰好是交通灯项目的加分项。实现思路不复杂在绿灯状态计时的后3秒用一个1Hz时钟脉冲对绿灯输出做“与”逻辑让绿灯在这个窗口内以1秒为周期亮灭。具体做法是先用定时器记录当前状态已经持续的时间和状态总时长做比较。比如东西绿灯总时长30秒当已计时大于等于27秒时说明进入最后3秒此时把绿灯输出和1Hz时钟信号做串联绿灯就变成闪烁了。西门子S7-1200里要在PLC属性里启用系统存储器字节里面会提供1Hz时钟位默认是M0.5三菱FX则是M8013这个1秒时钟脉冲继电器。有一点要注意闪烁只是“指示即将变灯”闪烁结束后必须切到黄灯不能从绿灯闪烁直接跳红灯这是交通法规常识也是逻辑上的硬约束。3.3 启动瞬间的初始态处理一个经常被忽略的细节系统通电启动的那一刻所有状态继电器都是OFF没有状态指针。如果不做初始化程序会“空转”——没有任何输出按启动按钮也没反应。解决方法是加一个初始化网络在首次扫描脉冲西门子是FirstScan三菱是M8002时把状态指针置为1同时把需要复位的定时器、输出全部清零。这样系统一上电就自动进入S1状态不会出现“死机”式的空白期。复位按钮同理按下复位不仅所有灯灭状态指针也要回到1而不是回到0。回到0就会再次“空转”。4. 三种能跑通的程序写法定时器链、STL步进、SCL状态机4.1 写法一定时器链梯形图S7-1200入门版思路是最朴素的用多个定时器串联前一个定时器计时完成启动后一个。每个定时器的常开触点控制对应状态输出最后一个定时器计时到时把所有定时器复位循环开始。以两相位为例网络1启动后T1开始计时30秒同时东西绿输出网络2T1计时到T2开始计时3秒东西黄输出网络3T2计时到T3开始计时30秒南北绿输出网络4T3计时到T4开始计时3秒南北黄输出网络5T4计时到复位T1到T4回到网络1这种写法的优点是直观每个定时器对应一个相位出问题好查。缺点也很明显如果做到四相位带全红间隔定时器数量飙升到十几个梯形图网络一多改动一个时间参数要找半天。作为入门理解非常好但不适合复杂项目。S7-1200里定时器要用IEC定时器TON调用时会生成一个背景DB块。注意不能再像S7-200那样直接用T37这种编号这在刚转到博途的人里是个高频报错点。4.2 写法二三菱FX的STL步进梯形图教材经典方案三菱的STL指令本质上是为顺序控制量身定做的。它把程序拆成一个个“步”每个步用S0、S20这种状态继电器表示步与步之间用SET/OUT指令衔接天然就是状态机的结构。核心结构是S0 初始状态按下启动按钮SET S20 S20 东西绿灯定时器T0计时K30030秒计时到SET S21 S21 东西黄灯定时器T1计时K303秒计时到SET S22 S22 南北绿灯定时器T2计时K300计时到SET S23 S23 南北黄灯定时器T3计时K30计时到OUT S0回到初始每段STL程序只执行当前激活的那一步其他步全部跳过。这意味着梯形图程序长度比定时器链短很多逻辑也“所见即所得”。三菱FX专门有一个仿真软件GX Works2配合GX Simulator能3D动画模拟交通灯很多学校的实验课就是用这个演示的效果非常直观。STL注意的是每个状态结束一定要有“跳转条件”漏掉跳转就会出现“卡在黄灯”的经典故障。为什么会卡因为当前步没有触发下一步的SET指令状态指针停住了。4.3 写法三SCL状态机S7-1200的最佳选择S7-1200最大的优势是支持SCL语言。如果你对C语言有基础SCL状态机是交通灯控制最优雅的写法——整个程序就是一个CASE语句每个CASE分支对应一个状态清晰到答辩时可以直接投影给老师看。核心结构CASE step OF 1: // 东西绿南北红 lightQ : 16#0001; IF timer.Q THEN step : 2; timer(IN : FALSE); END_IF; 2: // 东西黄南北红 lightQ : 16#0002; ... END_CASE;实际操作中一个交通灯SCL程序会包含一个30ms左右的循环中断OB1、一个状态切换逻辑静态变量step、状态总时长数组timeArray、输出映射数组outputArray。用数组的好处是修改时间参数只改一个数据块不需要翻梯形图网络。这是工程上推荐的做法——把“逻辑”和“参数”分离。SCL状态机还有一个隐藏优势方便做状态跳转。比如加一个“夜间模式”开关夜间所有方向黄灯闪烁SCL里只需在CASE前面加一个IF判断跳转到一个特殊状态。梯形图实现这个就要多写好几个网络。4.4 三种写法怎么选写法适合场景优点缺点定时器链梯形图两相位入门、教学演示直观好懂定时器多时维护困难STL步进梯形图三菱课程设计状态清晰、简短仅三菱系支持STL指令SCL状态机S7-1200工程化开发扩展性强、参数分离需要C语言基础我的建议是时间紧就选你实验室最熟的方案如果时间够S7-1200SCL状态机能让你在答辩时讲出“我听懂了状态机的思想”这个分值是梯形图实现给不了的。5. 仿真与联调VMware里跑TIA和PLCSIM的网络连接设置5.1 纯软件仿真一个人一台电脑怎么跑通做交通灯课程设计最普遍的困境是“身边没有PLC硬件”。解决办法是用TIA Portal配合PLCSIM软件仿真。整个仿真环境直接装在VMware虚拟机里也是很多学生的常规操作。先澄清一个点如果你只是TIA和PLCSIM之间互相通信网络连接模式用NAT就行。很多教程一上来就让你设桥接其实是过度配置。因为S7-PLCSIM模拟的PLC是在你的操作系统进程里跑的它和TIA之间的通信不经过物理网卡NAT模式下虚拟机的网络包也能正常路由通信完全没问题。具体步骤是VMware里创建虚拟机装Windows 10安装TIA Portal V16以上版本然后安装S7-PLCSIM再安装PLCSIM的许可证。启动仿真时在TIA的“在线”菜单里选择“下载到设备”目标类型选“PLCSIM”系统会自动弹出一个PLCSIM面板把程序下载进去然后点击运行按钮就能在PLCSIM里看到程序状态了。PLCSIM面板上可以做两件有用的事一是手动修改输入变量模拟按钮按下二是观察输出变量变化相当于在虚拟面板上“看灯亮不亮”。配合TIA的在线监控能看到每个定时器的实时计时值——这是硬件调试很难做到的效果。5.2 虚拟机连真实PLC或上位机联调这个时候才需要桥接当你需要从宿主机物理电脑去访问虚拟机里的PLCSIM或者虚拟机里的TIA要下载程序到一台真实的S7-1200时网络连接模式就必须认真考虑。这个场景下我推荐桥接模式。桥接模式相当于虚拟机直接“插”在你家路由器上和物理机占据同一个局域网。设置时注意三件事第一VMware里网络适配器要选“桥接模式”并勾选“复制物理网络连接状态”避免虚拟机开机时因为物理网卡状态变化而获取不到网络。第二IP地址要规划好。如果物理机是192.168.1.100真实PLC是192.168.1.10那虚拟机也必须是192.168.1.x网段三者不冲突。否则TIA“下载到设备”时根本发现不了目标PLC。第三Windows防火墙必须放行Siemens通信相关端口。默认情况下宿主机和虚拟机的防火墙都会拦截S7通信常见报错是“无法建立连接”“找不到设备”。最简单的处理调试期间把TIA、PLCSIM相关程序加入防火墙白名单或者干脆关闭防火墙仅限隔离的实验室网络环境公共网络千万别关。如果你的场景是“虚拟机里跑PLCSIM Advanced宿主机跑WinCC上位机”那网络配置就要更讲究。PLCSIM Advanced不是普通进程通信它会虚拟出一个以太网接口所以桥接模式是必须的而且要保证宿主机和虚拟机能互相Ping通。IP建议手动设置不要用DHCP因为虚拟机重启后IP变化会导致WinCC变量连接断掉。5.3 仿真过程中的常见坑第一个坑是TIA版本和PLCSIM版本不匹配。TIA V15配PLCSIM V15TIA V16配PLCSIM V16差一个版本都会报“无法找到许可证”或“仿真设备未激活”。检查方法是打开PLCSIM看窗口标题栏的版本号必须和TIA版本完全一致。第二个坑是PLCSIM运行后点击“运行”按钮但梯形图里没有输出。原因多半是OB1没有下载进去或者启动OB被删掉了。解决方法是右键程序块→重新生成软件再整体下载。第三个坑是仿真里无法模拟时间加速。PLCSIM是真实时间运行的30秒的绿灯你就是要等30秒才能看到切换。调试时可以临时把定时器PT值改成3秒等验证完逻辑再改回30秒节省大量时间。6. 硬件接线、输入输出分配与现场调试的坑6.1 输入输出分配表动手接线之前必须做仿真通过之后真正上硬件才是毕业设计见真章的地方。第一步不是拿螺丝刀接线而是做IO分配表。以两相位交通灯为例IO点地址功能说明输入I0.0启动按钮输入I0.1停止/复位按钮输出Q0.0东西红灯输出Q0.1东西黄灯输出Q0.2东西绿灯输出Q0.3南北红灯输出Q0.4南北黄灯输出Q0.5南北绿灯IO分配的原则是先分输入再分输出输入从I0.0开始输出从Q0.0开始留出备用点不要一次用满。如果你用的是继电器输出型PLC信号灯直接用220V供电通过PLC输出触点控制火线通断如果是晶体管输出型信号灯用DC24V供电。6.2 按钮防抖一个小细节毁掉整个循环硬件接线上最容易出问题的不是灯而是启动停止按钮的抖动。按钮是机械触点按下的一瞬间会有几毫秒到几十毫秒的反复通断如果程序直接读取按钮信号做状态切换一个按钮按下去可能触发两次甚至三次状态跳转交通灯循环直接被“抖”乱。解决方式分两层硬件上按钮回路并联RC吸收回路或者选用带自锁的按钮软件上用定时器做20到50毫秒的防抖滤波。三菱里可以用一个TON输入接通后延时20ms再输出只有延时后仍保持接通的信号才认为有效。西门子S7-1200的数字量输入模块本身就带输入滤波功能默认滤波时间是6.3ms在硬件组态里可以调大给按钮输入设10到20ms的滤波就足够。很多人忽略这类细节结果现场调试时“时好时坏”查半天查不出原因。做工程的原则就是任何机械触点输入默认都要考虑防抖。6.3 现场调试的真实教训第一个常见问题是PLC输出点不够用。有些题目要求带人行横道红绿灯再加上左转信号灯输出点数瞬间翻倍。如果选的是S7-1200 CPU自带14DI/10DQ的型号可能IO不够这时要么外扩信号模块要么用输出点复用比如人行横道绿和机动车直行绿同步亮时并联输出。复用要小心并联输出意味着两个负载电流同时流过一个输出点一定要查手册确认输出点额定电流能扛住否则一个点烧了整组灯全灭。第二个问题是灯组功率和PLC输出点容量不匹配。LED信号灯功率不大一般没问题但如果用的是老式白炽灯交通灯单灯就有几十瓦直接接PLC输出触点会过载。正确做法是加中间继电器过渡PLC输出先驱动继电器线圈继电器触点再去带动灯组。这个知识点在答辩时极容易被问到“你的PLC输出点最大负载是多少你的灯组功率是多少要不要加继电器”第三个问题来自接线混淆。接好后一定要用万用表逐个测试断开PLC输出手动给信号灯供电确认每盏灯和地址号能对上。我见过太多“程序明明是对的但红灯绿灯接反了”的案例这种问题在答辩演示时特别尴尬。7. 答辩和进阶从固定周期到智能交通的扩展方向7.1 加一个上位机监控界面如果课程设计只做PLC部分顶多算个中等完成度。要拿高分最直接的加分项是加一个上位机监控界面。S7-1200配上WinCC或者用C#写一个简单的窗体应用通过以太网读PLC的变量在电脑上实时显示“当前相位”“剩余时间”“各灯状态”。这个功能一旦做出来答辩时老师问的就不再是“你程序怎么写的”而是“你怎么做通信的”——问题的层次完全不一样。C#与西门子PLC通信常用的方式是使用S7.netplus这类开源库连接PLC后直接读写DB块和M区。连接前要保证电脑和PLC在同一网段并且PLC的“允许从远程对象获取通信访问”选项被勾选。通信失败时先查Windows防火墙是否放行、PLC是否处于运行状态、IP是否在同一网段这三个排查顺序基本能解决90%的问题。7.2 智能交通方向车流量检测加分更高的方向是把固定周期改成动态周期。两个常见实现方案方案一在路口来车方向安装车辆检测器地感线圈或红外传感器当某个方向在红灯期间检测到有车等待就延长该方向的绿灯时间。PLC编程上用定时器配合检测信号做“延长判断”检测信号在绿灯最后阶段到来时就把当前状态的总计时时间向后推移。方案二把通行时间设置为多档位PLC根据“高峰/平峰/夜间”模式切换。夜间模式最简单也最实用——所有方向黄灯闪烁或者缩短绿灯周期避免无车路口空等红灯。方案一涉及传感器信号采集方案二只需要改状态机的跳转逻辑。从毕业设计性价比来看方案二实现简单且实用性明确强烈建议优先考虑。7.3 常见答辩提问怎么应对交通灯项目的答辩问题其实很固定提前准备好就能稳住“绿灯和黄灯时间你是怎么确定的”——回答要说出黄灯清空路口的原理以及绿灯时间基于流量假设。“如果你这个系统中一个输出点坏了会怎样”——结合PLC的故障诊断机制回答说明可以通过程序监控输出反馈。“这个系统能直接用在实际路口吗”——老实回答功能逻辑可以验证但实际道路需要冗余设计、故障切换和人工干预功能我这里只是原理性实现。不要怕被问到不会的关键是展示出“我清楚自己的系统边界在哪”。最后说点个人体会。这个题目我前前后后带过不少学生做发现最容易拉开差距的环节不是编程本身而是前期的时序设计和后期的调试方法。编程只会占一天把状态转换表想透彻、把边界条件想清楚才是大头。调试的时候别只盯着“灯亮没亮”要学会在TIA的在线监控里看状态指针走到哪一步、定时器的当前值是多少、跳转条件为什么没满足——有了这个基本功以后做任何顺序控制项目都能举一反三。给你一个调试小技巧把状态编号放到PLC的某个M区字里在线监控时直接看这个变量的数字变化比盯着一堆定时器判断程序走到哪儿了快得多。我自己的项目里永远保留这个状态变量哪怕是生产项目也不例外。交通灯只是一个开始但它的状态机思想能陪你走很远。