交通灯MCGS7.7和西门子S7-1200联机程序2博途V16,带注释和IO表,工作周期38秒刚折腾完一个交通灯控制项目用MCGS触摸屏和西门子S7-1200 PLC联机控制。这玩意儿看着简单实际调试起来真是处处是坑。先说硬件配置S7-1214C DC/DC/DC的CPU数字量输出模块SM1223MCGS TPC7062KX触摸屏。IO表直接贴这儿DI部分急停按钮 - I0.0DO分配东西红灯 - Q0.0东西黄灯 - Q0.1东西绿灯 - Q0.2交通灯MCGS7.7和西门子S7-1200联机程序2博途V16,带注释和IO表,工作周期38秒南北红灯 - Q0.3南北黄灯 - Q0.4南北绿灯 - Q0.5程序结构用了SCL语言写博途V16的FB块里塞了个状态机。核心逻辑就四个阶段循环跑总共38秒周期。来看段关键代码CASE #state OF 1: //东西绿灯25秒 #东西绿灯 : TRUE; #南北红灯 : TRUE; TON(IN:TRUE, PT:T#25S, Q#t1_done); IF #t1_done THEN #state : 2; RESET_TIMER(#t1); END_IF; 2: //东西黄灯3秒 #东西黄灯 : TRUE; TON(IN:TRUE, PT:T#3S, Q#t2_done); IF #t2_done THEN #state : 3; RESET_TIMER(#t2); END_IF; //...后续状态类似南北方向绿灯持续30秒这段状态切换最要命的是定时器复位问题。刚开始忘了RESET_TIMER结果定时器累积计时直接乱套。调试时候发现黄灯闪得跟抽风似的查了半小时才发现是定时器没清空。触摸屏组态最骚的操作是绑定PLC变量。MCGS里直接建了个设备窗口西门子S7-1200驱动走TCP/IP协议。重点是把触摸屏按钮地址和PLC的DB块对应上设备地址 DB1.DBX0.0 # 对应PLC的启动按钮 报警变量 DB1.DBD4 # 当前状态时间显示调试时候死活连不上最后发现是子网掩码设错了。PLC的Profinet地址要跟触摸屏在同一个网段这个低级错误折腾了我两包烟的时间。时序控制有个细节南北绿灯比东西多5秒这是给左转车流的缓冲时间。用了个结构化变量来存剩余时间#remainingTime : INT_TO_TIME(38000) - T#1S * _tickCounter;这个_tickCounter每秒自增一次在OB30循环中断里触发。刚开始直接在主OB1里做计时结果扫描周期不稳导致秒数不准改到循环中断立马顺了。联机调试时发现触摸屏按钮偶尔卡顿后来在PLC端给每个按钮信号加了20ms的脉冲过滤。有时候现场干扰比代码bug还难搞特别是附近有大功率电机启动时数字量输入能给你抖成迪斯科。最后说下那个38秒总周期怎么来的东西向25328秒南北向30535秒取最大公约数凑出来的。实际路口可能要根据车流量微调但毕业设计嘛...你懂的能跑起来就是胜利。