news 2026/10/5 11:26:02

基于西门子PLC的自动售货机控制系统设计与调试实战

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
基于西门子PLC的自动售货机控制系统设计与调试实战

上个学期连着有几位学生来找我,题目都一样:基于西门子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表,思维完全是同一个套路。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/5 11:26:02

基于STM32的电子琴音乐播放器:矩阵键盘与PWM发声实战

做这个项目算是缘分。我原本在做一个用STM32控制小玩意的练手项目,结果在查资料时看到一堆"51单片机简易电子琴 矩阵键盘8音符 按键长按发声"的提问,突然意识到很多刚入门的朋友都在卡在同一个点上:怎么把按键、声音、定时器这些零…

作者头像 李华
网站建设 2026/10/5 11:25:24

交通标志识别实战:从零实现AlexNet/ResNet18/VGG并部署到Jetson

简介:本资源是一个面向人工智能初学者与计算机视觉实践者的Python交通标志识别系统源码包,聚焦深度学习在智能交通场景中的落地应用,适用于课程设计、毕业设计及辅助驾驶算法入门学习。压缩包共28个文件,总计234KB,包含…

作者头像 李华
网站建设 2026/10/5 11:24:53

OpenShell实战:打造高效舒适的Windows终端环境

1. 用过Windows自带终端的人,迟早会走到这一步如果你经常在Windows上敲命令,估计早就受够了cmd那套老掉牙的交互:字体发虚、复制粘贴全靠右键菜单、开个新窗口还得先点两下鼠标、想在同一屏开两个终端简直像在挤公交。PowerShell虽然功能强&a…

作者头像 李华
网站建设 2026/10/5 11:23:40

RISC-V虚拟化实战:QEMU上同时跑通Zephyr与Linux

先聊个实际的。RISC-V这两年在嵌入式圈子的热度,已经不需要我再画什么曲线图了,但真正动手跑过系统的人,比围观的人少得多。原因很简单,资料大多数停留在“介绍架构特性”和“跑个hello world”的阶段,一旦想同时接触R…

作者头像 李华
网站建设 2026/10/5 11:23:32

Python实现邮件与短信通知:SMTP协议与HTTP API全解析

1. 先看本质:发送邮件和发短信,其实是两类完全不同的代码 1.1 业务场景:谁的代码里需要“发邮件”和“发短信” 说句实在话,你系统里其他功能做得再花哨,用户可能都感知不到;但一封验证码邮件没到、一条告…

作者头像 李华
网站建设 2026/10/5 11:23:31

C# OPC通讯实例:从OPC DA到上位机PLC数据采集的完整实现

简介:面向C#与工控开发者的OPC通讯实例源码包,由工控老马整理并亲测可用,核心解决通过OPC服务器连接PLC进行数据读写的问题。压缩包采用Visual Studio解决方案组织,包含完整可编译的C#工程、可执行程序、界面图片及Word使用说明&a…

作者头像 李华