S7-1200博途V15交通灯PLC编程实战:比较指令与触摸屏联调

发布时间:2026/10/9 4:09:20
S7-1200博途V15交通灯PLC编程实战:比较指令与触摸屏联调 不瞒你说交通灯这个项目我在实训室里带学生做过不下十遍但真正自己上手用S7-1200配合博途V15从零写一套、再连上触摸屏跑通还是遇到了一些值得记录的细节。先说结论这套程序的核心逻辑不复杂一个秒计数器加几组比较指令就能搞定但如果你想让它运行稳定、改时间方便、触摸屏上能实时倒计时那就很有讲究了。下面我把整个项目从需求拆解到调试完成的思路完整写下来。这篇主要面向两类人一是刚接触西门子PLC编程想做交通灯作为练手项目的初学者二是带学生做课程设计的老师。你会看到完整的程序段划分、比较指令区间写法、触摸屏组态步骤还有我在真机上调试过程中踩过的坑。全程用的都是博途V15和S7-1200触摸屏用的是西门子精简系列面板如果你手里的硬件是KTP700或者更老的型号思路同样适用。1. 项目需求拆解十字路口红绿灯的时序逻辑到底是什么别急着开博途先把需求吃透。交通灯看起来简单但它是一个典型的有限状态循环系统时序一旦搞错灯就会乱跳路口直接瘫痪。所以在写第一行梯形图之前我建议你拿一张纸把每个方向、每个灯色、每个时间段的对应关系画出来。1.1 一个标准周期的相位划分十字路口三色灯看起来是四个方向实际东西和南北是两两对偶的。设定一个60秒的完整周期那么常见的标准相位分配是时间区间秒东西方向南北方向024绿灯红灯2529黄灯红灯3054红灯绿灯5559红灯黄灯也就是说东西方向先放行25秒然后黄灯过渡5秒再禁行30秒南北方向正好错开半个周期东西禁行的时候南北放行。总周期是25 5 30 60秒。为什么要固定成60秒因为59以内的一切运算都可以用整数表达给触摸屏显示剩余秒数时不需要处理浮点程序里也不会出现0.5秒这种尴尬的中间态。当然实际路口的配时要根据车流量来有的地方直行45秒左转15秒但那是多相位复杂逻辑本项目的核心思路不受影响。1.2 除了灯还有什么必须做实训项目往往不是让灯亮起来就完事的。我把需求列成了一张清单做的时候对着打钩三色灯按上述时序自动循环且切换瞬间干脆利落不闪烁不重叠触摸屏实时显示当前相位名称和剩余倒计时秒数触摸屏上能手动切换自动/手动模式手动模式下可以单独点动每一组灯方便演示和排查接线有急停和复位功能按下急停后所有输出清零复位后重新从当前周期继续程序段划分清晰改时间参数只动一个地方不需要翻遍全程序实际项目如果要做扩展可以加车流量传感器、夜间黄闪模式、特殊车辆优先等。但那些都属于锦上添花核心时序逻辑不变。我做课程设计的时候常常提醒学生先把自动循环和触摸屏倒计时做出来再去想加分项否则项目烂尾的概率极高。1.3 区间交接点一条容易出错的细节这里必须专门说一下边界问题。比较指令判断的是一个范围但范围两端开闭处理不好就会出现两盏灯同时亮或者中间空一拍的状况。我的惯例是全部采用“左闭右开”区间起点用大于等于终点用小于。比如东西绿灯是0到24秒就写成 Count 0 AND Count 25这样第25秒整一到绿灯灭、黄灯亮交接瞬间干干净净既不重叠也不会空档。这个习惯我后面在程序实现章节还会反复强调因为它是这套方案能不能“稳定运行”的关键。2. 为什么用比较指令和定时器方案掰扯清楚很多人一上来就用TON定时器堆第一个定时器到25秒启动黄灯定时器同时断开绿灯第二个定时器到5秒启动红灯定时器……这种写法确实是最直观的思路我在早期教学时也这么教。但它有几个很烦的问题实际用起来越改越难受。2.1 定时器堆叠的痛点维护困难想改一个区域的时间你可能要动两三个定时器的预设值而且定时常数和“第几秒到第几秒”之间没有直观对应关系。比如你想把东西绿灯从25秒改成30秒不仅得改第一个定时器后面所有定时器的触发条件都要跟着调整。中间状态多每个定时器有自己的Q输出和ET当前值程序段多了以后排查起来非常头大。哪个定时器先到、哪个后到靠脑子根本理不清。触摸屏显示剩余时间麻烦你得从定时器的ET里换算而且多个定时器串联时当前到底在第几个阶段还得用一堆辅助M点去标记逻辑绕来绕去。2.2 比较指令方案一个时间轴搞定所有相位比较指令的思路完全不同。它把整个周期压缩成一条统一的时间轴用一个全局秒计数器表示系统运行到第几秒然后每一组灯都只回答一个问题——“当前秒数是否落在我的区间内”。这样做的好处非常明显改时间只改比较指令里的常数或者更进一步把常数换成DB里的变量触摸屏上就能直接改配时参数倒计时显示可以直接做减法剩余秒数 区间结束值 - 当前秒数在PLC里一条减法指令就算完了梯形图上看着就是一组组区间判断逻辑完全可视化初学者学起来好懂答辩时也好讲当然比较指令方案也有它的代价需要一个可靠的秒脉冲源还要一个能自复位的计数器。这两个条件在S7-1200上都不是事儿系统自带Clock_1s时钟脉冲加法和比较指令都是现成的。2.3 为什么不直接用系统时间有人会问S7-1200不是有系统时钟吗直接读系统时间不是更方便确实可以但系统时间的秒是UTC时间戳做相位控制需要自己处理取模运算而且调试时想人为加快时间轴比如实训演示时把周期缩成6秒跑一遍非常麻烦。自己维护一个秒计数器就灵活多了想快想慢全凭一个倍率变量的事我甚至会在程序里预留一个“时间倍率”寄存器默认等于1演示时改成1060秒周期6秒跑完效果直接拉满。2.4 一个容易被忽略的跨度问题再说了定时器方案还有一个固有缺陷——定时器数量有限或者说你不想为了一个交通灯把定时器资源耗尽。S7-1200虽然定时器资源不算少但复杂一点的多相位路口、多模式切换纯定时器很快就会捉襟见肘。比较指令方案从头到尾只需要一个计数器加几组比较资源占用几乎可以忽略不计而且移植到别的PLC汇川、三菱、AB时思路照样通用只是指令名字变一下。3. S7-1200核心程序实现从秒脉冲到三色灯输出这部分直接讲程序怎么搭。我用的博途V15硬件是CPU 1214C DC/DC/DC触摸屏计划用KTP700 Basic PN。如果你用的是1211C或者1215C程序完全一样只是I/O点数不同。3.1 建立PLC变量表在博途项目树里双击“PLC变量”把下面这张表定义好。我习惯用M区作为中间变量输出点直接用Q点这样触摸屏访问方便逻辑也清晰。变量名称数据类型地址注释Clock_1sBool%M0.0系统1秒时钟脉冲从常量目录拖入Pulse_1sBool%M0.1秒脉冲上升沿标志CountInt%MW10当前秒数059循环EW_GreenBool%Q0.0东西方向绿灯EW_YellowBool%Q0.1东西方向黄灯EW_RedBool%Q0.2东西方向红灯SN_GreenBool%Q0.3南北方向绿灯SN_YellowBool%Q0.4南北方向黄灯SN_RedBool%Q0.5南北方向红灯GreenTimeInt%MW20绿灯时长默认25可触摸屏修改YellowTimeInt%MW22黄灯时长默认5可触摸屏修改Auto_ManualBool%M5.0TRUE自动FALSE手动这里有个容易被忽略的点Clock_1s在博途里不是随便写的地址它是系统常量路径在“常量”目录下。直接输入符号名Clock_1s即可博途会自动解析。它是1Hz方波高电平500ms低电平500ms我们靠它的上升沿来驱动计数器。如果你想加快或放慢演示速度可以把Clock_1s换成Clock_2s或Clock_5s模拟时很好用。3.2 秒计数器网络上升沿加一到了60清零在OB1里新建程序段逻辑是这样的Network 1: 秒脉冲检测 Clock_1s ---[P]--- Pulse_1s Network 2: 计数加一 Pulse_1s ---[ADD_I]--- MW10 : MW10 1 Network 3: 周期复位 Count 60 ---[MOVE]--- 0 - MW10具体写的时候我建议把Network 1和Network 2合并直接在Clock_1s的上升沿触点后面接加法指令这样省一个M点。但教学中拆开写更直观方便讲解“上升沿”这个概念。为什么要取上升沿因为Clock_1s是方波一个周期内高电平持续500ms。如果不取上升沿直接在每个扫描周期里触发加法扫描周期是毫秒级一秒能加几百次计数器直接起飞。这个坑学生几乎每届都踩我在实训课上一看计数器数值在疯狂跳动就知道又是有人忘了在触点后面加P指令。3.3 东西方向的三个比较区间东西方向绿灯梯形图的逻辑关系是Network 4: 东西绿灯 Count 0 AND Count GreenTime ---( )--- EW_Green Network 5: 东西黄灯 Count GreenTime AND Count GreenTime YellowTime ---( )--- EW_Yellow Network 6: 东西红灯 Count GreenTime YellowTime AND Count 60 ---( )--- EW_Red博途里的比较指令在“基本指令”-“比较运算”里整数比较有等于、大于等于、小于等于等操作符。我把两个比较指令串联起来就形成一个区间判断。GreenTime和YellowTime是变量默认25和5所以实际效果就是0到24秒数绿色25到29秒黄色30到59秒红色。为什么不直接把RedTime也做成变量逻辑上也可以但红时间其实是60减去绿和黄做成变量后还得保证三者之和等于60徒增约束条件。我选择让触屏只调绿和黄红灯自动补位简单可靠。如果你要做的场景必须独立设置红灯时间那就得把周期总长也做成变量逻辑稍微复杂一丢丢。3.4 南北方向不是简单复制而是错位取反南北方向其实是东西方向的对偶很多新手忍不住把东西的程序复制一遍然后改地址结果发现时序怪怪的。原因在于南北的红绿和黄区间和东西是错开的——东西红的时候南北绿东西绿的时候南北红。南北方向三个区间的正确写法是Network 7: 南北红灯 Count GreenTime YellowTime ---( )--- SN_Red Network 8: 南北绿灯 Count GreenTime YellowTime AND Count GreenTime YellowTime GreenTime ---( )--- SN_Green Network 9: 南北黄灯 Count GreenTime YellowTime GreenTime AND Count 60 ---( )--- SN_Yellow注意南北红灯的区间是周期前段30秒而不是我第一版写的错误版本。南北绿灯从30秒开始持续到54秒然后55秒进入黄灯直到60秒归零重新循环。如果代码是从东西方向直接复制再改区间的非常容易把南北绿灯与东西绿灯重叠那就闹笑话了。3.5 手动模式与输出统一管理手动模式我通常在OB1里单独建一组网络用Auto_Manual这个M点作为总开关。自动模式下所有输出由比较指令驱动手动模式下输出直接受触摸屏按钮位控制比如M10.0对应东西绿灯、M10.1对应东西黄灯、M10.2对应东西红灯。为了防止自动和手动两套输出在程序里互相打架我不会让两套逻辑直接写同一个Q点。我的做法是自动逻辑直接写Q点手动逻辑先激活辅助标志再在程序末尾做一个“输出总控”段统一把结果映射到Q点。这样做的好处是无论自动手动现场接线都不用动出问题时也只需要盯着最后一个输出段排查。3.6 EN和ENO顺便讲清楚热词里有人搜“西门子plc en eno”这里顺便说透。EN是使能输入只有EN为TRUE时指令才会执行ENO是使能输出指令执行成功时为TRUE。比较指令的CMP也有EN/ENO而且CMP的ENO本身具有“条件满足”的语义。因此很多人喜欢把CMP的ENO直接接到输出线圈上——一条指令搞定条件判断和输出赋值确实简洁。但我个人更倾向把条件和输出线圈分开写原因只有一个可读性。学生在博途里看到一个比较指令的ENO后面拖着线圈总觉得少了点什么还是显式写一个线圈更直白。4. 触摸屏组态与联调让红绿灯动画跑起来程序写完不连屏这个项目只完成了一半。看到触摸屏上的红绿灯真的随着PLC程序跳动那个成就感完全不一样。4.1 触摸屏选型与通讯建立我这里用KTP700 Basic PN博途V15直接组态和S7-1200走Profinet。如果你用的是MCGS或者威纶通主要差异在驱动选择和IP设置原理完全一样。在博途里新建HMI设备分配网络时把HMI的以太网口和PLC的Profinet接口连到同一个子网。PLC的IP我习惯设为192.168.0.1HMI设为192.168.0.2子网掩码255.255.255.0。联调前先用电脑ping一下PLC通了这个项目已经成了40%。热词里有一个“mcgs触摸屏跟西门子1500跨网段通讯”我的经验是能同网段就同网段别给自己找麻烦。PLC是10.10.10.1触摸屏是192.168.0.2这种跨网段配置在触摸屏上直接走以太网协议是通不了的必须靠路由器做地址转换。实验室里模拟跨网段往往调试成本远高于把IP理顺。4.2 变量连接与画面设计在HMI变量表里把PLC变量直接拖过来建立连接。注意变量地址必须是PLC侧的绝对地址或符号地址HMI侧可以起一个方便阅读的名字。我的HMI变量表大致长这样HMI变量名连接对应PLC地址用途HMI_CountHMI_Connection%MW10当前秒数显示HMI_EW_GreenHMI_Connection%Q0.0东西绿灯状态HMI_EW_YellowHMI_Connection%Q0.1东西黄灯状态HMI_EW_RedHMI_Connection%Q0.2东西红灯状态HMI_SN_GreenHMI_Connection%Q0.3南北绿灯状态HMI_GreenTimeHMI_Connection%MW20绿灯时长设定画面设计上我放了两组灯柱每组三个圆形指示灯。指示灯的颜色通过“动画”绑定到对应的HMI变量变量为TRUE显示亮色FALSE显示暗色。在博途里给圆形的“背景颜色”添加外观动画状态0对应灰色状态1对应绿/黄/红三色。倒计时部分则放大数字显示框关联HMI_Count。这里有个更聪明的做法倒计时不在触摸屏端计算而是在PLC里算好再发给HMI。我会在PLC里新增一个“剩余秒数”变量RemainTime根据当前相位做减法触摸屏只负责显示。这样跨品牌触摸屏也能轻松适配还能避免触摸屏端表达式计算带来的刷新延迟。4.3 编译下载与在线调试流程调试顺序很重要别一上来就PLCHMI一起下载出了问题都不知道从哪头查。我的顺序是先PLC后HMI先把PLC程序编译下载在线监控Q点输出确认三组灯按照时序自动切换再检查触摸屏项目编译下载到硬件确认能连上PLC最后联调看画面上的指示灯和倒计时是否和实物一致第一次跑的时候PLC下载后程序其实已经在跑但触摸屏上没反应。排查下来是HMI项目的通讯连接没建好——新建HMI连接时默认选成了错误的驱动类型。你需要检查HMI连接表驱动程序选“SIMATIC S7-1200”接口选“以太网”HMI设备子网和PLC一致三样缺一不可。下载HMI时KTP700要用网线直连电脑电脑的IP必须和触摸屏同网段。很多人卡在“下载按钮找不到设备”其实就是你电脑的网卡IP和触摸屏默认IP不在同一网段。把电脑网卡临时改成192.168.0.10下载成功后再改回来就行。4.4 触摸屏上常见的几个问题倒计时数字一直显示0是我见过最多的现象。原因很简单PLC变量没连上或者MW10的数值格式选错了。S7-1200里MW10是Int类型16位HMI侧显示格式必须对应选Int如果误选成32位整数读出来的数据就是乱的。刷新周期也容易踩坑。博途HMI运行时的变量刷新时间是可配置的默认可能比较长倒计时看起来一顿一顿的。我把HMI_Count和几个灯状态变量的采集周期改成100ms画面就丝滑多了。这属于花小钱办大事的优化强烈推荐。4.5 手动模式按钮的自锁问题触摸屏上做手动模式我最初踩过一个大坑按下“东西绿灯”点动按钮灯只闪一下就灭了。原因在于HMI写入PLC的位只持续一个扫描周期程序里又没有自锁位一消失输出自然就断开。解决办法有两个一是在PLC里对按钮位做置位/复位锁存逻辑二是在HMI上把按钮类型从“按钮”改成“切换”让它保持按下或弹起状态。我实际项目里更推荐第一种因为第二种依赖HMI侧的按钮状态一旦触摸屏重启状态复位场面容易失控。5. 实测中的坑与调试笔记最后这块是我最想写的。光看例程你永远不知道哪些地方会翻车。这些坑我都是在真机上一一踩过、又花了不少时间排查出来的写下来省得你再走弯路。5.1 秒脉冲不计数先查上升沿和时钟来源前面说过Clock_1s是系统常量但博途V15里系统常量不止一个有Clock_1s、Clock_2s、Clock_5s等等。如果你拖的是Clock_2s计数器每2秒才加1所有灯的时间都会翻倍。检查方法很简单在线监控MW10的变化频率拿手机秒表对一下偏差超过0.5秒基本就是选错时钟了。这种低级错误我在带学生的时候见到的频率高得离谱。5.2 边界值的一秒犹豫比较指令的边界是最容易出时序重叠或空档的地方。我的项目全部用“左闭右开”区间起点用终点用。比如东西绿灯是Count 0 AND Count 25第25秒整就切黄灯不存在24.9秒这种模糊状态。定时器方案里定时器Q的翻转本身受扫描周期影响而比较指令的区间判断在同一个扫描周期内完成切换是绝对精确的。灯切换干脆利落这是观众最先感受到的“高级感”。5.3 输出地址冲突Q点被重复赋值课件里常有人把同一盏灯在两个网络里各写了一次输出自动程序网络写了Q0.0手动程序网络又写Q0.0。这在梯形图里不会报错但逻辑上后执行的网络会覆盖前面的输出导致该亮的灯不亮、该灭的灯乱亮。S7-1200的OB1网络是按顺序执行的越靠后的网络优先级越高。我的做法是前面说的所有输出统一在末尾的“输出总控”段处理自动和手动逻辑只修改中间标志位哪怕程序写乱了灯也不会乱闪。5.4 触摸屏按钮瞬时按下抓不住手动模式里最容易出现的一个现象按一下触摸屏按钮灯只跳一下就没了。原因前面说过HMI写入PLC的位维持时间极短没有自锁逻辑时这个位根本驱动不起输出。还有就是触摸屏按钮同时被多处使用比如既用来切换手动模式又用来点动输出变量地址冲突导致两个按钮互相覆盖。我的习惯是分区块规划HMI变量地址手动模式相关按钮全部放在M10.0到M10.9一段切换类标志放M5.x一段字段之间留足空余避免交叉。5.5 仿真器启不动的排查思路热词里有人问“S7-PLCSIM Advanced V5.0 PLC实例为什么启动不了且没有报错”、“PLCSIM Advanced PLC启动不了 error11”说明不少人卡在仿真环节。我个人的经验是PLCSIM Advanced和普通PLCSIM不一样前者主要面向S7-1500软PLC和仿真场景S7-1200的逻辑仿真直接用博途自带的PLCSIM就好。如果你非要拿Advanced做S7-1200版本匹配和授权非常容易出各种奇怪问题而且往往没有明确报错。我的建议是S7-1200逻辑仿真用普通PLCSIM触摸屏仿真用HMI模拟器两者联调放到真机上做。不要在一个仿真工具上死磕那通常不是程序问题而是软件版本和授权问题。5.6 关于AI代码生成工具的一点提醒热词里有“ai plc代码生成”这确实是最近的一个新趋势。我也试用过一些AI辅助写顺控逻辑对于IO映射、定时器初始化这类规整代码确实快但交通灯这种多相位时序联动AI生成出来的区间判断经常会出现边界重叠或者漏掉计数器自复位。我的建议是AI生成的代码可以当参考框架但一定要自己在博途里一个网络一个网络复盘尤其关注比较指令的边界值——那是AI最容易出错的地方。毕竟交通灯程序不长手写也就半小时的事用AI省下的几分钟可能还不够你排查它埋下的雷。写到这里程序、触屏、调试几个环节都过了一遍。如果你照着这个思路去写注意我反复强调的边界条件和自锁逻辑交通灯项目基本不会出大问题。要是你真的遇到什么怪毛病PM我咱们一起研究研究。

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询