
红绿灯控制这个题目基本上每个学 PLC 的人都躲不过。课设、毕设、技能竞赛翻来覆去都是它。但如果你真以为“基于 S7-1200 的红绿灯控制系统设计”就是把几个灯按顺序点亮那做出来的东西大概率只能应付答辩离“能用在十字路口”还差得远。这篇我打算把整个设计思路、硬件选型、时序规划、梯形图逻辑、调试踩坑完整过一遍尤其会把“带左转”这种稍复杂的八相位版本讲透希望能帮到正在做课设或者准备比赛的朋友。先说明一下我下面所有内容都是基于西门子 S7-1200 平台编程软件用的是 TIA Portal。这套方案做出来之后既能跑仿真也能直接接到真实灯板上跑扩展性也够——以后加倒计时屏、加触摸屏、加行人按钮都方便。1. 为什么选 S7-1200 做红绿灯控制选型与状态机思路1.1 为什么不是200 SMART也不是三菱FX很多人做红绿灯设计时第一反应是选 200 SMART 或者三菱 FX 系列毕竟学校实训室这两种居多资料也好找。但如果是专门指定的 S7-1200或者项目本身有一定“工程化”要求我强烈建议就踏踏实实用 S7-1200。核心原因有三个。第一个原因是通信能力。S7-1200 自带以太网口走 Profinet 非常方便将来接 HMI 触摸屏、接上位机、接 SCADA 系统都不用额外买模块。红绿灯看着简单但如果要做城市级交通信号联网通信就是刚需。200 SMART 虽然也有网口但整体生态和 TIA Portal 的融合度不如 S7-1200。第二个原因是编程理念。S7-1200 配合 TIA Portal支持更规范的数据块、函数块、SCL 语言。红绿灯控制这种典型的状态机程序如果只用梯形图硬写状态一多比如带左转、带全红清空、带夜间黄闪代码会非常痛苦。而 S7-1200 平台可以很自然地用 SCL 的 CASE 语句实现状态机代码量直接减少一半以上而且逻辑一目了然。第三个原因也是比较现实的原因S7-1200 在中小型设备控制系统里占有率确实高。你花时间把 S7-1200 玩明白比玩明白一个只在教学里出现的玩具型号要值钱得多。当然我不是说 200 SMART 不好只是既然题目定了 S7-1200那就按这个平台的思路去把它做到最好。1.2 红绿灯控制的本质是状态机咱们把这个题目拆开看。红绿灯控制系统不管看起来多复杂核心就一句话在一个时间周期内按照预定义的相位顺序循环切换各个方向的红黄绿灯状态。这就是典型的状态机。所谓状态机你可以理解成“当前处于哪个阶段决定了输出什么灯时间一到就切换到下一个阶段”。每个阶段之间是互斥的——同一时刻只能有一个相位生效否则就会出现南北绿灯和东西绿灯同时亮的重大事故。很多人上来就直接写梯形图一个定时器控制一组灯定时器到了就切换结果逻辑乱成一团。我建议先画状态转换图把下面几个问题理清楚再动手一共有几个相位比如最简版是 4 个相位东西直行、东西黄灯、南北直行、南北黄灯。每个相位持续多久相位之间是否存在“全红清空”时间也就是所有方向都是红灯让路口内的车流清空。是否需要左转专用相位这些问题搞清楚了程序结构自然就清楚了。红绿灯编程难的不是定时器怎么用而是状态之间的切换条件以及状态与输出之间的映射关系。2. 硬件清单与I/O分配表接线前先搞清楚公共端2.1 核心硬件清单与选型建议做这个设计硬件其实不复杂。按“够用留余量”的原则我推荐以下配置CPUS7-1200 CPU 1214C DC/DC/DC6ES7214-1AG40-0XB0或 DC/DC/RLY。为什么要 1214C 而不是 1211C主要因为 1211C 集成点位数偏少红绿灯看似输出点不多但加上左转灯、手动模式开关、HMI 通信预留之后1214C 更从容。输入设备启动按钮常开、停止按钮常闭、自动/手动切换开关这基本是最低配。如果追求更真实的场景还可以加急停按钮和模拟行人按钮。输出设备24V LED 红绿灯灯组。注意是灯组不是单个指示灯。某宝上卖的那种红绿灯教学模型通常自带三色灯直接接 PLC 输出就行。24V DC 开关电源给 PLC 和灯组供电。S7-1200 的 L 和 M 需要外部直流 24V灯组也走同一个电源。中间继电器如果现场用的是 220V 交流灯那就必须用中间继电器转接PLC 输出点只驱动继电器线圈触点再去控制 220V 灯。直接在 PLC 输出端接 220V 灯不是不行但对 S7-1200 继电器输出型来说频繁动作会明显缩短继电器寿命而且不够安全。这里有个非常关键的选型细节S7-1200 的输出类型。DC/DC/DC 型号是晶体管输出只能接直流负载响应快、寿命长适合频繁通断DC/DC/RLY 型号是继电器输出交流和直流负载都能接但机械寿命有限。红绿灯本身就是频繁通断的负载如果条件允许我更推荐晶体管输出配 24V LED 灯组这套组合在现场最省心。2.2 I/O分配和接线注意事项我先给一个简化版 I/O分配也就是不带左转的经典“三色灯单方向”模型。东西方向一组南北方向一组每组红黄绿三色总共 6 个输出点I/O地址功能说明输入I0.0启动按钮常开输入I0.1停止按钮常闭输入I0.2自动/手动切换开关输出Q0.0东西方向绿灯输出Q0.1东西方向黄灯输出Q0.2东西方向红灯输出Q0.3南北方向绿灯输出Q0.4南北方向黄灯输出Q0.5南北方向红灯如果要带左转那就在东西和南北方向各增加左转绿灯、左转红灯输出点变成 10 个。1214C 集成 14 个输出点完全够用。至于左转黄灯工程中有的是单独三色箭头灯有的简化成两色这个看你的模型配置不影响程序架构。接线时最容易翻车的地方是公共端。S7-1200 的输入回路通常采用漏型接法也就是把 24V 电源正极接到传感器电源 L输入设备一端接 L 或 M另一端接 I 点具体根据你买的 CPU 型号查手册确定但大原则是必须让外部 24V 和输入点之间构成完整回路。输出回路更要注意继电器输出型号一组触点共用同一个公共端比如 1L、2L、3L这个公共端必须接外部负载电源否则程序里输出点置 1 了外部灯也不会亮。很多新手程序下进去之后灯不亮十有八九就是公共端没接。还有一个小细节如果灯组或中间继电器线圈离 PLC 比较远接线时电源正负极不要接反24V LED 灯有极性接反了不亮但一般不烧。现场调试时先拿万用表量输出点电压确认有 24V 再怀疑灯的问题这个习惯能省一大半排查时间。3. 交通相位时序与PLC程序设计从4状态到8相位3.1 四状态标准时序设计与梯形图逻辑先写最经典的四状态方案。思路是这样的东西方向先放行 30 秒然后黄灯 3 秒接着南北方向放行 30 秒再黄灯 3 秒循环往复。在这个过程里没有左转相位也没有全红清空时间是最基础的教学模型。状态定义状态0东西绿灯亮南北红灯亮持续 30 秒。状态1东西黄灯亮南北红灯亮持续 3 秒。状态2东西红灯亮南北绿灯亮持续 30 秒。状态3东西红灯亮南北黄灯亮持续 3 秒。我用 M0.0 到 M0.3 作为四个状态位同一时刻只有一个状态位为 1。每个状态位对应一个 TON 定时器定时器的输入就是该状态位本身。状态位为 1 时开始计时计时到后就触发状态切换复位当前状态位置位下一个状态位。梯形图核心逻辑大概是这样的网络1状态0 的定时器。M0.0 为 ONTON 开始计时PT 设为 30 秒。网络2状态0 切换到状态1。当 M0.0 和定时器输出 Q 同时为 ON先复位 M0.0再置位 M0.1。网络3状态1 的定时器PT 设为 3 秒。网络4状态1 切换到状态2。M0.1 和定时器 Q 同时为 ON复位 M0.1置位 M0.2。依此类推状态2 切换到状态3状态3 循环回状态0。输出逻辑更简单直接画“状态位触点带输出线圈”输出地址导通条件说明Q0.0东西绿M0.0状态0 时亮Q0.1东西黄M0.1状态1 时亮Q0.2东西红M0.2 或 M0.3状态2、3 时亮Q0.3南北绿M0.2状态2 时亮Q0.4南北黄M0.3状态3 时亮Q0.5南北红M0.0 或 M0.1状态0、1 时亮这里一定会有人掉坑为什么东西红灯不是直接等于“南北绿灯亮”的取反因为黄灯期间东西红灯也是亮的如果简单取反黄灯阶段红灯就会灭。必须用“状态2 或 状态3”这种明确的组合条件也就是我前面说的状态与输出映射。这个方案经过仿真和真实灯板验证跑起来非常稳定。学生拿来交课设完全没问题但咱们继续往下挖一层——真实十字路口可没这么简单。3.2 增加左转相位后的八相位设计带左转功能的交通灯是热词里频繁出现的应用场景也是红绿灯系统从“能跑”到“接近真实”的关键跨越。加了左转专用相位之后时序变成了八个相位。我把一套常用的参数贴出来可以直接抄相位号名称东西方向南北方向持续时间0东西直行东西直行绿灯亮左转红灯亮南北全红20秒1东西左转东西直行红灯亮左转绿灯亮南北全红15秒2东西黄灯东西黄灯亮南北全红3秒3全红清空东西全红南北全红2秒4南北直行东西全红南北直行绿灯亮左转红灯亮20秒5南北左转东西全红南北直行红灯亮左转绿灯亮15秒6南北黄灯东西全红南北黄灯亮3秒7全红清空东西全红南北全红2秒注意了这里多了一个“全红清空”。这个时间在真实交通信号里非常重要它让路口内的左转车辆、抢黄灯的车辆有足够时间清空避免下一个相位的直行车辆和上个相位的残余车流发生碰撞。很多人做这个设计时会忽略全红时间导致两个方向红绿灯切换瞬间出现冲突风险。做课设时把这个细节写进设计说明里会显得你懂得交通控制业务而不仅仅是懂 PLC。回到程序实现。八个状态如果用梯形图硬写网络数量会翻一倍状态位从 M0.0 到 M0.7后面接 8 个定时器、8 个切换网络输出映射更是复杂。这时候我强烈建议改用 SCL 写状态机代码看起来是这样CASE #state OF 0: // 东西直行相位 East_Green : TRUE; East_Yellow : FALSE; East_Red : FALSE; East_Left_Green : FALSE; East_Left_Red : TRUE; South_Red : TRUE; South_Green : FALSE; South_Yellow : FALSE; IF #timerDone THEN #state : 1; END_IF; 1: // 东西左转相位 East_Red : TRUE; East_Green : FALSE; East_Left_Green : TRUE; East_Left_Red : FALSE; South_Red : TRUE; IF #timerDone THEN #state : 2; END_IF; // 其余相位类似…… END_CASE;SCL 的好处是每个 CASE 分支里输出状态一目了然不会出现梯形图那种长串触点的“面条代码”。而且在 TIA Portal 里你还可以在同一个 FC 里用静态变量做当前状态编号状态切换就变成了简单的状态编号加一到了末尾回到零。我多说一句很多人担心 SCL 不如梯形图“正统”其实完全不必。S7-1200 的定位是中小型 PLC工程上越来越多人用 SCL因为可读性和可维护性远超梯形图。但对初学者我的建议是先用梯形图把四状态跑一遍理解定时器和状态位的底层逻辑再切到 SCL 做八相位两条腿走路最稳。3.3 定时器参数数据块、倒计时与黄闪扩展这里再分享一个工程上很重要的习惯不要把所有定时器时间直接写死在程序里而是放在一个数据块里做成可配置参数。建一个 DB 块名字叫“TrafficTime”里面定义一组 TIME 类型变量// 数据块 TrafficTime 内容 East_Straight_Time : TIME : T#20S; East_Left_Time : TIME : T#15S; Yellow_Time : TIME : T#3S; All_Red_Time : TIME : T#2S; South_Straight_Time : TIME : T#20S; South_Left_Time : TIME : T#15S;然后在程序里把 TON 的 PT 参数指到这些变量上。这样以后想调整某一个相位的时长直接在数据块里改数值就行不用翻梯形图去找定时器也不会因为误改逻辑而出错。现场调试时这个优势尤其明显交警可能今天说东西直行时间短了明天说左转时间长了你要是能现场改个参数比重新下载一次程序专业得多。倒计时显示也是常见扩展功能。S7-1200 的 TON 定时器有一个 ET 输出表示当前已计时时间。剩余时间 PT - ET。如果接了 HMI 触摸屏直接在画面上放两个文本域一个显示 PT - ET 的秒数就能实现一个简单的倒计时显示。有人问为什么不在 PLC 里用变量精确到秒再输出到 HMI因为 TON 的 ET 单位是毫秒你减出来之后除以 1000 取整就行HMI 端处理或者 PLC 端处理都可以但不建议直接显示毫秒数那看着太傻了。夜间黄闪模式也算红绿灯控制的经典扩展。很多真实信号灯夜间会切成黄灯闪烁模式四个方向黄灯同时以 1 秒周期闪烁提示车辆小心通过。S7-1200 里这个功能实现非常简单在 PLC 组态里启用“系统存储器字节”例如设置 MB1 为系统存储器字节那么 M1.5 就是一个 1Hz 的时钟脉冲。把黄灯输出和这个 1Hz 位串联就得到了闪烁效果。再配合前面的自动/手动切换开关手动模式下直接强制进入黄闪一台设备就能演示两种运行模式。4. 仿真调试与常见问题排查这些坑我替你踩过4.1 用S7-PLCSIM做仿真调试没有真实硬件的时候TIA Portal 自带的 S7-PLCSIM 就是你最好的调试工具。很多初学者不知道这个功能或者只是用来“看灯亮没亮”其实它完全能模拟 PLC 的扫描周期、定时器、变量变化。调试红绿灯程序时我用仿真的步骤是这样的先把组态和程序下载到仿真 PLC 里。在 TIA Portal 里点击“开始仿真”软件会自动启动 S7-PLCSIM然后像下载到真实 PLC 一样把项目下载进去。接着打开监控表强制 I0.0 为 1相当于按下启动按钮然后观察 M0.0 到 M0.3 这些状态位的实时变化以及 Q0.0 到 Q0.5 这些输出点的变化。仿真调试红绿灯比真机还方便的一点是你可以把定时器的 PT 临时改得很短比如 3 秒改成 0.5 秒这样整个周期几十秒就能跑完一圈逻辑对不对一眼就看出来。确认无误后再改回真实时间参数下到真机里。但仿真也有仿真的盲区它模拟不了真实的接线错误也模拟不了输出公共端没接这种低级问题。所以仿真通过只是第一步真机调试是从零开始的过程。4.2 真机调试的典型问题速查表我在带学生和做项目过程中把红绿灯真机调试最常见的故障整理了一张表基本覆盖了 80% 的情况故障现象可能原因排查方法绿灯只亮一瞬间就跳到黄灯TON 定时器 PT 值写成了整数 30而不是 TIME 类型 T#30STON 的 PT 引脚类型是 TIME填 30 会被当成极短的毫秒级时间必须写成 T#30S 或 30000ms两个方向绿灯同时亮状态切换逻辑没有同时复位旧状态检查状态位切换时是否成对使用“复位旧状态 置位新状态”确保同一时刻只有一个状态位为 1程序下载后所有输出点都不亮输出公共端 L 没接外部电源用万用表量 PLC 输出公共端和输出点之间是否有电压继电器输出型号还要确认负载电源是否接入输入按钮按了PLC 输入指示灯不亮输入回路没形成公共端或接线错误检查按钮接线一端接输入点另一端接 M 或 L确认传感器电源供电正常真机上黄灯不闪但仿真闪系统存储器字节未启用在 PLC 组态里启用系统存储器字节并把 1Hz 脉冲位用于闪烁逻辑HMI 连不上 PLCIP 地址不在同一网段块访问被优化把 PLC、电脑、HMI 的 IP 固定到同一网段在 PLC 变量表里关闭“优化块访问”这里单独强调一下 TON 的 PT 问题因为太经典了。TIA Portal 里 TON 的 PT 引脚是 TIME 类型你在界面下方参数区填数字时软件有时会自动给你加单位但如果你用 SCL 或者直接填了 30它默认单位是毫秒于是绿灯亮了 30 毫秒就切黄灯了。这在我们第一次上电时几乎必踩。后来我养成一个习惯所有时间参数全部放到数据块里定义成 TIME 类型从根源上避免这种低级错误。4.3 从课程设计到工程项目的思维转变最后聊一点题外话也是我个人实际带项目时的体会。很多学生做完红绿灯课设就觉得 PLC 不过如此逻辑这么简单。但如果真让你去现场维护一台信号机你会发现真正的难点根本不在梯形图而在可靠性、安全性和通信。比如输出互锁。红绿灯和别的设备不一样它是安全相关的设备。就算程序逻辑写得再清楚硬件上也必须考虑互锁——东西绿灯和南北绿灯的硬接线之间要加互锁防止 PLC 输出点故障或程序跑飞时出现“四面全绿”的灾难。S7-1200 程序里可以用常闭触点互锁但真正严格的做法是加中间继电器的硬互锁。这个思路在做课设时提一嘴就能看出你考虑问题的层次。再比如通信扩展。S7-1200 做交通信号系统将来大概率要接中心控制平台。走 Modbus TCP 还是 Profinet取决于平台对接要求。程序里提前把状态值、当前相位号、倒计时剩余时间整理到一个数据块里用 GET/PUT 指令或者 Modbus 指令提供给上位机这就是一个小型 SCADA 的雏形。以后接 HMI 显示、接上位机大屏、接入城市交通管理平台都是从这套底层数据开始的。我做红绿灯项目最大的收获其实是意识到一件事设备控制并不是写几句逻辑让它转起来而是要保证它能在极端条件下都不出错。红绿灯系统看起来太简单了简单到让人容易忽视安全性设计。但当你真正把一个八相位带左转、带全红清空、带故障黄闪的系统跑稳定之后再回头看那些“复杂”的工业设备控制你会发现底层思路都是相通的。这也是我建议每个初学者都认真把这个题目做到极致的原因。