上个学期连着有几位学生来找我,题目都一样:基于西门子PLC的自动售货机控制系统设计。问得最多的不是线路怎么接,而是这套系统里PLC到底要干什么、梯形图怎么写、I/O怎么分配、拿到源文件之后从哪看起。后来我把这套设计资料整理成“源文件加万字报告加讲解”的形式,陆续也帮不少人做过适配定制,今天就把这套系统的完整设计思路、选型逻辑和调试经验从头到尾聊一遍。
这套内容适合三类人参考:正在做自动售货机相关课设或毕设的学生;刚接触西门子PLC、想找一个完整控制案例练手的工程师;准备把手动或半自动售货机改造成PLC控制的设备维护人员。下面提到的I/O地址、电机驱动参数,都是基于常见配置给出的参考值,具体型号和地址映射以你手头工程里的符号表为准。
1. 自动售货机到底要控制什么:需求拆解与方案定型
1.1 售货机的现场动作与控制信号
很多人一听“自动售货机”就觉得很复杂,实际上把它拆开看,就是一串非常固定的动作循环:投币、显示金额、选货、判断够不够钱、执行出货、确认商品掉落、找零、回到待机。
每个动作对应到PLC侧,就是一组输入和一组输出。输入信号大约有这些:
- 投币识别器的合格币脉冲和币值信号
- 货道选择按钮
- 货道出口的商品掉落检测光电信号
- 退币出口的硬币计数脉冲
- 零钱不足检测
- 门开关或防撬开关
输出信号也不复杂:
- 货道电机启动控制
- 找零电机控制
- 状态指示灯
- 蜂鸣器
- 触摸屏或数码管显示
这就是一个典型的数字量控制系统。除了少数高端机型会用到模拟量或通信模块,大部分教学和中小型非标售货机,用一台小型PLC加十几个开关量点就能完整覆盖。明白了这个边界,后面选型和编程就不会发怵。
1.2 为什么这类项目总选PLC而不是单片机
我常跟学生说一句话:商用大批量售货机的主控确实是单片机和专用主板,因为成本是硬道理;但作为教学设计、课程设计以及中小批量非标定制,PLC方案的优势极其明显。
首先是可靠性。售货机部署在走廊、地铁站、便利店门口,现场环境并不好——电机启停频繁,开关门撞击,电源波动,电磁干扰随处可见。PLC的输入滤波、继电器隔离和光电隔离比裸单片机抗造得多,很少出现“程序跑飞”和“I/O读到幽灵信号”的情况。
其次是开发效率。梯形图看得见摸得着,逻辑可以一段一段推敲,改一个输出条件不用重新画PCB、重新烧录固件,直接在编程软件里改几行就完了。对学生而言,这意味着你可以在有限时间内真正把系统调通,而不是把时间耗在硬件焊接和驱动电路调试上。
再就是题目指定。西门子S7-200 SMART在国内工控教学里保有量极大,编程软件Micro/WIN SMART免费且对初学者友好,配套资料到处都是。这也是为什么大量课设毕设题目直接写“基于西门子PLC的自动售货机控制系统设计”——因为平台成熟、容易验收。
1.3 系统整体结构怎么搭
整套系统的电气结构大致分四层:电源、输入采集、PLC核心、输出驱动与人机交互。
电源部分用一只24V开关电源给PLC、传感器、继电器线圈供电,功率选5A左右基本够用。电机不直接挂在24V上还是单独走驱动器或中间继电器回路,别让电机启动瞬间的压降把传感器电源拉垮。
输入采集部分把硬币识别器、光电传感器、按钮的开关量信号接入PLC的数字量输入端子。输出驱动部分通过继电器或接触器控制货道电机、找零电机。人机交互用触摸屏或者传统的数码管加按钮面板,两者选其一就能做出完整系统。
我在给这套资料配说明时,总强调一个原则:先认清售货机只是一个“输入输出很多、逻辑循环很固定”的示范项目。一旦你把它的信号关系梳理清楚,后面做冷库监控、大棚灌溉、交通灯控制,换的只是设备,思维方式一模一样。
2. 西门子PLC选型与电气件匹配:一份可以直接抄的I/O配置表
2.1 CPU型号到底怎么选
西门子小型PLC在这个场景里最常用的两代产品是S7-200 SMART和S7-1200。两者选谁,取决于你手头有没有实物,以及题目要求。
如果你只有S7-200 SMART的源文件,那就按S7-200 SMART来。具体到点型,建议选SR40或ST40。这两个型号都是24点输入、16点继电器输出,点数对一套8货道自动售货机来说非常宽裕,不用加扩展模块。SR40和ST40的区别只在输出类型:SR是继电器输出,ST是晶体管输出。
如果控制对象里有步进电机,或者出货机构要求高频脉冲控制,必须选ST40,因为晶体管输出能发高速脉冲。如果只是驱动普通直流减速电机和电磁铁,选SR40就行,继电器输出带载能力强,接线也直观。
如果拿到的工程是TIA Portal平台的S7-1200,那我建议不要强行改到S7-200 SMART。两个平台的程序结构、数据块、寻址方式都有差异,迁移不是复制粘贴的事。S7-1200的好处是博途自带S7-PLCSIM仿真,没硬件也能把逻辑完整跑一遍,适合在家先写程序后上机。价格比200 SMART贵不少,按手头条件来。
2.2 传感器、执行机构与关键电气件选型
自动售货机的执行机构主要有两种流派:螺旋弹簧式和多层履带式。
螺旋弹簧式是最常见的瓶装饮料机结构,货道电机带动螺旋弹簧转动一圈,把饮料往前推一格然后掉落到取货口。这种结构控制简单,PLC只负责启动电机并等待“商品掉落”的反馈。履带式多用于袋装零食和盒装食品,电机带动履带把商品运送到前端再掉落,控制逻辑和螺旋式几乎一样,只是到位检测的位置有差别。
配套传感器里最重要的有三个:投币识别器、掉落检测光电、退币计数光电。投币识别器负责判断真假币和面额,输出合格脉冲和币值信号;掉落检测光电装在出货口下方,商品掉落瞬间遮挡光路;退币计数光电装在找零硬币出口,每掉出一枚硬币就产生一个脉冲。
电源配置上,控制回路统一用24V直流,PLC和传感器都从这里取电;电机功率稍大或需要正反转的机构,用中间继电器转接,PLC输出只驱动继电器线圈,让电机主回路与PLC完全隔离。这个做法成本增加不多,但能显著延长PLC输出点寿命。
2.3 一套8货道自动售货机的I/O分配参考表
下面是这套系统常用的一份I/O分配表。做真实项目或者交作业时,先用这张表对照源文件里的符号表,确认一致再继续,否则后面改地址会改到怀疑人生。
| PLC地址 | 信号名称 | 信号类型 | 说明 |
|---|---|---|---|
| I0.0 | 投币合格脉冲 | 数字量输入 | 每投一枚合格币产生一个脉冲 |
| I0.1 | 五角币识别 | 数字量输入 | 配合I0.0确认币值 |
| I0.2 | 一元币识别 | 数字量输入 | 配合I0.0确认币值 |
| I0.3 | 货道1选择按钮 | 数字量输入 | 对应1号货道 |
| I0.4 | 货道2选择按钮 | 数字量输入 | 对应2号货道 |
| I0.5 | 货道3选择按钮 | 数字量输入 | 对应3号货道 |
| I0.6 | 货道4选择按钮 | 数字量输入 | 对应4号货道 |
| I0.7 | 货道5选择按钮 | 数字量输入 | 对应5号货道 |
| I1.0 | 货道6选择按钮 | 数字量输入 | 对应6号货道 |
| I1.1 | 货道7选择按钮 | 数字量输入 | 对应7号货道 |
| I1.2 | 货道8选择按钮 | 数字量输入 | 对应8号货道 |
| I1.3 | 掉落检测光电 | 数字量输入 | 商品落入取货口信号 |
| I1.4 | 退币计数光电 | 数字量输入 | 每退出一枚硬币一个脉冲 |
| I1.5 | 零钱不足传感器 | 数字量输入 | 零钱筒低液位报警 |
| I1.6 | 门开关 | 数字量输入 | 维修门/取货门状态 |
| PLC地址 | 信号名称 | 信号类型 | 说明 |
|---|---|---|---|
| Q0.0 | 货道1电机 | 数字量输出 | 控制1号货道出货 |
| Q0.1 | 货道2电机 | 数字量输出 | 控制2号货道出货 |
| Q0.2 | 货道3电机 | 数字量输出 | 控制3号货道出货 |
| Q0.3 | 货道4电机 | 数字量输出 | 控制4号货道出货 |
| Q0.4 | 货道5电机 | 数字量输出 | 控制5号货道出货 |
| Q0.5 | 货道6电机 | 数字量输出 | 控制6号货道出货 |
| Q0.6 | 货道7电机 | 数字量输出 | 控制7号货道出货 |
| Q0.7 | 货道8电机 | 数字量输出 | 控制8号货道出货 |
| Q1.0 | 找零电机 | 数字量输出 | 每次动作退出一枚硬币 |
| Q1.1 | 状态指示灯 | 数字量输出 | 正常/故障指示 |
| Q1.2 | 蜂鸣器 | 数字量输出 | 操作提示与报警 |
| Q1.3 | 售罄指示灯 | 数字量输出 | 对应货道无货提示 |
如果你的项目用触摸屏选货而不是物理按钮,那选货输入就不是走DI点了,而是通过触摸屏向PLC的V区变量写入货道号。这样能省掉8个输入点,但讲解复杂度会高一点,课设阶段我更推荐物理按钮方案,逻辑直观,答辩的时候好讲。
3. 核心控制逻辑拆解:投币、售卖、找零的状态机如何用梯形图实现
3.1 程序整体框架与状态划分
这套程序的本质是一个有限状态机:待机、投币累计、选择校验、执行出货、找零、故障报警。梯形图里没有“state”这种高级变量,习惯做法是用一组M中间继电器做状态标志,再用常开常闭触点互锁,保证同一时刻只有一个状态激活。
我给的框架是五个状态位:M0.0待机,M0.1投币累计,M0.2选货校验,M0.3出货执行,M0.4找零执行。再加一个M0.5故障报警。这套标志位方案在触摸屏上也很方便监控,做模拟量动画或状态显示时直接把M区变量拖上去就行。
上电用SM0.1触发一次初始化子程序,把价格表、库存表、当前金额全部写入V区初值。这一步别省,否则第一次上电运行时变量区全是随机数,售罄判断和价格比较全会乱套。
3.2 投币累加:沿检测与金额存储
投币逻辑是整个系统最容易出错的地方,核心问题是怎么把一个硬币准确计成一次。
硬币识别器输出的是电平信号,投一枚一元币,I0.2会保持几十毫秒到几百毫秒的高电平。如果不加处理直接读,PLC一个扫描周期几毫秒,遇到时间较长的高电平会把金额累加好多次。这就是所谓“投一元显示十元”的经典问题。
正确做法是加起沿检测指令EU,让信号从0变1的瞬间只触发一次。下面这个网络是典型写法之一:
LD I0.2 EU AN M0.3 +I +10, VW10我习惯把金额单位定成“角”,一元币加10,五角币加5,这样找零计算全程是整数运算,不用碰浮点数。VW10就是当前已投入金额,放在断电保持区,防止机器断电后金额丢失。
3.3 货道价格表和库存表设计
价格表我把8个货道做成8个连续的VW地址:VW100到VW114,每个货道占一个字,存放该货道单价。库存表从VW200到VW214,存放每个货道的当前数量。
初始化程序里用MOVW指令把每路的价格和初始库存写进去,比如VW100放250(即2元5角),VW200放20代表1号货道有20瓶。这个表设计对修改非常友好,以后改价格、改库存,只动初始化里的MOVW值,不动梯形图逻辑。
当用户按下货道选择按钮,程序要做两件事:一是比较当前金额VW10是否大于等于对应价格VW100x,二是检查对应库存VW200x是否大于0。两个条件同时满足,才置位出货状态M0.3。如果库存为0,置位售罄指示灯;如果钱不够,不作清零操作,让金额保留,提示用户继续投币。
3.4 出货执行:用闭环掉落检测代替纯定时
很多人写这个逻辑习惯用定时器:按下选货,启动电机,延时两秒,停电机。这种方式在课设里能跑通,但实际机器上问题很大。不同货道的弹簧摩擦阻力不一样,商品重量不一样,固定时间到了可能商品还没落,或者商品早就落下来电机还在转,把下一瓶也带出来。
我推荐的做法是闭环控制:启动电机的同时启动一个2秒定时器作为“等待掉落超时”,然后一直监视掉落检测光电信号I1.3。一旦I1.3从0变1,说明商品已经掉入取货口,立即停止电机,库存减1,然后判断是否需要找零。如果2秒定时到而I1.3始终没有动作,说明卡货或电机异常,停止电机,置位故障报警M0.5。
这个过程看起来复杂,实际梯形图只用两个网络就能写完。关键是理解“启动电机只是发令枪,掉落光电才是终点线”。
3.5 找零执行与超时保护
找零逻辑的算法很直接:找零金额等于当前金额减售价。如果找零金额大于0,开启找零电机Q1.0,每检测到一次退币脉冲I1.4,待退金额就减一次,减到0时关闭电机,把VW10清零,回到待机状态。
这里有两个隐藏问题。第一个是退币脉冲同样要做沿检测,否则一枚硬币落下的时间足够PLC误计多次。第二个是必须加超时保护。找零机构很容易因为硬币卡滞而一直空转,如果程序永远等那个退币脉冲,电机就会一直通电,线圈很快就会发烫烧毁。
我给这套系统的做法是:找零电机启动时同时启动一个5秒定时器,5秒内如果退币脉冲数量没有达到期望值,强制关闭电机并置位故障报警,提示人工检查零钱机构。这套保护在答辩时是加分项,因为它体现的不只是会写梯形图,而是考虑到了现场安全。
4. 实机调试实录:信号抖动、卡币与计数漂移的完整排查链路
这一节写的都是我实际调试过程中踩过的坑,有些问题看起来是程序错误,最后发现根本不在程序里。
4.1 投一枚硬币显示两块钱:边沿与抖动问题
第一次装上实机测试就翻车。投一元硬币,触摸屏上金额直接加了2,有时还加3。
我先怀疑识别器输出问题,用万用表测量,投币一次确实只输出一个高电平。然后打开PLC在线监控表观察I0.2,发现问题出在信号质量上:投币机构机械撞击瞬间,开关电源带载波动,导致输入信号在几百毫秒内反复翻转。识别器本身只输出一次,但PLC的输入端被干扰反复触发。
解决分两步。第一步在程序里给投币信号加延时滤波:让I0.2先经过一个20毫秒的TON定时器,确认信号稳定持续后才进入后续逻辑。第二步是电气整改,把开关电源的0V和传感器回路的0V统一共地,消除参考电位差。改完这两处,投币计数就干净了。
这个案例让我形成一个条件反射:实验室里信号干干净净,一上现场就出问题,十有八九是共地和滤波,别急着怀疑传感器坏。
4.2 电机转到底但商品没出来:掉落检测位置问题
调试货道时遇到过一个很隐蔽的问题:程序显示出货成功,电机也确实转了,但取货口里什么都没有。
在线监控看程序逻辑,电机启动后I1.3闪了一下,程序认为商品掉落,正常完成流程。实际跑到机器后面看,发现商品卡在货道出口边缘,并没有掉下来。
原因在光电传感器的安装位置。我把掉落检测安装在出货口的侧壁,商品下落时只有部分遮挡光路,周边轻微震动就会让信号闪断误报。后来把传感器移到出货口正下方,让商品必须以最大横截面通过光路,误报问题彻底解决。
这里还有第二个坑:电机停止时机。如果商品刚掉落瞬间就停电机,螺旋弹簧可能停在非起始位置,下一轮出货时弹簧阻力变大,容易卡货。我在程序里改成“检测到掉落后延时0.3秒停电机”,让弹簧多转一点回到起始角,后面出货稳定很多。
4.3 找零口退币退不停:机械轨迹和检测缺失
找零调试时出现吓人的一幕:按了找零,电机一直转,硬币哗哗往外掉,地上一堆,程序还停留在找零状态。
排查过程是这样的:先看退币计数光电I1.4有没有脉冲,结果一个都没有。再量光电传感器本身,用手遮挡能正常翻转。最后蹲下来看硬币飞出的轨迹,发现挡板把硬币弹出的方向稍有偏移,硬币从传感器感应区旁边飞过去了,PLC自然永远收不到“退出一枚”的信号。
解决方法是调整导向槽,让硬币必须经过传感器感应区。同时程序里把那条5秒超时保护加上——如果没有这条保护,那天的电机估计已经烧了。
这个案例给我的教训是:机械限位和检测位置的安装精度,比PLC逻辑更值得花时间。程序写得再漂亮,传感器没感应到信号,一切都是白搭。
4.4 断电再上电,库存数全乱了:保持区问题
系统调试稳定后做过一次断电重启测试,结果触摸屏显示所有货道售罄,打开库存表一看全是随机数。
这是典型的保持区设置问题。S7-200 SMART的V存储区需要手动指定掉电保持范围。如果库存和价格表所在地址没有被划进保持区,断电后内容全部丢失,重新上电也不会自动恢复。S7-200 SMART默认只保持部分区域,不一定覆盖你用的VW200。
解决方法是在系统块的“保持范围”配置里,把VW10、VW100到VW214这一整段都设为保持。对于S7-1200用户,对应操作是在全局数据块里把相关变量勾选为“保持性”,原理一样。
4.5 触摸屏和PLC通讯莫名断开:IP与网络问题
用Smart 700 IE触摸屏搭配SMART plc时,遇到过通讯反复中断的怪问题:重新上电恢复,运行几分钟又断开。
查到最后是触摸屏和PLC的IP地址不在同一子网,还有一部分原因是网线接头氧化。交换机测试一切正常,但现场环境震动大、温度高,劣质水晶头接触不良导致时通时断。
处理办法很简单:给触摸屏和PLC各设一个固定的静态IP,保持同一网段,不要依赖自动获取;网线用成品工业级线缆,接头做好防护固定;下载顺序上先断电下载PLC,再下载HMI组态,避免握手冲突。这五条做完再没出过问题。
5. 拿到设计与源文件之后:从课设/毕设要求到可落地项目的适配思路
5.1 先仿真还是先接硬件
拿到一套陌生源文件,别急着买PLC。先判断工程文件的平台:如果是TIA Portal的S7-1200工程,直接用博途里的S7-PLCSIM,把投币累加、出货确认、找零减法这几段关键逻辑跑通,确认没有语法和逻辑错误再考虑硬件。
如果是S7-200 SMART的工程,情况和1200不太一样——S7-200 SMART没有官方独立仿真器,网上流传的仿真插件只能验部分指令,遇到复杂程序容易报错。我的建议是,没有实物时就对着I/O表手工推演关键流程,把每一步的状态位变化、计数变化写在纸上,过程虽然原始但印象极深。
有硬件的就跑一套真实测试流程:投币、选货、出货、找零。跑通以后再做边界测试——钱不够、售罄、卡货,这些边界场景才是答辩老师最爱问的。
5.2 改成自己的题目时到底改哪里
很多学生拿到资料以后,第一件事是给注释改名,这是最危险的。一个货道从8路改4路、改20路,可不是改注释的事。
你想改货道数量,就必须同步改三处:I/O分配表里按钮地址和电机输出地址;价格表、库存表的V区范围和初始化MOVW值;触摸屏或面板上对应的显示对象。只改注释不动地址,现场演示时按下新的按钮,PLC动作的还是旧地址,一下就会穿帮。
想加扫码支付,这是目前最热门的扩展方向。PLC方案通常外接一个支付模块,扫码成功后模块输出一个干接点或串口信号给PLC,PLC收到“支付成功”信号后再开放选货。这里要理解一点:支付验证是在支付模块侧完成的,PLC不做那种联网鉴权工作,只负责接收完成信号并放行。答辩时把这个边界讲清楚,非常加分。
想加远程监控,方向就是通过以太网或4G网关,把PLC里的库存数、销售额、故障代码用Modbus TCP或OPC UA协议上传到上位机。S7-200 SMART支持Modbus RTU,S7-1200配合博途做Modbus TCP更方便。这个方向适合做进阶课题,不建议在课设阶段铺太大。
5.3 答辩和现场演示前重点补什么
带学生做了几轮题目之后,我总结出答辩现场反问概率最高的几个问题:
- 为什么选SR40而不是ST40,反过来也一样
- 投币金额为什么不会重复累加
- 出货电机为什么不直接定时控制
- 库存断电之后会不会丢
- 两个按钮同时按下会出现什么情况
第五个问题很有意思。如果程序里没有互锁,两个按钮同时按下可能导致两个货道电机同时启动,逻辑上虽不致命,但演示时很狼狈。我的程序里选货状态M0.2和出货状态M0.3是互锁的,一旦进入出货流程,选择按钮的全部后续逻辑被切断,这就是为了保证同一时间只能执行一次出货。
建议所有拿到这套资料的人,至少要做到不看源文件能把I/O分配表和状态流程图默写出来,再谈修改和扩展。资料是用来理解系统的,不是用来背的。
最后分享一个我自己的习惯:不论资料多全,拿到第一件事不是打开梯形图,而是把I/O分配表打印出来,拿一张A4纸从左到右过一遍信号构成。PLC系统里绝大部分故障都不是程序写错,是地址对不上、地没共好、传感器位置偏了这老三样。把这套售货机系统跑通之后你会发现,它本质上就是一个输入输出很多、逻辑循环很固定的项目。真正理解了这个心智模型,后面改做冷库监控、大棚灌溉、交通灯控制,你只需要换一套I/O表,思维完全是同一个套路。