S7-200 PLC与MCGS组态实现自动售货机控制系统全解析
做自动售货机控制系统最难受的不是程序写不出来而是现场跑不起来。投币器信号乱跳、触摸屏提示通信故障、电机卡住不反转——这些问题我在调S7-200和MCGS这套组合时几乎全遇过。这篇内容我就围绕基于西门子S7-200 PLC和MCGS组态的自动售货机控制系统把从需求拆解、硬件选型、I/O分配、梯形图设计到组态画面联调的完整过程捋一遍重点说清楚每一步为什么这么做以及哪些地方是常规文档里不会写的坑。不管你是正在做课程设计的学生还是刚接手售货机维护工作的电气工程师照着这套思路走一遍至少能少走半个月弯路。1. 为什么用西门子S7-200 PLC加MCGS组态做售货机控制选这套方案的第一个原因是成本敏感。自动售货机不是大型产线设备单机利润本来就不高控制器的成本占比必须压得住。S7-200虽然官方早已停产但存量设备、二手模块和教学资源都非常多一台CPU226在二手市场几百块就能拿到对原型验证和小批量试产来说性价比极高。MCGS组态软件的正版授权按点收费用在单台售货机上属于小点数应用费用也在可接受范围而且它自带西门子S7-200的PPI驱动不需要额外买通信插件上手门槛比WinCC低不少。第二个原因是维护门槛。很多做售货机运维的现场电工以前接触的是继电器回路和简单单片机控制板你突然让他去改C代码他扛不住。但S7-200用Micro/WIN写梯形图一个投币计数逻辑就是把线路图翻译成梯形图老电工看两眼就能明白。MCGS的画面也是拖拽式的画个售货机外观、放几个按钮和指示灯半天就能搭出一屏。这对后续设备移交和使用方维护非常重要。再说控制能力。自动售货机表面看是投币-选货-出货-找零四个步骤实际上涉及脉冲计数、比较运算、定时保护、掉电记忆、故障自诊断和上位机通信这些用普通继电器逻辑做会非常痛苦用单片机做又得从头搭外围电路。PLC加组态的架构天然适合这种逻辑控制人机交互的场景PLC负责时序、连锁和保护MCGS负责显示、操作和记录两者通过PPI协议各干各的活互不干扰。我也要提前说明一点本文所有程序逻辑和组态步骤都是基于S7-200的典型用法属于通用设计思路你在实际项目里可以根据售货机的货道数量、币种类型和退币机构做增减。下面从需求拆解开始逐步展开。2. 控制需求拆解从投币到出货系统到底要管几件事做任何PLC项目我都不建议一上来就写程序。先把需求表列清楚后面写梯形图只是查表翻译而已。自动售货机的核心流程看起来简单但当你把它落到I/O和内部继电器上的时候会发现需要处理的细节比想象中多得多。2.1 核心流程的五个阶段一套标准的单机自动售货机控制流程可以拆成五个阶段。投币识别阶段。用户投入硬币或纸币投币器/纸币器识别面额后输出脉冲信号。这里的关键是投币器输出的不是投了1元的电平而是一串脉冲常见做法是1元对应1个脉冲、5元对应5个脉冲PLC通过统计脉冲数来累加金额。千万别直接拿投币器的输出信号去加一个固定值除非你用的投币器支持单线协议输出否则会乱套。商品选择阶段。用户按下商品按钮MCGS触摸屏把按钮状态写到PLC的M寄存器PLC内部马上做两个判断第一这个货道是否有货第二当前累计金额是否大于等于商品价格。只有两个条件同时满足才允许进入出货流程。出货执行阶段。PLC置位货道电机输出推货机构动作把商品推出。同时要监视出货光电传感器或者电机的运行时间一旦商品落下的信号到了立即停止电机如果超时还没出就认为是卡货切断输出并报警。找零阶段。出货完成后PLC计算当前余额减去商品价格的差值若大于等于5元就驱动退币机构依次退出5元币和1元币。实际设备上退币机构由投币器自带的退币马达控制PLC给出退币触发信号不需要直接控制每个币的出口机构这个细节很多初学者会搞错。故障处理阶段。包括缺货检测、通信超时、退币卡币、电机过载。缺货和卡货是售货机的常见病所以逻辑上必须以最高优先级处理只要检测到缺货该货道立即被禁止出货MCGS界面上同步显示缺货提示避免用户投币后才发现买不了。2.2 非功能需求同样影响设计除了流程本身还有几个非功能需求直接决定PLC型号和程序结构。第一是掉电保持。售货机在商业场景中不允许断电后金额丢失。用户已经投了10元、还没选商品这时候突然断电来电后必须恢复之前的余额状态。所以累计金额必须存放在V区并在编程时勾选掉电保持属性或者利用S7-200的超级电容在短时间断电时保持数据。这个细节如果漏了售货机就得频繁被人投诉吞币。第二是防抖动。投币器的脉冲宽度和机械抖动都不可控直接在输入点计数会出现金额虚增。我习惯在梯形图里先做一个10ms到20ms的延时确认确认信号稳定后再进行累计。第三是可扩展性。市面上的售货机货道有6路、12路、24路不等货道电机可能是单电机驱动方式也可能是多个电机并联。设计程序时最好把货道选择和电机驱动分开写后面增加货道数量只需要改数据块和输出映射不需要重写主逻辑。把需求表列完之后再回头看S7-200的CPU选择就非常明确普通6路货道加双币识别CPU224足够12路以上建议直接上CPU226输出点多还有两个通信口一个给MCGS触摸屏一个留作程序下载或扩展上位机。我这次讲解以CPU226为基准输出点数也能覆盖更完整的教学场景。3. 硬件选型和I/O分配预算和可靠性之间的取舍硬件选型没有绝对标准但我有个原则传感器和执行器可以选便宜的PLC和通信接口一定要选可靠的因为现场故障的排查成本远高于器件本身的差价。在自动售货机这个场景里我把硬件分成三块来看。3.1 控制器和触摸屏的选型建议S7-200系列里我做项目的首选是CPU226 AC/DC/继电器理由很简单2个通信口、24输入/16继电器输出、自带24V传感器电源几乎不用外接扩展模块就能覆盖一台12路售货机的全部I/O。继电器输出虽然响应速度没有晶体管快但驱动电机、电磁阀之类的负载更耐造也不会烧输出点。如果只做教学演示或小型样机CPU224也够用但注意它只有1个通信口调试的时候接程序线和触摸屏就得来回拔插很麻烦。MCGS触摸屏我常用的型号是TPC7062系列7英寸屏对于售货机这种单手操作、信息量不大的场景刚好。选MCGS的另一个原因是它支持脚本可以在运行策略里写退币闪烁提示、金额越限报警这类逻辑比单纯靠PLC驱动动画更灵活。触摸屏推荐用DC24V供电版本和PLC共用一个开关电源省一路电源模块。3.2 外部元件和I/O映射方案投币器我选具备脉冲输出接口的型号比如常见的宏电或稳诺脉冲型投币器1元输出1个脉冲、5元输出5个脉冲。需要注意投币器和PLC必须共地否则光靠两根信号线容易电平漂移。退币机构一般由投币器自带的退币马达完成PLC只输出一个退币触发指令。出货机构方面主流自动售货机用的是12V或24V直流减速电机带推杆或螺旋弹簧每个货道配一套。货道末端装对射式光电传感器商品落下时遮挡光线产生到位信号。每个货道都装光电传感器成本偏高我见过很多方案是只装电机堵转电流检测成本更低需要改接变频器或电流模块控制逻辑更复杂。这里还是用光电传感器方案讲解直观也稳定。下面是12路售货机的典型I/O分配表这是接线和写程序的依据务必先定清楚再动手。点位地址信号说明类型与含义输入I0.0投币脉冲信号上升沿有效1元1个脉冲5元5个脉冲输入I0.1货道1出货检测光电传感器商品落下为1输入I0.2货道2出货检测同上输入I0.3货道1缺货检测无货时开关断开输入I0.4货道2缺货检测同上输入I0.5退币完成检测投币器反馈退币结束为1输入I0.6门锁状态门打开时切断出货输出安全联锁输出Q0.0货道1电机置位启动检测到出货或超时复位输出Q0.1货道2电机同上输出Q0.2退币触发置位后投币器执行退币动作输出Q0.3报警蜂鸣器卡货、通信异常等故障时鸣响输出Q0.4照明灯用户投币后自动开启延时关闭3.3 接线时容易被忽略的三个细节第一PLC的传感器电源和输出负载电源要分成两路。传感器用PLC自带的24V电源电机和投币器退币马达用外部开关电源单独供电避免大电流负载波动把传感器信号拉垮。我用过一个便宜开关电源给电机和传感器同时供电结果电机启动瞬间电压跌落投币器的脉冲信号直接丢金额就少了后来加了滤波电容才稍微好转最后还是分电源最干净。第二投币器信号线必须用屏蔽双绞线屏蔽层单端接地。售货机旁边经常有变频空调或冷藏柜干扰源不止一个投币脉冲属于低电平短脉冲最容易受干扰误触发。我遇到过夜间无人时金额自己涨查了三天最后发现是投币器信号线太靠近冷藏压缩机电源线移开两厘米就再没出现过。第三PLC的输出公共端要单独计算电流。继电器输出点每路能带2A但COM端总电流不能超过规定值。12路货道电机如果同时动作的只有一台没有压力如果是多电机同时出货的机型要按同时工作的电机台数乘以每台电机电流来校核COM端容量不够就把输出分担到两个COM端组。4. 梯形图程序的分模块设计思路硬件接线完成后程序设计的核心问题是把售货机逻辑拆成可维护的模块。S7-200的Micro/WIN编程软件里程序是按网络Network组织的一个网络相当于梯形图里的一级阶梯。我不建议把一个复杂功能堆在一个网络里宁可网络多一点、功能单一一点后面调试找问题直接在指定网络下断点更轻松。4.1 投币识别与金额累加逻辑投币器的脉冲进来了第一件事是防抖和确认。我在梯形图里是先用一个常开触点接到I0.0串联一个T37定时器TONR保持型定时器设定值10ms用定时器的输出作为投币有效标志。具体逻辑是I0.0闭合后开始计时计时完成后再次检测I0.0仍然为1则认为脉冲稳定触发一次计数。这里不能用普通TON否则脉冲长度不够会漏计。金额累加我采用计数器加比较指令的方式。把C0设为目标值5每来一个有效脉冲C0加1。计数器当前值通过比较指令判断当C0等于1时把VW10加11元当C0等于5时把VW10加55元。执行完比较和加法之后用RST指令把C0清零准备下一次投币计数。这里有个关键点加法指令必须放在计数器记录到对应值之后、计数器清零之前顺序不能颠倒否则这个脉冲就白丢了。VW10就是当前累计金额存掉电保持区。为了让MCGS能显示和修改在编程软件里要把它勾选为V存储区的保持区域。S7-200的V区掉电保持需要组态保持范围默认是VB0到VB119如果你用的是VB100后面的地址也要检查是否在保持范围内不在的话就手动加进去。我还做了一个金额上限保护如果VW10大于50元就禁止继续累计同时触发退币提示。自动售货机的单次投币金额一定要设上限否则有人塞一堆硬币机器找零机构根本处理不过来。4.2 商品选择与余额判断货道选择由MCGS触摸屏上的按钮实现按钮按下后把M0.0货道1选择或M0.1货道2选择置位。PLC里对应的判断逻辑为M0.0为1且货道1无缺货信号I0.3常闭为1且VW10大于等于货道1价格VW20则允许出货。条件满足后置位Q0.0启动货道1电机同时把M0.0复位防止重复启动。这里我特意把商品价格也放在V区VW20、VW22而不是写在程序里。为什么因为售货机调价是市场常态运营商今天觉得1号货道可乐卖3元亏了想改成3.5元如果价格是程序里的常数就得拿电脑改程序放在V区后MCGS画面里加一个价格设定窗口直接在触摸屏上改改完存掉电保持区下次开机还是新价格。这个设计思路适合所有带组态屏的PLC项目凡是需要现场调整的参数一律地址化别写死。4.3 出货执行与找零货道1电机启动后光靠Q0.0置位是不够的。商品从货道上掉下来需要时间电机推杆走完一个行程大概需要2到3秒。所以我在出货网络里并联了两个停止条件第一个是正常停止条件I0.1检测到商品落下光信号变化说明出货成功立刻复位Q0.0。第二个是保护停止条件T38定时器设定时间为8秒电机启动时就计时8秒内没收到光电信号就说明卡货了复位Q0.0置位M1.0卡货报警标志MCGS屏上显示货道1卡货请检查蜂鸣器Q0.3鸣响。这里注意一个问题出货消费判断必须在复位电机之前完成。顺序应该是检测到I0.1信号之后先执行VW10减去VW20的减法指令再复位Q0.0。如果先把电机停了再去做减法万一程序扫描周期卡在某个位置可能出现货出了但钱没扣的情况。我吃过这个亏用户白嫖了好几瓶饮料后来把减法挪到Q0.0置位之后、复位之前才彻底解决。找零逻辑相对简单VW10减去商品价格后的余额就是找零金额。如果余额大于等于5就置位Q0.2退币触发投币器执行退5元操作完成信号I0.5反馈回来后再把余额减5如果余额还有剩余且大于等于1继续退1元退币完成后再把余额清零。退币过程我用了一个M0.2中间继电器作为退币中状态防止出货和找零信号互相干扰。实际设备里退币有一个正在退币中禁止再次操作的连锁条件这个很重要。用户投入10元买一瓶3元的饮料退货时退币机构正在哗啦啦往外吐7元硬币这时候如果用户又按了商品按钮逻辑上必须禁止否则会出现一边退钱一边出货的混乱状态。4.4 报警连锁和掉电保持报警逻辑包括缺货报警、卡货报警、门锁报警和通信报警四类。缺货报警是软性的只在MCGS界面上显示红色缺货标记不启用蜂鸣器因为售货机缺货太常见响了也没人处理卡货报警和门锁报警属于需要人工介入的启用蜂鸣器。门锁报警我用了I0.6常开触点门打开时切断所有货道电机输出这是安全规范防止维护人员把手伸进货道时电机突然转动造成伤害。很多自制的售货机样机省了这个联锁我是强烈不建议省。掉电保持方面除了VW10当前金额之外M0.0、M0.1这些选择标志不需要保持开机复位即可。但累计销售额、总出货次数这类运营数据建议放V区保存方便运营商定期盘点。生产环境的售货机还要把报警历史记录保存下来S7-200的V区不够可以存到MCGS的数据库里组态软件可以设置数据对象存盘每笔交易和报警都记录在触摸屏内部这个后面在MCGS部分会说。5. MCGS组态画面设计从变量连接到动画联调MCGS组态软件的工作方式用一句话概括就是把PLC里的地址映射成画面上的变量再用变量驱动图形动画。很多初学者拿MCGS就当画图工具画完按钮发现按了没反应就是因为变量连接没做好。我按设备窗口、用户窗口、运行策略三步来说明。5.1 设备窗口里的PLC通信配置MCGS和其他组态软件一样所有与PLC的通信都在设备窗口里完成。先添加一个通用串口父设备再在父设备下添加西门子S7-200PPI子设备。这里有一个容易踩的坑必须先有父设备再添加子设备否则通信参数没地方继承。子设备里要设置的关键参数包括串口COM口要选择触摸屏实际接线的串口不是PLC的编程口序号。波特率默认9600校验方式偶校验8数据位1停止位这些必须和PLC通信口参数完全一致。S7-200的默认设置就是这个但如果你之前用Micro/WIN改过PLC端口参数以PLC端为准。PLC站号默认站号2MCGS设备地址里也要填2。如果连接不成功先把站号设置为0或2试一下不同版本的驱动对站号处理有差异。采集周期默认100ms到500ms。自动售货机的金额显示和按钮操作对实时性要求并不高但电机状态和报警信息最好采集周期短一点我设置为100msCPU226处理这个通信负载完全没压力。MCGS里变量的连接方式是设备读写。比如画面上的当前金额显示框数据来源要选择从设备对象里读取VW10按钮按下的动作是向M0.0写入1。这些地址映射全部在设备窗口定义不是直接在画面上填地址。5.2 用户窗口的售货机界面布局MCGS的用户窗口就是给操作者看的主界面。我设计的标准布局包括四个区域最上方是状态栏显示当前金额、投币提示、通信状态、门锁状态、报警信息字要大颜色反差要明显。自动售货机用户距离屏幕通常有半米以上字小了看不见。中间是货道展示区画两个矩形代表两个货道每个货道下面画一个购买按钮。缺货时货道图形变成灰色按钮置灰不可用有货时按钮正常。这样的好处是用户一眼就能看出哪些货能买而不是去试按才知道。置灰功能可以在脚本里写当货道1缺货标志M1.1为1时控制按钮对象使能属性为假。右侧是操作区放退币按钮和取消按钮。退币用于用户投币后不想买了PLC执行全部余额退还。退币按钮要加延时确认防止用户误触。我在脚本里写了按下后弹出确认退还所有金额对话框再确认才置位退币标志M0.3。最下角预留管理员登录入口点击后切换到管理员界面输入密码后可以修改商品价格、累计销售额清零、查看报警记录。这里不需要太高深的权限设计MCGS自带的用户窗口和按钮隐藏就能实现。关键是让运营商能自己调价省得每次都要找程序员。5.3 运行策略的脚本应用MCGS的运行策略相当于PLC之外的第二套软逻辑。它和PLC程序的分工必须明确PLC管安全相关的联锁和保护MCGS只管显示和操作逻辑。千万不要把电机启动这种安全动作放在MCGS脚本里做一旦触摸屏死机或者通信断开设备就会失控。我常用的脚本有这么几个用途第一金额不足闪烁提示。用户选了5元商品但余额只有3元PLC不会启动出货但MCGS的画面要给出反馈。脚本里判断当前金额小于商品价格且购买按钮被按下时让金额显示框的可见属性按0.5秒周期交替变化产生闪烁效果同时弹出一行提示余额不足请继续投币。第二通信超时状态显示。MCGS通过系统变量获取通信状态如果是0表示正常非0表示通信异常。脚本每2秒检查一次通信状态变量异常时把状态栏的文字改成通信异常请联系维护并变红。这个脚本必须在PLC和触摸屏联机测试后最后添加因为一旦通信断了屏幕上就剩这一行字其他画面全部无数据反而容易误导用户。第三交易存盘。在MCGS的数据库和策略里把每次出货事件的商品编号、价格、时间戳存入存盘数据组。MCGS自带配方和存盘功能不需要额外写数据库脚本。存盘数据可以导出EXCEL运营商定期拉出来对账。这个功能很加分有时候甲方就靠这个来决定是否验收。6. 通信连接与运行时调试PLC和触摸屏怎么联起来程序写完了画面也画完了接下来就是最有意思也最折磨人的联机调试阶段。S7-200和MCGS之间的通信走的是PPI协议物理层是RS485。很多人在这一步卡住问题往往就出在最基础的几个点上。6.1 接线和参数核对先用西门子编程电缆把程序下载进PLC单独给PLC上电确认程序在Micro/WIN里监控正常。这时候再关闭编程软件的通信连接把编程电缆从PORT0口拔掉换上触摸屏的COM口RS485线接到PLC的PORT0。注意编程电缆和触摸屏不能同时占用同一个通信口S7-200的PPI协议是主从式同一时间只能有一个主站去轮询你用Micro/WIN在线监控时占用了主站MCGS当然抢不到通信权现象就是触摸屏提示通信失败。很多人在试机时觉得纳闷明明单独连触摸屏通信也是时好时坏检查半天发现是Micro/WIN软件还开着在线监控后台一直在发包。我的习惯是下载完程序Micro/WIN务必完全退出再给触摸屏上电。这一步看起来简单实际上80%的通信故障都出在这个两个主站抢总线的问题上。RS485接线方面触摸屏COM口的A/B端子要与PLC的PORT0的3号B和8号A对应连接。不同品牌的触摸屏定义可能不一样MCGS的TPC7062上通常标为485A、485B或者DATA、DATA-我个人经验是两种接反的概率很高。如果通信完全不通把两根信号线对调一下再试属于成本最低的排查手段。6.2 常见通信故障的排查顺序我调试S7-200和MCGS时基本按这个顺序排查先看触摸屏的设备调试面板。MCGS组态软件在运行环境下可以打开调试窗口查看驱动读取PLC寄存器的原始数据。如果这里读不到数据就说明链路层根本没通不用浪费时间看画面逻辑。再看PLC侧的状态指示灯。S7-200的通信口在通信活动时对应指示灯会快速闪烁。如果MCGS一直在轮询但PLC的通信灯完全不闪说明信号压根没到PLC。这时候检查RS485线、COM口配置和PLC端口是否被占用。如果PLC通信灯闪烁但MCGS提示错误那大概率是站号或数据长度设置不对。S7-200的PPI默认站号是2有一些版本的MCGS驱动里PLC站号要填2本机站号反而要填0不同版本不一样多切换试一下。如果通信正常但画面数据不刷新比如金额一直显示0优先检查变量连接MCGS里定义的是VW10PLC里用的是VW10吗确认地址类型一致S7-200的V区在MCGS里访问时要区分字VW和字节VB别把字地址当字节地址用。6.3 硬件PLC与仿真软件的差异提醒如果你的S7-200程序是先在Micro/WIN自带的仿真器里调通的再拿到硬件PLC上运行有几处差异必须注意。仿真器不会反映真实的输入抖动和脉冲毛刺我在仿真里投币计数完美一接实际投币器就金额乱跳就是因为没有做防抖处理。另外仿真器不模拟高速计数器的硬件行为如果用到了HSC高速计数器必须在实物PLC上验证否则频率上不去。联想到很多人在其他系列PLC的仿真软件比如S7-PLCSIM Advanced里遇到实例启动不了、又没有报错的情况多半是版本不匹配或者仿真实例与真实设备通信端口冲突。解决思路和硬件调试一致先确认仿真器的通信接口是不是被占用再核对仿真PLC的IP或站号与客户端是否在同一网段/总线。S7-200这一代用Micro/WIN自带的SIM就行不需要也不支持PLCSIM Advanced不要混着用。6.4 联调时的分步验证法联机调试我坚持一个原则一次只验证一个功能。第一次联机只调通信把PLC里一个固定值比如VW100123映射到MCGS画面上能显示出来通信就算通过。第二步再调写操作画面按钮置位M0.1PLC里监控到M0.1变为1双向通信都通。第三步才把所有给用户看的全用光了: 商品选择、出货电机、找零、报警这些功能逐个触发。不要一上来就完整跑一遍流程因为一旦出问题你根本不知道是通信问题还是程序问题还是接线问题。我见过同事把三个问题叠一起排查最后发现其实每个问题单独出现都不难解叠在一起差点把触摸屏砸了。7. 调试踩坑与常见问题排查记录这一章把我在自动售货机项目里实际遇到的高频问题整理成清单每个问题都附排查思路按经验价值从高到低排列。7.1 投币金额自己涨的干扰问题现象没有人投币MCGS画面上的金额从0慢慢跳到几元甚至夜里凑够钱还能出货。这个问题我第一次遇到时非常崩溃因为涉及金融安全乙方和甲方都很紧张。排查过程我先怀疑PLC程序逻辑有误在Micro/WIN状态下监控C0和VW10发现VW10确实在涨C0也确实在计数排除程序BUG。然后用万用表量投币器信号线对PLC输入端的电压发现静止状态下有大约0.3V到0.5V的波动虽然没达到高电平阈值但投币器脉冲信号线附近有一根AC220V的照明线压缩机启动瞬间感应出毛刺把T37防抖定时器短暂触发后又消失了造成计数。把信号线换成屏蔽双绞线并做好接地点、远离动力线后问题彻底消失。经验PLC输入滤波参数S7-200的数字量输入默认滤波时间约6.4ms只能滤掉一部分毛刺外部信号线的物理屏蔽才是根本。投币器信号属于低频脉冲但现场动力线产生的共模干扰不分高频低频屏蔽层接地永远比加滤波电容更管用。7.2 出货了但钱没扣的时序问题现象货道电机转商品出去了用户看到掉了货但MCGS上余额还是原数等于白拿一瓶。我在4.3小节提过这个问题根因是程序里减法指令的执行位置不对。排查过程打开梯形图看到I0.1光电信号触发后直接复位了Q0.0减法指令放在复位之后的下一个网络。S7-200的程序扫描顺序是从上到下、从左到右当前网络执行完I0.1复位Q0.0后下一个扫描周期才执行减法。如果电机停止瞬间I0.1信号消失减法的执行条件就不再成立所以永远扣不了款。把减法写在电机启动成功且光电信号有效这个网络里并加入保持中间继电器保证扣款动作在信号变化前完成问题解决。经验凡是先动作后计算的逻辑都要考虑扫描周期内信号状态变化的影响。条件一旦满足先用中间继电器或置位指令把状态锁存再执行计算。7.3 触摸屏按钮按了没反应现象画面上的购买按钮点击时有声音反馈但PLC看不到M0.0置位。通信又是正常的因为金额显示正常。排查过程金额显示正常说明MCGS读PLC数据没问题按钮没反应属于写操作故障。打开设备调试窗口手动向M0.0写入1发现PLC没变化。检查变量连接时才发现我在MCGS里把按钮的动作定义为置位M0.0但S7-200中M区是位地址MCGS驱动要求写入是按字还是按位要看驱动说明。S7-200PPI驱动里对M区的位操作变量类型要选位而我定义成了开关型实际上是字导致写入的是M0.0所在的字节整字节写入了1。改成位变量后正常。经验MCGS里变量类型的选择直接对应PLC驱动的读写方式。开关型变量适合VW、MW等字地址位变量适合I、Q、M等位地址。用错了不影响通信建立但数据不会写到目标位这种故障比较隐蔽。7.4 卡货误报警和光电传感器灵敏度现象货道出货后正常状态没有卡货但偶尔会误报卡货报警而且多发生在天气干燥的时候。排查过程T38定时器时间设定为8秒理论上足够了。后来发现是光电传感器被商品掉落的震动影响输出瞬间抖动I0.1信号消失然后T38保护和正常停止条件都没法满足正常复位。把光电传感器的常开信号并联一个中间继电器继电器线圈得电后保持避免震动造成的瞬间断信号同时把传感器支架加了一个橡胶减震垫问题消失。经验光电传感器在机械震动环境下不能只依赖信号本身的稳定性中间继电器保持是最便宜可靠的去抖方式。工业现场的信号抖动无处不在不要以为传感器有继电器输出就万事大吉。7.5 触摸屏通信时断时续现象运行几个小时后MCGS偶尔弹出通信超时几秒后自己恢复。排查通信参数都没问题最后发现触摸屏的RS485线过长走线从售货机内部穿过时和电机电源线绑在同一个线槽里。经验RS485通信要求A/B线必须双绞且和动力线分离。售货机内部空间小很多人贪方便把通信线和24V电机线一起走扎带这是通信不稳定的头号原因。我后来所有售货机项目都要求通信线单独穿管哪怕长度只有两米也必须执行。故障排查清单汇总如下现场现象排查方向处理经验画面无数据通信参数、接线先看设备调试窗口再看PLC通信灯金额乱涨投币器信号干扰屏蔽双绞线远离动力线出货不扣款程序执行顺序减法放在保持信号状态下执行按钮无反应变量类型设置位地址选位类型不要选开关型误报卡货传感器震动加中间继电器保持信号通信时断时续RS485布线通信线与动力线分离双绞线8. 这套系统还能往哪个方向扩展S7-200加MCGS这种组合做到自动售货机控制只是一个起点。在实际项目里这套架构还有几个很自然的扩展方向如果你正在做类似产品规划可以提前把接口预留出来。8.1 多货道扩展与模块化设计我现在讲的是2个货道、12路I/O的规模但商业售货机一般都在12到24路货道。S7-200通过扩展模块EM223可以增加数字量I/O程序里只需要把货道选择、电机输出、到位检测做成数组式的数据块每增加一个货道就增加一条货道配置记录。梯形图不适合写数组我习惯用S7-200的V区做一张配置表每条记录包含货道价格、电机输出地址、到位检测输入地址程序通过指针间接寻址访问这张表加货道就是加一条记录主逻辑不用改。8.2 移动支付与扫码模块的接入现在市面上的售货机几乎都支持扫码支付纯投币机型已经很少见。MCGS触摸屏本身是Android或WinCE系统通过串口向PLC发出出货指令。Android端的支付SDK和组态屏对接通常的做法是支付成功后触摸屏脚本把对应货道的M位置位PLC按照正常流程出货。这里的关键是支付成功标志必须具有一次性有效性PLC置位电机后立刻复位该标志否则一次支付可能出两次货。8.3 远程运维与数据上报MCGS的以太网版本可以通过Wi-Fi或4G模块把售货机的运行数据上传到云平台方便运维人员远程查看缺货、故障和销售数据。PLC端只需要通过PPI协议把V区的运营数据销售额、出货次数、报警次数、当前金额发给MCGS再由MCGS的4G模块上报。这套方案比起直接给PLC加以太网模块成本要低很多而且报表逻辑放在MCGS里开发也快。我在实际运行这套系统时最深的体会是自动售货机控制系统的难点从来不在某一个单独环节而在于所有环节咬合在一起时的稳定性和可维护性。PLC程序写得再漂亮投币器信号一干扰就前功尽弃MCGS画面做得再炫通信参数不匹配就成了摆设。调试时遇到任何怪现象先别再改程序按信号源-链路-逻辑处理-输出执行-人机交互这个顺序一块一块拆开查反而最快找到问题。希望这篇围绕西门子S7-200 PLC和MCGS组态的自动售货机控制系统拆解能给你省下几个通宵调试的时间。