1. 项目整体设计与方案选型思路城轨自动售票机这个题目在PLC实训和毕业设计里出现的频率相当高。它不像交通灯、抢答器那样只考几个定时器和计数器而是把投币识别、票价比较、找零计算、出票动作、状态提示、异常退币这一整套业务流程压进一台小型控制器里。我第一次接触这类题的时候踩过一个坑把它当成单纯的按钮控制电机来做结果投币计值、找零判断和出票时序全搅在一起程序写到一半就跑不通了。后来拆成状态机重新组织才把逻辑理顺。这套控制方案的硬件核心是西门子S7-200系列PLC搭配MCGS组态触摸屏属于典型的下位机跑逻辑、上位机做交互结构。S7-200虽然属于较早的机型但它指令集完整、梯形图直观、编程软件操作门槛低非常适合用来把售票机的控制逻辑吃透。MCGS则负责把票价显示、投币金额、找零提示、设备状态这些信息呈现给操作者同时通过通信口和PLC交换数据。热搜里经常出现mcgs嵌入版mcgs物联助手这类词本质上都是围绕组态软件的使用展开和这里的应用思路是一脉相承的。这篇文章适合谁看正在做PLC课程设计、毕业设计的学生想找一个综合性强、能覆盖IO分配、梯形图、组态、接线全流程的练手项目也适合刚接触工控、想理解一台设备从需求到落地要经过哪些环节的入门者。我下面会从方案选型、IO分配、梯形图逻辑、MCGS组态到调试排故一层一层拆开讲重点讲清楚每个设计决定背后的原因而不是只贴一段程序。1.1 为什么选S7-200加MCGS这套组合先说选型逻辑。自动售票机的输入输出点数不算多但要处理的信号类型比较杂有按钮类的开关量输入有硬币识别器、纸币识别器送过来的脉冲或电平信号还有出票电机、找零电机、指示灯、蜂鸣器这些输出负载。算下来输入大概十几个点输出七八个点属于小型控制系统的范畴。S7-200的CPU224或者CPU226在点数上完全够用CPU226自带24入16出留有余量。更关键的是它的高速计数器和中断功能硬币识别器送过来的往往是脉冲信号用普通输入点计数容易丢脉冲用高速计数器就稳得多。这也是我建议这个项目不要用点数更少、功能更弱的基础机型的原因。MCGS这边TPC系列触摸屏配合S7-200的PPI或者MPI通信是很成熟的搭配。组态软件里直接有西门子S7-200的驱动选好通信口和波特率变量地址一填就能读写。热搜里建立连接需要目标PLC的端口号这类问题在这套组合里其实简化成了在设备窗口里设置站号和通信口不用像某些协议那样手填网络标识符。对新手来说通信配置越简单就越能把精力放在控制逻辑本身这是选它的一个重要理由。有人会问现在都用1200、1500了为什么还拿200来练手。我的看法是200的编程思路和后来的机型是相通的触点、线圈、定时器、计数器、数据传送这些基本元素没变把它练熟之后往上迁移很平滑。而且它的资料多、案例多遇到问题容易找到参考。1.2 自动售票机到底要实现哪些功能把功能列清楚是后面做IO分配和写程序的前提。我按用户从站到设备前到拿到票的完整流程来梳理选站与票价显示乘客通过触摸屏选择目的地或票价档位系统显示应付金额。投币与识币识别投入的硬币或纸币面额累加已投金额。这里要区分不同面额1元硬币、5元纸币、10元纸币的识别信号要分开处理。金额比较与找零计算当已投金额大于等于票价时计算找零金额并启动出票如果一直不够提示继续投币。出票动作驱动出票机构把票送出并用传感器检测是否出票到位。找零动作按计算出的找零金额驱动找零机构送出相应数量的硬币。退币功能乘客中途放弃购票时把已投的钱原路退回。状态与异常提示余额不足、找零不足、出票故障、设备待机等状态都要在触摸屏上有明确显示。这套流程里金额是一个贯穿始终的数据它的累加、比较、减法都要在PLC里用数据寄存器完成。很多新手的问题就出在这里用输出线圈直接表示金额状态结果多点组合就乱套了。正确做法是把金额存进VW或者VD里用比较指令来判断这样才能处理多档票价和多面额投币。1.3 系统分层架构与信号走向整个系统的信号走向可以分成三层来理解。最下面是现场信号层包括投币识别器的输入信号、限位和到位传感器、按钮、指示灯和各类执行电机。中间是控制逻辑层由S7-200承担负责采样输入、执行梯形图逻辑、驱动输出、维护金额和状态数据。最上面是人机交互层由MCGS触摸屏承担负责显示和下发指令。三层之间的数据流是双向的。PLC把当前金额、设备状态、故障码这些数据送到触摸屏的输入寄存器区触摸屏读取后刷新画面触摸屏上按下的选站按钮、退币按钮则写到PLC的输入寄存器区PLC读取后当成控制条件用。明确这个数据方向是后面配置通信变量时不出错的关键。我见过不少人通信配好了但数据不动排查半天发现是变量地址的读写方向设反了。架构确定之后接下来就是最实打实的一步把每个信号落到具体的PLC地址上。这也是IO分配表存在的意义。2. IO分配与硬件接线实操IO分配表是整个项目的地基。它做得好后面写程序和接线都是顺水推舟做得乱接线接错、程序地址对不上调试阶段会把人折磨到怀疑人生。我的习惯是先按输入和输出两大类把信号全部列出来逐个起一个能看得懂的名字再分配地址最后核对一遍有没有遗漏和冲突。2.1 输入输出点位的整理方法整理点位我有几个固定动作。第一把功能性信号和检测性信号分开。功能性信号是操作者主动触发的比如选站按钮、投币按钮、退币按钮检测性信号是设备反馈的比如出票到位、找零到位、硬币识别脉冲。这两类信号的处理逻辑不一样分开列不容易漏。第二给每个信号预留一个正常态标注。 PLC输入点的默认状态要和现场的传感器类型匹配。常开按钮不按时是0常闭按钮不按时是1光电传感器有遮光导通和遮光断开两种。这个不标清楚接线和程序里的常开常闭触点就会对不上。第三按信号类型归类。高速脉冲信号要单独挑出来准备接高速计数器输入点普通开关量接普通输入点模拟量如果用到要单独考虑。这样分配的时候不会把需要高速处理的信号随便丢到一个普通点上。下面是我整理的一份参考IO分配表按CPU226的地址空间规划实际项目可以根据自己的硬件型号调整。信号名称类型建议地址信号说明正常态启动/复位按钮输入I0.0系统上电复位常开按下为11元硬币识别输入I0.1硬币识别器脉冲输出脉冲接高速计数5元纸币识别输入I0.2纸币识别器电平输出有币为110元纸币识别输入I0.3纸币识别器电平输出有币为1出票到位检测输入I0.4出票机构限位传感器到位为1找零到位检测输入I0.5找零机构限位传感器到位为1退币按钮输入I0.6乘客主动退币常开按下为1找零币不足检测输入I0.7找零箱缺币传感器缺币为1选站按钮1输入I1.0触摸屏也可替代常开选站按钮2输入I1.1触摸屏也可替代常开出票电机输出Q0.0驱动出票机构通电动作找零电机输出Q0.1驱动找零机构通电动作退币电机输出Q0.2驱动退币机构通电动作待机指示灯输出Q0.3系统就绪提示通电点亮投币提示灯输出Q0.4提示可投币通电点亮出票提示灯输出Q0.5提示正在出票通电点亮蜂鸣器输出Q0.6异常或完成提示通电鸣响找零不足报警输出Q0.7缺币报警输出通电报警提示表格里的地址是参考值实际分配时要先确认所选CPU型号的地址范围尤其是高速计数器对应的输入点。S7-200的HSC0通常对应I0.0和I0.1HSC1对应I0.6和I0.7如果硬币识别要接高速计数就不能随便占用这些点。2.2 原理图、接线图里容易忽略的细节原理图和接线图是两份东西很多人把它们混为一谈。原理图讲的是电路怎么连、信号怎么走重点在电气关系和逻辑关系接线图讲的是端子排上哪根线接哪个点重点在施工和核对。做这个项目两份都要画而且要对着IO分配表来画确保三者一致。画原理图时输入端我一般这样处理公共端COM接24V正极还是负极取决于输入点的类型和传感器输出形式。S7-200的输入是漏型还是源型接法会影响COM的接法搞反了输入信号根本读不进来。输出端则要注意每个输出回路的负载电流出票电机这类感性负载要加吸收回路或者续流二极管不然断电瞬间的反向电动势可能干扰PLC甚至损坏输出点。接线图这块我建议按端子号一一对应的方式画最好在图上标注线号。实际接线时用带号码管的线接完一根勾掉一根能有效避免漏接和错接。我见过最典型的错误是把两个传感器的信号线接反了程序里A状态触发的动作跑到了B上排查时因为线路是通的反而先从程序找问题白白绕了弯路。接地和抗干扰也要在图上体现。PLC的接地端子和柜体接地要分开走线动力线电机、电磁阀和控制线传感器、通信线尽量分槽敷设。通信线PPI电缆或触摸屏通信线不要和动力线捆在一起走否则通信时好时坏很难定位。2.3 电气选型与安全保护选型不复杂但有几个点容易被忽略。直流电源要给PLC、传感器、指示灯提供稳定输出功率要留出余量别卡着算。出票、找零、退币三个电机的驱动如果PLC输出点直接带不动中间要加继电器或接触器由PLC输出点控制线圈再由触点控制电机回路。这样既保护了PLC输出点也方便检修。急停和过载保护是安全底线。急停按钮应该直接切断执行机构的动力回路而不是只作为PLC的一个输入点这是硬性要求不能靠软件逻辑来兜底。热继电器或电流检测用来做过载保护电机堵转时及时断开避免烧电机。这些在原理图上要画清楚标出保护元件的型号和整定值。感应式硬币识别器和纸币识别器一般自带信号输出选型时要确认它的输出类型NPN还是PNP、输出电压等级、能否和S7-200的输入直接对接。对不上就要加电平转换或光耦隔离。这些细节在方案阶段确认好比接完线再去改要省事得多。3. 梯形图程序核心逻辑拆解程序是项目的灵魂。我写这个项目的程序时最大的体会是不要一上来就写先把流程画成状态图。售票机本质上是一个状态机待机、投币中、金额足够、出票中、找零中、完成、退币每个状态有明确的进入条件和退出条件把状态理清梯形图就是状态的翻译。3.1 程序结构划分与状态机设计我习惯把程序分成几个子程序主程序里按条件调用逻辑清爽也方便调试。初始化子程序上电时清零金额、状态标志、计数器把所有输出复位到安全状态。金额处理子程序负责识别投币信号累加金额和票价比较计算找零。动作控制子程序负责出票、找零、退币的电机动作和到位检测。状态管理子程序维护当前系统状态控制指示灯和提示。通信数据子程序把金额、状态、故障码送到触摸屏读取触摸屏指令。状态管理用一个字节或字来表示比如用VB100存状态码0是待机1是投币中2是金额足够出票3是出票中4是找零中5是完成6是退币中。用状态码的好处是每个状态下只执行该做的事不会互相干扰。这是解决我开头提到的逻辑搅在一起问题的关键。3.2 投币计值与票价比较逻辑金额累加的核心思路是每种面额对应一个输入信号检测到有效信号就把对应金额加到总金额寄存器里。1元硬币走高速计数累计到一定数量后累加金额5元和10元纸币走普通输入检测到上升沿就加一次。这里要注意两个坑。第一个是信号抖动和重复计数。机械触点类的信号会有抖动用普通输入点计数可能一个动作数出好几次。解决办法是加滤波或者用上升沿检测指令只捕获一次跳变。第二个是纸币识别器的电平信号保持问题如果纸币识别器输出的是一个持续的高电平直接加金额会一直累加必须检测上升沿。金额累加后用比较指令和票价比较。票价存在另一个寄存器里选站按钮或者触摸屏选站会写入对应票价。比较逻辑写起来是金额大于等于票价就置位金额足够标志进入出票状态金额小于票价就继续等待投币。找零金额就是当前金额减去票价。这个减法要用整数或双整数运算指令来做因为是带符号运算要注意数据范围。投币金额一般不会太大用整数就够但保险起见可以用双整数避免溢出。3.3 出票、找零、退币的动作互锁三个动作电机是这套系统里最容易出问题的地方因为它们不能同时动作而且要么都不动要么按顺序动。互锁必须做足否则可能出现出票的同时找零机械卡死。互锁我分两层。第一层是状态互锁只有在出票状态下才能驱动出票电机只有在找零状态下才能驱动找零电机状态码不对电机输出被复位。第二层是硬件到位检测互锁出票电机启动后等待出票到位信号到位后立即停止电机如果超过设定时间还没到位就判定故障停机报警。这个超时判断用定时器实现时间设多少要根据实际出票机构的动作周期来定一般留出正常动作时间的一点五倍作为上限。找零逻辑稍微复杂一点因为要出若干枚硬币。可以用计数器配合找零电机的动作每到位一次计数一次计到找零数量就停止。找零数量等于找零金额除以单枚硬币面额用整除指令算出来。如果除不尽说明找零方案需要调整或者限定投币面额组合。退币则是在任何投币阶段按下退币按钮都能触发把当前金额对应的硬币退回退完后金额清零状态回到待机。退币过程中同样要有到位检测和超时保护。3.4 定时器与计数器在流程里的实际作用这个项目里定时器和计数器用得很多我列几个典型用途投币等待定时器进入投币状态后开始计时超时未投币自动回到待机防止设备一直挂着。出票超时定时器电机启动后开始计时超时未到位判故障。找零计数统计已出的找零硬币数量达到目标值停止。完成提示定时器出票找零完成后提示灯和蜂鸣器保持一段时间再自动熄灭。定时器的预设值要结合现场实测来调不要照搬别人的数值。同一个逻辑换个电机、换个机构动作时间可能差一倍。我的经验是把预设值先设大一点观察实际动作时间再逐步收紧这样既不会误报故障也能发现真正卡顿的情况。计数器的清零时机也要想清楚。找零计数要在每次找零结束后清零而不是在系统复位时否则第二次找零会从上次的数值接着数数量就不对了。这类计数器复位时机的问题是新手程序里最常见的一类bug。4. MCGS组态画面设计与通信配置梯形图让设备会动MCGS让设备会说话。触摸屏的价值在于把PLC内部的数据变成操作者能看懂的画面同时把操作者的意图翻译成PLC能读的信号。做这部分思路要围绕人要看什么、人要按什么来展开而不是单纯堆控件。4.1 PLC与触摸屏通信参数设置通信配置是MCGS项目的第一步也是问题最多的一步。步骤上一般是在MCGS的设备窗口里选择西门子S7-200的驱动设置通信口和波特率然后建立变量并映射到PLC的寄存器地址。通信口和波特率必须两端一致PLC这边设成多少触摸屏这边就配多少对不上就连不通。站号也要确认。一台触摸屏可能连多台PLC站号就是用来区分设备的。单台设备的情况下站号只要两端一致即可一般用默认值。热搜里inproshop怎么设置PLC端口号这类问题本质就是在配置通信端口和参数思路是一样的。配置完之后先用一个简单的指示灯变量测试通信是否通。在触摸屏上做一个按钮按下时置位PLC的某个位再用一个指示灯读这个位的状态能点亮就说明通信没问题。先打通通信再去堆画面这个顺序能省下大量排查时间。4.2 售票主界面与后台监控界面画面设计我一般分两个界面。售票主界面面向乘客要简洁直观票价显示区、已投金额显示区、找零金额显示区、选站按钮区、投币状态提示区、退币按钮。后台监控界面面向维护人员显示设备状态、故障码、各输入输出点的实时状态、累计售票数据等。主界面的显示数据都是读PLC的寄存器选站按钮和退币按钮则写PLC的寄存器。比如选站按钮按下把对应的票价写入PLC的票价寄存器退币按钮按下把退币标志位置1PLC读到后启动退币流程。这里要特别注意变量的读写方向读的是PLC到触摸屏写的是触摸屏到PLC配反了要么显示不变要么按钮无效。金额显示建议用数值显示控件绑定PLC的金额寄存器并设置好小数位和范围。如果金额是整数不要显示成小数避免误解。4.3 数据对象、报警与历史数据配置数据对象是MCGS里连接画面和PLC的桥梁。每个需要在画面上显示或者操作的量都要建一个数据对象并设置好类型和地址。开关量用开关型对象金额用数值型对象故障码可以用数值型也可以用字符串。报警配置主要负责异常提示。找零币不足、出票超时、通信中断这几类都值得做报警。报警触发后画面上弹出提示或者用颜色变化标注。报警的触发条件要和PLC里的故障标志对应起来PLC判定的故障触摸屏负责显示职责要分清。历史数据这块如果项目要求记录售票流水可以用MCGS的数据存盘功能定期把售票时间、票价、投币金额存下来。配置时注意存盘周期和数据量周期太短会拖慢系统太长又可能丢失细节。一般按分钟级或者事件触发来存就够了。热搜里出现过mcgs配方当作历史数据这类用法思路是利用配方功能做批量数据的存储和调用和这里的流水记录是两种场景不要混淆。售票记录更适合用存盘数据的方式处理。5. 调试排故与经验总结程序写完、线接好、画面配完接下来就是调试。这个阶段是最花时间也最能积累经验的。我把调试分成三步走先单体后联调先手动后自动先正常后异常。5.1 通信连不上的排查思路通信故障排第一。触摸屏和PLC连不上可能的点很多我按顺序查通信线是否接对、波特率是否一致、站号是否匹配、通信口是否选对、PLC是否处于运行状态。这几项逐一排除大部分问题能解决。如果这些都对还是连不上就要看通信线的质量。劣质线材或者过长的通信线会导致信号衰减尤其是在有动力干扰的环境里。换一根短的好线测试能快速定位是线的问题还是配置的问题。还有一个隐蔽的问题是PLC通信口被其他设备占用。S7-200的通信口有限如果一个口接了编程电缆另一个口接触摸屏通常没问题但如果某个口被其他程序或设备占用就会冲突。调试时先把不必要的外部设备断开。5.2 逻辑跑飞与误动作的处理逻辑问题的表现往往是该动的不动不该动的乱动。遇到这种情况我第一件事是用编程软件的监控功能看实际状态把怀疑的信号都调出来观察输入点是否真收到了信号输出点是否真被驱动了中间标志位是什么状态。不要靠猜。误动作最常见的原因是标志位没有及时复位。比如出票完成后忘记复位出票中标志下一次流程就会被错误地当成还在出票。排查时重点看每个状态标志的置位和复位条件是否成对出现。另一个原因是定时器/计数器预设值不合理。时间设得太短正常动作还没完成就报故障设得太长故障了也不报警。这个要结合实测调。5.3 现场调试的几个实用技巧分段调试法把程序分成几个功能块逐个块调试每块都通了再联调。不要一次性全开出了问题定位困难。强制输出测试法接线接好后先不跑程序用编程软件强制输出点位逐一检查对应的电机、指示灯是否动作。这一步能快速验证接线是否正确把接线问题和程序问题分开。状态码观察法把状态码映射到一个输出显示或者直接在触摸屏上显示当前状态观察状态跳转是否符合预期。状态跳转不对说明进入退出条件的逻辑有问题。留调试接口程序里预留几个标志位或者测试按钮方便调试时手动触发某些动作。正式交付前把这些接口屏蔽或加上权限控制。5.4 常见问题速查表现象可能原因排查方向触摸屏显示数据不动通信未通或变量地址错检查通信参数和变量映射按钮按下无反应读写方向配反或PLC未读到检查变量方向和PLC输入寄存器投币金额累加不准信号抖动或未做边沿检测加滤波或改用上升沿指令找零数量每次不对计数器未清零检查计数器复位时机出票电机不动作输出点未驱动或接线错强制输出测试对应点位电机动作完不停到位检测未接入或超时未判检查到位信号和定时器出票找零同时动互锁不完整补充状态互锁和硬件互锁通信时通时断通信线受干扰或接虚分槽敷线、更换线材、检查端子上电后输出乱动初始化未复位输出在上电初始化里复位所有输出故障后无法复位故障标志未清除复位逻辑里清故障标志和定时器5.5 关于扩展与迁移的几句实在话这套方案吃透之后往其他类似设备上迁移是很顺的。自动售货机、自助缴费机、自助取号机它们的控制框架和售票机高度相似无非是投币方式、货物种类、动作机构不同。把金额处理、状态机、互锁、异常处理这几个模块抽象出来就是一个通用的自助设备控制模板。如果后面要升级到更新的PLC平台或者加上远程监控核心逻辑不需要大改主要工作是通信方式和组态画面的适配。逻辑层和数据层的分离设计在这个时候就能体现出价值。我个人的体会是练手项目的价值不在于做完而在于做完之后还能想清楚哪些部分是通用的、哪些是专用的想清楚了下一个项目就能少走一大截弯路。
