
简介面向西门子S7-1200 PLC与博途TIA Portal学习者的自动化实验资源包凝聚十字路口交通灯控制、引风机送风机顺序控制、信号灯移位显示、报警电路及四节传送带控制等典型编程项目覆盖交通物流与电气控制场景适合自动化、电气类学生和初级工程师也适用于竞赛备赛。压缩包共444个文件约11.35MB以ap15_1/ap16博途工程、db/cfs程序块、png界面监控图、xml配置说明为主并有多个子项目备份方便在TIA Portal V13/V16中直接打开研习。已有3363人学习下载。包内针对各实验给出完整程序框架、I/O分配和梯形图/SCL实现示意附仿真运行画面与报警消铃、传送带故障急停等电路逻辑讲解能帮助读者系统理解顺序启停、定时器循环、移位显示、联锁保护以及多电机顺序控制等核心知识点是课程设计、技能竞赛和自学进阶的高质量参考资料。 实验室里拿到十字路口交通灯控制这个题目时很多人第一反应是这不就是一堆定时器轮流置位复位吗南北绿灯亮20秒然后黄灯3秒再切东西向……逻辑确实不复杂但真动手在博途TIA Portal里用S7 1200 PLC实现的时候问题就来了程序结构怎么搭才不乱定时器放在FB里和FC里有什么区别左转灯跟直行灯怎么避免同时放行夜间黄闪模式怎么切入这一套折腾下来你才会发现交通灯控制远不是会写TON这么简单。这篇文章我按自己的实操经验把这个实验从需求拆解、硬件选型、程序骨架到状态机设计、仿真调试、现场踩坑完整梳理一遍。如果你是刚接触S7 1200和博途的初学者可以照着这份思路一步步搭出自己的交通灯程序如果你已经在做这个实验但总觉得代码结构混乱、扩展不方便那重点看状态机设计和FB/DB的用法部分。整个实验做下来你对博途的编程思想、PLC的扫描方式、定时器的底层机制都会有一个比照着例程抄一遍深刻得多的理解。1. 需求拆解十字路口交通灯到底在控制什么先说清楚这个实验的本质。任何一个十字路口不管车流量大小控制的核心诉求只有一个在同一段时间内只允许存在一组不发生冲突的通行方向放行其余方向必须全部禁止通行。听起来像废话但你去看很多新手写的程序问题恰恰出在这里——他们把注意力全放在哪个灯该亮上忽略了哪个灯绝对不能同时亮。以最基础的两相位控制为例南北方向放行时南北直行绿灯亮、左转灯如果有红灯、东西方向全部红灯这段时间内东西向的车绝对不能动。等南北方向黄灯切换进入东西方向放行阶段时南北方向必须全部红灯。这个互斥约束贯穿整个逻辑设计比单纯的时序控制重要得多。再从控制需求的角度拆一下一个完整的十字路口交通灯系统至少包含三类信号方向信号南北方向、东西方向每个方向又分为直行、左转要不要单独设置右转一般默认常绿或跟随直行灯色信号红、黄、绿三种状态左转灯通常只有红、绿两色左转黄灯是否设置按路口实际需求定控制信号启动、停止、夜间模式、紧急模式比如特种车辆优先这些往往要接入PLC的数字量输入。把这个需求表列出来之后你才能确定I/O点数、选择PLC型号也才能确定程序里要建多少个状态、每个状态的持续时间是多少。实验室里做这个题目通常用24V指示灯泡或LED指示灯板模拟真实灯组PLC输出模块直接驱动或者通过中间继电器转接。但你要清楚实验模型和真实路口的区别不只是电压等级真实路口还要考虑左转待转区、行人过街、全红时间路口彻底清空的时间等逻辑这里先把基础版做扎实后面扩展也就水到渠成。2. 硬件选型与I/O分配S7 1200选哪一档点数够不够S7 1200系列有CPU 1211C、1212C、1214C、1215C等常见型号它们的区别主要在I/O点数和通信能力上。做交通灯实验先统计数字量输入和输出需求输入启动按钮1个、停止按钮1个、夜间模式切换1个、紧急模式1个共4个DI输出基础两相位南北红、黄、绿各1个东西红、黄、绿各1个共6个DO输出四相位带左转南北方向直行红、黄、绿加左转红、绿东西方向同样5个共10个DO。这样算下来CPU 1211C6DI/4DO输出点数不够无论是基础版还是左转扩展版都带不动。实际做这个实验至少选CPU 1212C8DI/6DO才能勉强满足两相位的输出需求但输入通道只剩4个如果还想加传感器检测就紧张了。我建议直接用CPU 1214C14DI/10DO输入输出都预留了余量后面接感应传感器、加扩展模块都不会捉襟见肘。这里插一个重要选型经验如果你买的是继电器输出的CPU 1214C比如6ES7214-1HG40-0XB0型号里有H的是继电器输出那么输出端子可以直接驱动24V直流指示灯或220V交流灯接线方便、抗过载能力强如果是晶体管输出的版本6ES7214-1AG40-0XB0只能接直流负载而且带载能力有限一般单点0.5A驱动大功率灯时一定要通过中间继电器转接。做实验的时候要看清楚手上CPU的具体订货号别等接线完才发现驱动不了。I/O分配表的参考方案基础两相位版地址信号说明I0.0启动按钮上升沿有效系统进入自动运行I0.1停止按钮停止时所有灯复位或进入黄闪状态I0.2夜间模式开启后所有方向黄灯闪烁I0.3紧急模式开启后东西南北方向全部红灯模拟特种车辆通行Q0.0南北红灯DO输出Q0.1南北黄灯DO输出Q0.2南北绿灯DO输出Q0.3东西红灯DO输出Q0.4东西黄灯DO输出Q0.5东西绿灯DO输出如果是带左转的四相位版本扩展为Q0.6~Q1.3共10个输出点分配思路是把南北方向和东西方向分开归类直行和左转再细分方便在程序里统一处理。接线时有两个非常容易踩的坑我放在这里提前说PLC输出的公共端COM接法要正确。继电器输出型CPU每4个或8个输出共用一个公共端接线时负载一端接输出端子另一端接电源电源的公共端要跟PLC输出公共端对应搞反了直接没输出或者烧保险。如果你用的是晶体管输出感性负载比如中间继电器线圈一定要并联续流二极管否则线圈断电瞬间的反向电动势会把输出管打坏。实验室里不少人在这上面吃过亏。3. 博途里的程序骨架OB、FB、DB怎么组织才不混乱硬件和I/O分配确定之后接下来是在博途里建项目、组态CPU。这个过程不展开细讲网上教程很多但有一个关键点值得强调博途编程不是把逻辑全堆在OB1里就完了程序结构从一开始就要想清楚。以交通灯控制为例我推荐如下程序组织方式OB1主程序负责调用功能块不做具体控制逻辑FB交通灯控制核心逻辑所在用SCL或梯形图编写状态机内部包含定时器的实例数据全局DB比如交通灯参数DB存放各状态的持续时间、当前状态编号、运行标志等参数方便调试时在线修改OB100启动组织块初始化一些默认参数比如首次上电时让所有灯处于全红状态。为什么要用FB而不是FC这是很多初学S7 1200的人绕不过去的一个问题。FC没有背景数据块它里面不能声明静态变量Static而S7 1200的定时器TON是IEC定时器需要一个存储实例数据的背景DB来保存定时器的当前时间、输出状态等信息。如果你把TON放在FC里每次调用都要额外指定一个全局DB来存储定时器上下文逻辑非常绕。相反把定时器放在FB里FB自动生成对应的背景DBInstance DB定时器状态就保存在这个背景DB中接口清爽得多。在博途里把FB沿用到OB1时你可以给每个FB调用分配独立的背景DB也可以使用多重背景Multi-instance。对于交通灯这种只有一个调用点的场景直接用单背景DB就行不需要为了炫技用多重背景。另外一个容易被忽略的结构设计把状态持续时间和灯序表数据独立存放。比如你希望把南北直行时间从20秒改成30秒实验现场调试时不可能重新下载程序如果时间参数放在全局DB里直接在线修改DB数据就能生效。这种逻辑与参数分离的思路是PLC工程化的基本素养也是这个实验能体现出进阶价值的地方。4. 核心控制逻辑用状态机加TON定时器把灯序跑起来交通灯控制的经典实现方案是状态机。我直接给出一个经过验证的思路和SCL代码你可以在这个基础上按自己的需求调整。4.1 状态定义与转换关系基础两相位定义4个状态状态编号状态名称动作持续时间0南北绿灯/东西红灯南北方向放行20秒1南北黄灯/东西红灯南北方向清空路口3秒2东西绿灯/南北红灯东西方向放行20秒3东西黄灯/南北红灯东西方向清空路口3秒状态转换逻辑状态0持续20秒后切到状态1状态1持续3秒后切到状态2状态2持续20秒后切到状态3状态3持续3秒后回到状态0如此循环。这里核心是一个**当前状态计时**的思路每次进入新状态时把状态计时器清零重启每扫描周期检测计时时间是否达到该状态的预设值达到后状态编号加1。这比一串TON定时器顺序触发的结构清晰得多扩展状态时只需要在CASE分支里增加一个编号其他逻辑完全不用动。4.2 定时器的正确用法S7 1200中TON的正规做法是声明一个IEC_TIMER类型或使用TON指令。在SCL中我习惯用下面的写法调用TON#stateTimer(IN : #timerEnable, PT : #stateDuration, Q #timerDone, ET #elapsedTime);这一行代码相当于梯形图里拖出来的TON指令。#stateTimer是FB的静态变量Static#timerEnable是定时器使能信号#stateDuration是定时时间#timerDone是定时完成输出#elapsedTime是已计时时间用于监控。这里有一个非常关键的细节定时器使能信号不能一直为TRUE。如果IN一直为TRUETON会在时间到达后Q保持TRUE但不会产生定时完成这个跳变信号。在状态机里我们应该让定时器在状态切换瞬间重新计时也就是复位定时器。常见做法是状态切换时先把#timerEnable置FALSE等扫描周期刷新后再置TRUE这样定时器会从0重新开始计时。用代码来说状态切换那一瞬间用脉冲触发一下或者直接利用状态切换的逻辑条件让定时器在进新状态后的第一个周期才启动。另一个做法是使用TONR保持型定时器配合RESET指令复位但普通TON已经足够逻辑也更简单不推荐在这个场景用TONR。4.3 完整的SCL状态机代码示例在FB的静态变量区声明stateInt当前状态编号初始0stateTimerTON_TIME类型IEC定时器timerEnableBool定时器使能信号elapsedTimeTime已计时时间FB的输入接口StartBool启动StopBool停止NightModeBool夜间模式FB的输出接口NS_Red、NS_Yellow、NS_Green南北方向灯EW_Red、EW_Yellow、EW_Green东西方向灯SCL核心代码在FB的Network中编写// 停止或夜间模式时优先处理 IF #Stop OR #NightMode THEN #state : 0; // 回到初始状态 #timerEnable : FALSE; // 输出全部复位或进入黄闪逻辑 #NS_Red : FALSE; #NS_Yellow : FALSE; #NS_Green : FALSE; #EW_Red : FALSE; #EW_Yellow : FALSE; #EW_Green : FALSE; // 如果是夜间模式黄灯闪烁后续单独处理 // 启动且非夜间模式 ELSIF #Start AND NOT #NightMode THEN // 调用计时器 #stateTimer(IN : #timerEnable, PT : #stateDuration, Q #timerDone, ET #elapsedTime); // 状态切换当本状态持续时间到 IF #timerDone THEN #state : #state 1; IF #state 3 THEN #state : 0; END_IF; #timerEnable : FALSE; // 复位定时器 END_IF; // 根据当前状态设置输出 CASE #state OF 0: // 南北绿灯东西红灯 #NS_Red : FALSE; #NS_Yellow : FALSE; #NS_Green : TRUE; #EW_Red : TRUE; #EW_Yellow : FALSE; #EW_Green : FALSE; #stateDuration : T#20S; 1: // 南北黄灯东西红灯清空路口 #NS_Red : FALSE; #NS_Yellow : TRUE; #NS_Green : FALSE; #EW_Red : TRUE; #EW_Yellow : FALSE; #EW_Green : FALSE; #stateDuration : T#3S; 2: // 东西绿灯南北红灯 #NS_Red : TRUE; #NS_Yellow : FALSE; #NS_Green : FALSE; #EW_Red : FALSE; #EW_Yellow : FALSE; #EW_Green : TRUE; #stateDuration : T#20S; 3: // 东西黄灯南北红灯清空路口 #NS_Red : TRUE; #NS_Yellow : FALSE; #NS_Green : FALSE; #EW_Red : FALSE; #EW_Yellow : TRUE; #EW_Green : FALSE; #stateDuration : T#3S; END_CASE; // 让定时器在状态切换后的下一周期重新开始计时 IF NOT #timerDone THEN #timerEnable : TRUE; END_IF; END_IF;这段代码有一个需要注意的逻辑点#stateDuration是在CASE分支中赋值的而定时器在CASE之前调用这意味着状态切换后的第一个扫描周期定时器使用的还是上一个状态的持续时间。但因为切换时#timerEnable被置FALSE、定时器输出#timerDone会复位下一个周期重新计时时才读到新状态的持续时间所以整体逻辑不会错乱。这一点是PLC扫描机制导致的时序错位实际运行没有问题但如果你在监控时发现定时器时间跟预想不一样先想想是不是这个逻辑顺序的问题。把这段FB拖到OB1中再结合前两节的变量表分配下载到PLC后即可运行。5. 从两相位到四相位左转灯如何并入状态机现在到了扩展环节。很多路口有独立的左转信号灯对应的灯序不再是简单的南北直行、东西直行两相位而是四相位南北直行放行→南北左转放行→东西直行放行→东西左转放行。这就是热搜词里经常提到的plc交通灯带左转。四相位状态机设计如下状态编号状态名称动作持续时间0南北直行南北直行绿灯南北左转红灯东西全红25秒1南北左转南北左转绿灯南北直行红灯东西全红15秒2南北黄灯南北直行黄灯左转黄灯或黄闪东西全红3秒3东西直行东西直行绿灯东西左转红灯南北全红25秒4东西左转东西左转绿灯东西直行红灯南北全红15秒5东西黄灯东西直行黄灯左转黄灯或黄闪南北全红3秒从代码层面看改动其实不大CASE分支从4个变成6个输出变量从6个变成10个状态切换的边界条件改一下就行。状态机设计的好处就在这里——修改的是配置和分支而不是整个程序结构。但是这里有个真实路口才有的细节黄灯阶段是所有放行方向同时黄灯还是直行、左转分别黄灯不同路口的相位设计不同有些路口左转相位结束后直接切直行红灯、左转红灯不单独给左转黄灯有些路口在相位间切换时会加入一段全红时间一般是1~2秒用于清空路口交叉区域。这些属于具体的相位配时方案在实验里你可以按自己的方案定义但要写成文字注释否则后续调试的时候自己都看不懂当时设计的意图。我建议在设计四相位时用分离的输出来表达直行、左转灯不要混在一个变量里比如NS_Green_Direct南北直行绿灯NS_Green_Left南北左转绿灯EW_Green_Direct东西直行绿灯EW_Green_Left东西左转绿灯这样将来扩展右转控制、行人信号时灯具输出可以独立控制互不影响。6. 仿真调试与现场实测避坑记录和经验总结程序写完总要跑起来验证调试阶段我用的是博途自带的PLCSIM仿真然后把同一个程序下载到真实的S7 1200上验证。这一节把调试过程中最典型的几个问题整理出来。6.1 PLCSIM仿真的边界PLCSIM对S7 1200的数字量输入输出仿真比较完整基本逻辑验证够用。但有几个注意点仿真中无法真实模拟输入信号的脉宽、抖动你需要用**变量监控表Watch Table**手动强制置位I0.0、I0.1等输入量来模拟按钮按下仿真中定时器走的是真实时间也就是说20秒就是真实20秒。调试时如果觉得慢可以把状态持续时间临时改成1秒、2秒验证逻辑正确后再改回来PLCSIM和真实CPU的程序下载方式不同仿真项目里不能直接使用真实的存储卡、无法测试断电保持等功能这些要等下载到真实CPU后再验证。6.2 输出互锁的必要性交通灯控制最怕什么最怕红绿同时亮。由于PLC程序是循环扫描的正常情况下状态机同一时刻只有一个状态分支执行不会出现红绿同时亮的逻辑冲突。但如果程序里存在多个定时器驱动同一组输出的情况就可能出现某个瞬间两组输出同时置位。实际调试中我遇到过一次在四相位版本里加了一个独立的夜间黄灯闪烁功能用了另外一个定时器控制黄色灯闪烁。结果夜间模式下黄灯闪烁的定时器和状态机里的定时器同时驱动了黄灯输出变量导致半夜灯的状态完全错乱。后来我把输出逻辑收敛为单一数据源——无论什么模式最后给到输出的只有一组变量模式切换只改变状态机的行为不改变输出映射逻辑问题就解决了。6.3 定时器复位的时序问题前面代码里已经提到#timerEnable先FALSE后TRUE的技巧。实际监控你会发现TON的Q端在定时时间到达后是否复位取决于IN端是否有下降沿。如果你不把IN先断开就重新计时Q会一直保持TRUE导致状态机里IF #timerDone THEN这个分支反复执行状态编号一下跳好几个。这个坑几乎每个做S7 1200交通灯的人都会遇到排查方法是用变量监控表同时监视state、timerDone和timerEnable三个变量看状态切换那一瞬间这三个值的变化顺序。6.4 面板显示与真实灯泡的延迟实验箱上的LED指示灯通常点亮响应很快但如果你用的继电器输出型CPU加中间继电器驱动220V信号灯继电器机械动作时间一般在10ms左右会造成灯色切换的轻微延迟。在交通灯这个场景下10ms的延迟不影响功能但如果将来做高速计数、精确同步类的项目这种机械延迟就必须考虑。做实验时如果发现灯色切换顺序偶尔异常先怀疑外部接线和继电器不要一上来就查程序——这是我实测中很深刻的体会。6.5 程序架构的复盘建议做完整个实验后回头看看自己的程序结构问几个问题状态持续时间是写在程序里还是存在DB里如果现在要把南北绿灯从20秒改成35秒需要动程序重新编译吗如果要加一个全红清空的2秒状态CASE分支和状态切换逻辑要改几处是不是只要新增一个分支就行如果把SPLC换成S7-1500程序可以无缝移植吗有没有用S7-1200特有指令导致移植困难的地方想清楚这几个问题你对PLC编程的理解会比抄十篇例程都深刻。7. 写在最后的实操心得这个实验我做下来最大的收获不是会调交通灯了而是理解了PLC程序的本质是循环扫描下的状态机用定时器感知时间用状态变量记录当前所处阶段用输出映射驱动外部设备。这套思路可以平移到流水线控制、升降机控制、交通信号控制甚至更复杂的工艺控制里。所谓一通百通说的就是掌握了框架思维之后具体场景只是换了个状态表和几个输出点而已。最后分享两个实用小技巧在博途的变量监控表里把状态机的state变量用整型显示同时把各输出点用十六进制显示这样一个扫描周期里所有输出状态一目了然比一个个看Bool值爽得多。下载程序到真实PLC之前先在OB100中把所有输出强制复位一次保证上电瞬间所有灯处于全红状态避免PLC启动过程输出乱跳造成路口信号混乱。如果这个实验对你有所帮助或者你在调试中遇到了什么奇怪的问题欢迎在评论区把现象和排查过程贴出来大家一起讨论。本文还有配套的精品资源点击获取