PLC十字路口交通信号灯控制:从时序设计到状态机实现
2026/9/15 3:19:12 网站建设 项目流程

每年毕业季,都有不少带着“基于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×(25+3+1)+2×15?不对,四个相位都要包含绿灯、黄灯、全红,左转相位的绿灯是15秒。按相位算:(25+3+1)+(15+3+1)+(25+3+1)+(15+3+1)=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秒,同时东西绿输出
  • 网络2:T1计时到,T2开始计时3秒,东西黄输出
  • 网络3:T2计时到,T3开始计时30秒,南北绿输出
  • 网络4:T3计时到,T4开始计时3秒,南北黄输出
  • 网络5:T4计时到,复位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计时K300(30秒),计时到SET S21 S21 东西黄灯:定时器T1计时K30(3秒),计时到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-1200+SCL状态机能让你在答辩时讲出“我听懂了状态机的思想”,这个分值是梯形图实现给不了的。

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 V15,TIA 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区字里,在线监控时直接看这个变量的数字变化,比盯着一堆定时器判断程序走到哪儿了快得多。我自己的项目里永远保留这个状态变量,哪怕是生产项目也不例外。交通灯只是一个开始,但它的状态机思想,能陪你走很远。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询