news 2026/9/8 3:41:42

基于S7-1200的红绿灯控制系统设计:从四相位到八相位完整指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
基于S7-1200的红绿灯控制系统设计:从四相位到八相位完整指南

红绿灯控制这个题目,基本上每个学 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 核心硬件清单与选型建议

做这个设计,硬件其实不复杂。按“够用留余量”的原则,我推荐以下配置:

  • CPU:S7-1200 CPU 1214C DC/DC/DC(6ES7214-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 为 ON,TON 开始计时,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 显示、接上位机大屏、接入城市交通管理平台,都是从这套底层数据开始的。

我做红绿灯项目最大的收获,其实是意识到一件事:设备控制并不是写几句逻辑让它转起来,而是要保证它能在极端条件下都不出错。红绿灯系统看起来太简单了,简单到让人容易忽视安全性设计。但当你真正把一个八相位带左转、带全红清空、带故障黄闪的系统跑稳定之后,再回头看那些“复杂”的工业设备控制,你会发现底层思路都是相通的。这也是我建议每个初学者都认真把这个题目做到极致的原因。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/8 3:40:22

Linux磁盘挂载全攻略:mount与umount命令详解及fstab自动挂载配置

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/8 3:38:21

Java面试进阶:Stream执行模型、缓存策略与Kafka顺序性实战解析

上周帮一个准备跳槽的朋友做模拟面试,他背了一周的八股,结果被一道 Stream 的源码题问得卡壳。这件事让我挺有感触:现在大厂 Java 面试的核心考点已经变了,不再是"你知不知道 Stream 怎么用、缓存有哪些策略、Kafka 怎么保证…

作者头像 李华
网站建设 2026/9/8 3:36:57

统信UOS误删文件恢复实战:从原理到操作全攻略

统信UOS下误删文件是很多刚迁移到国产操作系统的用户经常会遇到的问题。在 Windows 上习惯了回收站里点两下就能找回文件,换到 Linux 生态后反而不知道从哪里下手。尤其是一些开发环境中的配置文件、数据库导出包、设计稿或办公文档,一旦被rm命令清掉&am…

作者头像 李华
网站建设 2026/9/8 3:36:28

Riffn:用即时语音链接解锁AI代理与本地模型的高效协作

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/8 3:35:46

手机影像硬件月报:长焦军备竞赛,旗舰排名洗牌

1. 8月影像硬件风向:超级大底之外,长焦成了新战场 一到月底,催我更新“手机影像硬件排名月报”的私信就准时多了起来。这个榜单我做了有阵子了,核心逻辑很简单:不看厂商发布会怎么吹,不跟舆论热度走&#x…

作者头像 李华
网站建设 2026/9/8 3:35:26

电商Agent架构生产实践:解读Anthropic开源方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华