交通灯PLC S7-1200博图编程:从状态表到仿真调试完整指南
每到课程设计和毕业设计的集中期交通灯 PLC S7-1200 博图这个关键词就会特别热。很多同学拿到这个题目第一反应是找现成的源文件、找报告、找讲解视频但等到被老师追问你这个绿灯为什么要闪三秒黄灯时间怎么定的往往就答不上来了。我做过不少类似的参考项目也帮人排查过各种跑不起来的程序说句实话交通灯这个题目是整个PLC入门里性价比最高的一套——麻雀虽小五脏俱全它同时覆盖了S7-1200的I/O分配、定时器应用、状态机思想、梯形图与SCL两种语言、仿真调试和接线任何一个环节没打通程序都没法稳定运行。这篇文章就以一套最经典的十字路口红绿灯控制为例从控制要求拆解、硬件选型、I/O分配、博图编程到仿真排障完整走一遍。适合刚接触S7-1200的学生也适合所有准备做类似课程设计或毕业设计的人参考。我不想只给你一段能抄的程序而是把为什么这么写讲清楚这样你实际操作时才不会一改参数就翻车。1. 先说清楚交通灯题目到底在考什么为什么总有人的程序跑不起来1.1 从题目到交付你真正要掌握的不只是梯形图交通灯这个题目看上去简单是因为它的控制对象几乎不需要理解复杂工艺——无非就是红灯、绿灯、黄灯按顺序亮。但老师给你这个题本质上是要考察四件事硬件层知不知道S7-1200怎么选型输入输出点怎么分配公共端怎么接DC24V负载和AC220V负载有什么区别。软件层会不会用博图建项目、组态PLC、写变量表、写梯形图或SCL、编译下载。逻辑层能不能把一个带时间条件的状态循环理清楚会不会用定时器、计数器或者状态机来表达时序。调试层程序下载后能不能通过仿真或在线监控发现问题而不是一脸茫然地反复下载几十次。我见过太多拿别人程序改一改就交的情况最后卡在调试环节程序下载进去了灯就是不按预期亮或者南北和东西同时亮绿灯——这种问题在答辩现场非常致命因为老师只要随便问一句你的程序是怎么避免冲突的你就露馅了。1.2 三个定时器轮流亮的错误认知为什么危险很多初学者拿到交通灯第一感觉是东西绿灯亮25秒南北红灯亮25秒这不是用三个定时器轮流触发就行了吗听起来好像没毛病但真动手你就会发现事情没那么简单。原因在于一个标准十字路口红绿灯并不是简单的两相轮流亮中间还夹着绿灯闪烁和黄灯过渡。这些东西如果只用一个定时器时间到就切下一组灯的写法会面临两个问题一是状态切换的瞬间容易出现两个方向的灯同时亮因为前一个定时器的输出还没复位后一个定时器的输出已经置位二是你的程序结构变成了一长串定时器首尾相连任何一个定时器复位不及时整个链条就咬死。所以做这个题目我强烈建议你一开始就把它当成一个时序状态机来设计而不是当成几个定时器串起来来做。后面第4章我会给你看具体怎么搭。2. 动手写程序前先把十字路口的红绿灯时序拆明白2.1 一套典型的基础控制要求做设计前一定要先明确控制要求。我这里用的是一套在教学里最常见的方案四方向、不带左转、周期62秒南北方向先放行25秒。南北绿灯最后3秒转为闪烁提醒司机即将变灯。随后南北黄灯亮3秒清空已经进入路口的车辆。接着东西方向放行25秒南北变为红灯。东西绿灯最后3秒闪烁再黄灯3秒。回到起点循环运行。这套方案的好处是每个方向都经历了绿灯→绿灯闪烁→黄灯→红灯的完整过程逻辑有层次也能顺带把闪烁这个编程点考出来。2.2 六段时间片的状态表把上面的文字描述转成时间片状态表就是下面这个样子。建议你自己动手在纸上画一遍因为这张表就是后面编程的蓝图。状态时间段持续时间南北方向东西方向说明S00-25s25s绿灯红灯南北方向通行S125-28s3s绿灯闪烁红灯南北即将变灯S228-31s3s黄灯红灯清空南北路口S331-56s25s红灯绿灯东西方向通行S456-59s3s红灯绿灯闪烁东西即将变灯S559-62s3s红灯黄灯清空东西路口总周期62秒。注意这里有一个隐含的安全原则任意时刻都不能出现南北绿灯和东西绿灯同时亮。红灯和黄灯在特定过渡段可以同时亮但绿灯永远只属于一个方向。2.3 为什么需要绿灯闪烁和黄灯过渡如果你只写一个25秒绿灯直接跳红灯的程序虽然能跑但很不专业答辩时也容易被问住。绿灯闪烁的意义在于给驾驶员一个明确的即将结束信号避免绿灯直接变红导致急刹车。黄灯则是为了清空已经越过停止线的车辆让路口在切换方向之前有一个短暂的净空过程。从编程角度讲闪烁段还让你多掌握一个技能——脉冲输出。S7-1200里的系统时钟脉冲在这里正好派上用场这个我在第4章详细讲。2.4 和老师确认控制要求不同方案的区别不同学校、不同老师对这个题目的要求可能有差异。比如有的要求绿灯结束后直接黄灯没有闪灯段有的要求高峰期南北45秒东西30秒还有的会要求加全红过渡就是两个方向全红1-2秒。所以动手前一定要先确认老师的控制要求别拿着你自己的想法闷头做。确认清楚之后画好状态表把周期长度、各段时间都标出来再打开博图——这一步省下的时间远比你想象的多。3. 硬件选型和I/O分配这些决定你后面好不好写3.1 选S7-1200哪个型号更合适S7-1200家族里课程设计最常用的就是CPU 1214C DC/DC/DC。它的基本配置是14个数字量输入、10个数字量输出在纯逻辑控制项目里绰绰有余。如果你学校实验室只有CPU 1212C8DI/6DQ其实也够用因为交通灯只占6个输出、2到3个输入。但我会优先选1214C原因很简单后续如果你还想加倒计时数码管、行人按钮、传感器之类的扩展或者想接一个触摸屏1212C的输出点数就比较紧张1214C更从容。选型还要注意CPU的电源型号DC/DC/DC表示直流24V供电、直流24V输入、晶体管直流输出。如果你的交通灯模型是AC220V的实体灯那么绝对不能直接用晶体管输出去驱动要么选带继电器输出的型号比如CPU 1214C DC/DC/RLY要么把PLC输出的DC24V信号接到中间继电器再由中间继电器去控制AC220V回路。这个细节很多新手第一次接线时会踩坑轻则灯不亮重则烧输出点。3.2 I/O分配表先规划好再接线S7-1200的优点是地址规划很自由你可以用I0.0、I0.1这样的绝对地址也可以在博图的PLC变量表里定义符号名。我的习惯是符号名优先因为在梯形图里看着NorthGreen、EastRed比看着Q0.0、Q0.3要直观得多调试和写报告也省事。信号名称地址类型说明启动按钮I0.0数字量输入常开触点按下启动控制系统停止按钮I0.1数字量输入常闭触点断开停止运行夜间模式I0.2数字量输入选择开关ON时进入黄灯闪烁模式东西绿灯Q0.0数字量输出东西方向绿灯东西黄灯Q0.1数字量输出东西方向黄灯东西红灯Q0.2数字量输出东西方向红灯南北绿灯Q0.3数字量输出南北方向绿灯南北黄灯Q0.4数字量输出南北方向黄灯南北红灯Q0.5数字量输出南北方向红灯为什么要把东西和南北的灯交错分配而不是按绿灯一排、黄灯一排这样分因为这样分配后你的程序结构天然就是把东西方向一组、南北方向一组分开处理输出地址和逻辑含义一一对应不容易把自己绕晕。等你在程序里看到Q0.0时你就知道它一定对应东西绿灯不用回头看变量表。3.3 实际接线中的公共端和电源问题S7-1200的晶体管输出是源型输出也就是输出点导通时对外输出DC24V高电平负载的另一端要接到0VM上。这个接法跟很多人的直觉正好相反——他们容易把负载一端接输出点另一端也接0V结果灯不亮或者把负载直接接在输出点和24V之间更不对。正确的接法是DC24V接到PLC的L端子DC24V-接到PLC的M端子负载一端接Q输出点另一端接M端子。输入侧也一样启动按钮一端接DC24V另一端接I0.0。当按钮按下时I0.0得到高电平信号PLC内部逻辑就能读到它。停止按钮建议用常闭触点也就是按钮不按时I0.1保持接通按下停止时I0.1断开程序执行停止逻辑。这样设计有个好处万一停止按钮的线断了PLC会判断为停止不会出现断了线反而让系统一直启动的隐患。这就是电工里的安全侧思维。3.4 电源容量估算别忽略S7-1200本身功耗不大但加上6个交通灯LED灯泡就要算一下电源电流够不够。以DC24V的LED交通灯教学模型为例单个灯电流一般在20mA到100mA之间6个灯最多也就0.6A左右加PLC本体配一个2A左右的DC24V开关电源就非常稳了。如果用的是继电器输出型CPU继电器线圈的驱动电流PLC已经内置考虑负载电流则要看灯泡实际功耗通常还要考虑1.5倍左右的余量避免电源长时间跑在满负荷状态。提示实验室里常见的三色红绿灯模型很多是共阳或共阴接法的LED灯接线前先搞清楚模型的端子定义别把红绿灯当成普通灯泡随便接。4. 博图编程把状态表变成能跑的程序4.1 编程思路状态机比一长串定时器更稳现在打开博图你已经有了状态表有了I/O分配表就差把逻辑翻译成程序。这中间最关键的思维转变是别把程序写成定时器1到时就开定时器2定时器2到时就开定时器3的链条而是先把6个状态定义成6个位M0.0到M0.5每次只允许一个状态位为1。这就是状态机的思想。状态位为1意味着当前这个状态正在执行状态位之间用互斥的置位复位逻辑切换绝不可能出现两个状态同时为1。后面再根据状态位的组合去驱动输出点输出永远是有序的、冲突的。用这种思路写的程序即使你改时间参数也不容易把两个方向的绿灯同时点亮。4.2 梯形图骨架每个状态一个M位、一个定时器下面我把梯形图的网络结构给你列出来。这不是全部细节但这是核心骨架。真正写的时候每个网络里就是一个TON定时器加置位复位指令。启动初始化网络按下启动按钮时置位M0.0进入状态S0同时复位M0.1到M0.5保证从一个干净的状态开始。状态S0切换网络M0.0为1时TON定时器开始计时PT25秒。定时器Q到时时复位M0.0置位M0.1表示从南北绿灯切到南北绿灯闪烁。状态S1切换网络M0.1为1时TON定时器PT3秒。到时复位M0.1置位M0.2。状态S2切换网络M0.2为1时TON定时器PT3秒。到时复位M0.2置位M0.3。状态S3切换网络M0.3为1时TON定时器PT25秒。到时复位M0.3置位M0.4。状态S4切换网络M0.4为1时TON定时器PT3秒。到时复位M0.4置位M0.5。状态S5切换网络M0.5为1时TON定时器PT3秒。到时复位M0.5置位M0.0回到起点。输出组合网络这一步做最终输出每个输出只写一次避免双线圈问题。输出组合这一块用文字描述就是M0.0为1时Q0.3量南北绿灯、Q0.2量东西红灯。M0.1为1时南北绿灯按1Hz脉冲闪烁东西红灯保持亮。M0.2为1时Q0.4量南北黄灯、Q0.2量东西红灯。M0.3为1时Q0.0量东西绿灯、Q0.5量南北红灯。M0.4为1时东西绿灯按1Hz脉冲闪烁南北红灯保持亮。M0.5为1时Q0.1量东西黄灯、Q0.5量南北红灯。这里最核心的技巧是输出只在最后一个网络里根据状态位统一赋值前面的网络只做状态切换。这样你写出来的程序干净不会出现同一个输出点在多个网络里被反复赋值的情况。4.3 SCL参考代码自动化的另一种写法如果你用的博图版本支持SCL或者你想用SCL来做逻辑会更紧凑。下面这段代码是示意性质的重点看状态分段和定时器使用的思路不同版本对定时器实例的调用细节会稍有差异建议在仿真里验证一次再下载。CASE #state OF 0: #timer0(IN : #run, PT : T#25S); // 南北绿灯东西红灯 Q0.3_NorthGreen : TRUE; Q0.2_EastRed : TRUE; IF #timer0.Q THEN #state : 1; #timer0.IN : FALSE; // 释放定时器准备下一轮 END_IF; 1: #timer1(IN : #run, PT : T#3S); // 南北绿灯闪烁1Hz东西红灯 IF M1000.5 THEN // 启用时钟存储器后M1000.5为1Hz脉冲 Q0.3_NorthGreen : TRUE; ELSE Q0.3_NorthGreen : FALSE; END_IF; Q0.2_EastRed : TRUE; IF #timer1.Q THEN #state : 2; #timer1.IN : FALSE; END_IF; 2: #timer2(IN : #run, PT : T#3S); // 南北黄灯东西红灯 Q0.4_NorthYellow : TRUE; Q0.2_EastRed : TRUE; IF #timer2.Q THEN #state : 3; #timer2.IN : FALSE; END_IF; 3: #timer3(IN : #run, PT : T#25S); // 东西绿灯南北红灯 Q0.0_EastGreen : TRUE; Q0.5_NorthRed : TRUE; IF #timer3.Q THEN #state : 4; #timer3.IN : FALSE; END_IF; 4: #timer4(IN : #run, PT : T#3S); // 东西绿灯闪烁南北红灯 IF M1000.5 THEN Q0.0_EastGreen : TRUE; ELSE Q0.0_EastGreen : FALSE; END_IF; Q0.5_NorthRed : TRUE; IF #timer4.Q THEN #state : 5; #timer4.IN : FALSE; END_IF; 5: #timer5(IN : #run, PT : T#3S); // 东西黄灯南北红灯 Q0.1_EastYellow : TRUE; Q0.5_NorthRed : TRUE; IF #timer5.Q THEN #state : 0; #timer5.IN : FALSE; END_IF; END_CASE;坦白说SCL代码对初学者不是很好读但它的好处是一眼能看出状态跳转关系。你要是在梯形图上已经能顺畅实现SCL可以作为写报告时的对比说明证明你两种语言都会用答辩的时候很有优势。4.4 闪烁灯的实现时钟存储器与1Hz脉冲交通灯里的绿灯闪烁该怎么实现这是很多人的第一道坎。最简单可靠的办法是用S7-1200的系统时钟存储器。在博图里打开PLC的设备组态找到属性里的常规标签里面有一个时钟存储器选项勾选启用后系统会分配一个字节的位比如默认可能是MB1000。这些位会按照不同频率自动翻转其中某个位对应1Hz也就是亮0.5秒、灭0.5秒某个位对应2Hz亮0.25秒、灭0.25秒具体哪个位对应哪个频率博图里会有一个表格照着用就行。我的经验是闪烁段要求不是特别严格用1Hz或2Hz都说得过去答辩时别跟老师纠结我为什么用1Hz不用2Hz只要说1Hz每秒亮灭一次符合黄闪频率就足够了。如果你不想依赖时钟存储器也可以用另一个TON定时器做一个0.5秒的脉冲就是让定时器每0.5秒置位一个M位下一周期再复位也能形成闪烁效果。两种方法都可以但系统时钟位会更省事程序也更简洁。4.5 启动、停止与夜间模式的扩展逻辑最后别忘了把启动停止和夜间模式加上。启动逻辑就是I0.0常开按钮按下后把一个运行中间量置位停止逻辑用I0.1常闭触点断开后把运行中间量复位同时复位所有状态位和输出。夜间模式我建议用I0.2当选择开关打到ON时不管当前状态如何只要运行量有效就让两个方向的黄灯交替或同时慢闪其他灯全灭。这个夜间模式虽然只是一个小扩展但很能体现你的工程思维——白天正常红绿灯夜间车流量小用黄闪提示减速通行。答辩时老师听到这个逻辑通常会觉得你考虑问题比较周全。5. 仿真和在线调试程序写完了怎么确认它真的对5.1 用S7-PLCSIM把流程跑一遍程序写完先别急着接实物我建议每个人养成先仿真的习惯。博图的S7-PLCSIM工具可以在电脑上模拟一个S7-1200 CPU配合博图下载和监控特别适合交通灯这种纯逻辑项目。基本操作流程是在博图里编译程序确保没有语法错误。启动S7-PLCSIM选择对应的CPU型号。回到博图点下载到设备在目标接口里选择PLCSIM而不是真实接口。下载完成后把仿真CPU切到RUN模式。在博图左侧在线访问下打开PLC变量表或程序监视强制I0.0为TRUE观察Q0.0到Q0.5的变化是否符合时序表。仿真最大的价值在于你能在不上电的情况下看到每一条梯形图网络是通的还是断的。如果某个状态一直跳不过去线上监控里能直接看出来是哪个定时器输出没接通。5.2 在线监控的三种手段博图的在线监控通常有三种方式程序状态监控、监视表、趋势图。程序状态监控就是打开梯形图界面点在线按钮后程序上会出现绿色/蓝色连接线线通了表示该触点导通输出线圈上打勾表示有输出。这种方式的优点直观可以看到整个扫描周期的流通情况。调试状态切换时我基本全靠它。监视表则适合批量观察变量。你可以在监视表里把M0.0到M0.5、Q0.0到Q0.5全部拖进去一眼看出当前哪些状态位为1、哪些输出为1。这个表还能直接修改变量值比如把某个状态位强制为TRUE、再强制为FALSE用来测试特定状态下的输出逻辑非常方便。趋势图适合看时序但交通灯这种秒级变化的项目用监视表看实时状态就够用了趋势图更多用于模拟量调试这里就不展开。5.3 常见异常现象排查对照表我在带人调试时下面这些现象出现频率最高你可以收藏起来对照排查异常现象可能原因排查步骤两个方向绿灯同时亮状态位重叠或输出网络里同时赋了两个Q检查是否只有一个M位为1检查最终输出网络所有灯都不亮启动信号没接通、停止常闭信号断开、CPU不在RUN先查I0.0、I0.1状态再查PLCSIM是否RUN卡在某个状态不动当前状态的定时器Q一直为0或切换网络里置位复位逻辑写反看当前M位和对应定时器的ET值是否到达PT绿灯一直闪很快时钟脉冲位选错频率确认用的时钟位是1Hz还是2Hz输出继电器咔咔响输出更新太频繁可能用了2Hz以上脉冲闪烁位不要超过1Hz负载电流也要检查这些排查思路用一句话总结就是先分清是逻辑问题还是硬件问题。逻辑问题看程序状态监控硬件问题量接线和信号。怕就怕你混在一起瞎猜浪费时间还找不到根因。6. 几个我反复踩过的坑以及这类题目的扩展方向6.1 双线圈输出最常见、最难查西门子PLC的扫描机制是自上而下逐网络扫描同一个Q输出如果出现在多个网络里后面网络的赋值会覆盖前面网络。比如你在网络1里给Q0.0赋TRUE又在网络5里给Q0.0赋值FALSE那最终Q0.0的输出取决于网络5的结果。交通灯这种项目特别容易犯这个错因为你在每个状态里都会去点亮对应的灯写着写着就把同一个Q写进了好几个网络。解决办法就是我在第4章强调的输出统一处理所有状态位判断完成后在最后一个网络里统一给Q赋值。这样即使前面的状态位发生了切换最终输出也不会出现重复赋值。6.2 定时器复位一个被咬死的状态机TON定时器的特点是IN为TRUE开始计时达到PT后Q保持TRUEET停在PT值只有IN变成FALSE定时器才复位ET清零。所以做状态切换时如果只置位了下一个状态却没有复位当前状态的定时器等下一个周期回到当前状态时定时器可能直接处于计时完成状态导致状态瞬间跳走或卡死。我见过不少同学的程序现象是南北绿灯只亮了不到一秒就跳走查了半天发现是上一次循环结束后定时器没复位。处理办法很简单状态切换时除了切状态位还要把当前状态的定时器IN断开或者用复位指令把定时器清零。这一点无论梯形图还是SCL都要特别注意。6.3 真实接线时公共端接错的几个症状如果你最终要接到实物模型上接线问题会比逻辑问题更隐蔽。最常见的症状是PLC程序监控明明有输出但灯就是不亮。遇到这种情况第一步拿万用表量输出点对M的电压有24V就是PLC侧没问题问题在负载或模型接线没有24V就看看是不是CPU输出组没有使能或者输出点已经烧了。第二步检查负载公共端是不是和PLC的M接到了同一条0V线上很多教学模型的公共端不止一个接错一根就会导致串电出现一开全亮的诡异现象。第三步确认负载电压等级DC24V的灯接到AC220V上一通电就报废这个错误我强调再多也不为过。6.4 如果想让设计更有亮点左转箭头、倒计时、HMI仿真基础版交通灯做完以后如果你想在答辩里多拿点分有三个方向值得扩展。第一个是加左转箭头。把每个方向拆成直行绿灯、左转绿灯、黄灯、红灯再加上左转车辆专用相位状态数量会增加但你用状态机的思路照样能控制只是状态表要重新画一遍时间分配要更细。第二个是加倒计时数码管显示。用S7-1200的Q点输出BCD码或直接驱动七段数码管把剩余秒数显示出来。这个扩展能考察你对数字量的综合运用做出来之后整个系统档次马上不一样。第三个是用博图的WinCC组态一个HMI触摸屏画面放一个启动按钮、一个停止按钮、一组红绿灯显示图形再和PLC联动仿真。HMI仿真和PLCSIM联动并不复杂但要注意HMI仿真按钮无反应时先检查PLCSIM是否在线、HM连接里的IP地址是否和CPU仿真地址对应不要一上来就怀疑是软件问题。做完这三点你的课程设计就不再是作业水平而是一个能拿得出手的完整系统。如果让我给后来者一个最实际的建议那就是这个项目成功的分水岭不在能不能抄到源文件而在能不能自己把状态表讲清楚。你哪怕一开始写得慢一点也一定要自己画出那张62秒的状态表然后在仿真里一条一条看状态变化。交通灯难吗真不难。它难的是你没有把时间轴和状态切换这两个最基本的工程概念建立起来。只要这个概念打通了后面你再去做机械臂、传送带、恒压供水这些复杂项目底层逻辑都是同一个东西。这篇文章里的方法和坑都是我实操时真正用过的你照着走一遍应该能少走不少弯路。