ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

基于S7-200 PLC与MCGS触摸屏的自动售票机模拟控制

基于S7-200 PLC与MCGS触摸屏的自动售票机模拟控制 搞PLC项目这么多年我越来越觉得“模拟环境”是这个行业里最值钱的东西之一。尤其像城轨自动售票机这种系统直接上手现场设备不现实成本高、风险大但用S7-200 PLC配合MCGS触摸屏做一套按比例缩放的模拟控制模型不光能完整走通自动售检票的核心流程还能把梯形图程序、接线、IO分配这些基本功练扎实。这个项目我前前后后完整做过一遍从硬件选型到梯形图逻辑再到MCGS组态画面联动调试踩了不少坑也沉淀了一套可以直接复用的思路。这篇就把整个项目的关键环节拆开讲透涉及IO分配表、接线图设计、梯形图状态机、组态变量映射以及联调时的典型问题。想搞懂自动售票机控制逻辑的或者正在做PLC相关课设、毕设的朋友这篇应该能帮你少走不少弯路。1. 需求拆解自动售票机的核心控制流程1.1 从真实AFC系统里提取的控制边界城轨自动售检票系统AFC在真实场景下是一个非常庞大的机电一体化系统包含票务管理、现金处理、车票发售、进出站闸机、清分结算等多个子系统。咱们做PLC模拟项目不需要也不可能复刻整个AFC关键是提取出“售票机”这个核心终端设备的控制逻辑再用PLC的思维方式重新建模。我从真实设备中拆分出的核心控制功能包括这几块票种选择、票价计算、投币检测、余额累计、出票执行、找零执行、紧急停止。这七个功能足以构成一个完整的控制闭环而且每一个在PLC里都有非常典型的实现方式。票种选择对应按钮输入和状态切换票价计算对应整数运算指令投币检测对应传感器脉冲计数余额累计对应累加寄存器出票和找零分别对应电机控制和电磁阀脉冲控制紧急停止对应全局复位逻辑。可以说这个模拟项目麻雀虽小五脏俱全PLC的核心编程手段基本都能覆盖。1.2 控制状态机的定义在设计梯形图之前我习惯先把整个控制过程用状态机的方式描述出来。这样后面写程序的时候脑子里始终有一张清晰的流程图不会写着写着逻辑就乱了。自动售票机的控制状态可以划分为五个基本状态待机状态、选票状态、投币状态、出票找零状态、完成状态。每个状态的进入条件和退出条件必须明确否则梯形图里很容易出现“多个条件同时满足、输出互相打架”的情况。状态进入条件执行动作退出条件待机上电初始化/完成状态结束显示欢迎界面等待操作检测到票种选择按钮按下选票票种按钮按下锁定票种计算并显示票价投币传感器首次触发投币投币口检测到硬币余额累加实时刷新显示余额大于等于票价并确认出票出票找零余额满足票价出票电机运转找零电磁阀动作出票检测到位、找零完成完成出票找零结束清零本次交易数据回到待机状态这个状态机看起来简单但真正映射到PLC梯形图里时是需要用中间继电器或内部辅助继电器来“锁存”当前状态的。比如选票状态我用一个M0.1表示当票种按钮I0.1触发且当前处于待机状态M0.0时M0.1置位而投币状态M0.2的置位条件必须是M0.1已经置位且投币传感器I0.2产生脉冲。这样每个状态都有明确的“前一状态触发条件”双重约束梯形图的逻辑才会严谨。1.3 输入输出信号的总线规划状态机定下来之后紧接着就是IO信号的总线规划。这一步很多人会忽略直接凭感觉分配地址结果画接线图的时候发现地址和端子对不上或者程序里用到的地址和实际硬接线完全不一致调试时非常痛苦。我这个项目的IO分配思路是输入信号按照“操作类→检测类→安全类”的顺序排列输出信号按照“执行机构→指示类→声音类”的顺序排列。这样做的好处是现场接线和程序维护时一眼就能看出某个地址大致是什么用途。输入信号包括启动按钮常开、停止按钮常闭、单程票选择按钮、普通票选择按钮、优惠票选择按钮、投币检测传感器、出票检测传感器、紧急停止按钮。输出信号包括出票电机正转继电器、找零电磁阀继电器、运行指示灯、报警指示灯、蜂鸣器。每个信号我都预留了备用点方便后续扩展功能或者处理突发情况。2. 硬件规划IO分配、接线与通讯配置2.1 S7-200 IO分配表与地址规划我用的是S7-200 CPU226自带40个数字量IO做这个模拟项目绰绰有余而且留出了大量扩展空间。具体的IO分配表如下地址信号名称类型说明I0.0启动按钮数字量输入系统上电启动I0.1停止按钮数字量输入系统停止常闭I0.2单程票选择数字量输入按下选择单程票I0.3普通票选择数字量输入按下选择普通票I0.4优惠票选择数字量输入按下选择优惠票I0.5投币检测数字量输入光电传感器检测投币动作I0.6出票检测数字量输入光电传感器检测票卡是否到达出票口I0.7紧急停止数字量输入紧急情况下切断输出Q0.0出票电机继电器数字量输出驱动出票电机运转Q0.1找零电磁阀继电器数字量输出驱动找零机构动作Q0.2运行指示灯数字量输出绿色指示灯Q0.3报警指示灯数字量输出红色指示灯/蜂鸣器这里有一个需要特别强调的细节停止按钮和紧急停止按钮我建议接常闭触点而不是常开触点。原因很简单如果接常开一旦按钮接线脱落或者断线系统是察觉不到“停止”信号的而接常闭的话断线会被PLC识别为停止信号属于“失效安全”设计思路。这一点在工业现场是默认的常识但很多新手恰恰栽在这里。2.2 接线图设计的关键细节接线图是整个项目里最容易被“草草了事”的部分但恰恰是出问题最多的环节。我按照传感器、输出驱动、供电三个部分分别说。传感器接线方面投币检测和出票检测我选的都是NPN常开型光电传感器24V直流供电。NPN传感器的输出端在检测到物体时输出低电平所以PLC的公共端1M必须接24V正极这样才能在传感器导通时形成一个从正极经过内部到输入的电流回路。如果你用了PNP传感器却不改公共端接法输入信号永远等于0项目压根跑不起来。输出驱动方面PLC的输出继电器触点容量一般只有2A直接驱动电机和电磁阀风险很大所以我在中间加了一层继电器隔离。每个输出对应的中间继电器线圈电压24V触点容量5A这样即使执行机构发生短路损坏的也只是中间继电器不会烧掉PLC的输出模块。另外电磁阀这类感性负载在断电瞬间会产生很高的反向电动势必须在继电器线圈两端反向并联一个续流二极管否则很容易干扰PLC的电源甚至导致程序跑飞。这个二极管极性不能接反接反了等于短路。电源配置方面我用了两个独立的24V开关电源一个给PLC和传感器供电一个给中间继电器和执行机构供电。这么做不是为了显得专业而是非常实际的考虑电机启动瞬间的电流冲击和电磁阀开关时的干扰如果和PLC共用电源会让PLC的24V电压出现剧烈波动严重的会导致PLC死机或者通讯中断。分开供电后这类问题基本消失。2.3 MCGS触摸屏与S7-200的通讯配置MCGS触摸屏和S7-200之间的通讯走的是PPI协议。这个协议是西门子专门为S7-200系列设计的点对点通讯协议在MCGS的设备组态里有现成的驱动不需要自己写通讯程序但有几个参数必须对齐否则通讯就是建立不起来。第一是通讯端口参数。我用的MCGS触摸屏是COM口连接COM口参数必须设置为波特率9600、数据位8位、无校验、停止位1位。这个参数必须和S7-200里的PPI通讯参数完全一致。S7-200的通讯端口参数是在系统块里设置的默认波特率往往不是9600一定要通过Micro/WIN软件先确认并修改。第二是PLC站号。S7-200的PPI站号默认是2而MCGS设备组态里也要把这个站号设置为2两者必须对应。如果PLC站号被改过而触摸屏不知道通讯就会一直处于超时状态。第三是数据映射关系。MCGS里建立变量时要勾选“通道处理”和“读写类型”。从PLC读取的数据比如余额、票价需要把数据类型和PLC里的寄存器匹配上。S7-200的V区寄存器是字节寻址的但MCGS里可以直接按字16位读取VW地址M区寄存器按位读取M地址时要明确是M0.0到M0.7这样一位一位映射还是直接按字节读取MB0。这里我建议用VW字变量存储数值用M位变量存储开关状态两类变量分开建逻辑上会清晰很多。3. 梯形图程序实现状态机与核心逻辑3.1 程序整体架构与模块划分梯形图程序最忌讳的是把所有逻辑都堆在OB1主程序里写到后面自己都找不到某个网络在哪里。我习惯把程序按功能划分成四个子程序初始化子程序、投币计数子程序、出票找零子程序、报警处理子程序主程序只负责调用和状态切换。用西门子S7-200的编程软件Micro/WIN每个子程序是一页独立的程序段用SBR指令调用。主程序的逻辑就简洁很多上电调用初始化子程序根据当前状态决定是调用投币计数子程序还是出票找零子程序紧急停止条件满足时无条件跳转到报警处理。这种模块化划分带来的好处是非常直接的调试时如果出票逻辑有问题我只需要打开出票找零子程序而不是在几百行的梯形图里翻来翻去。而且每一个子程序都可以单独强制输入、观察输出排查效率高很多。3.2 核心逻辑一投币累计与票价比较投币累计是售票机的核心数据逻辑。使用S7-200的整数运算指令ADD_I整数加法和比较指令。投币检测传感器每检测到一个高频信号代表投入一枚硬币PLC就把VW100里的余额寄存器累加一次。为了提高仿真演示效果我设定每次投币金额为1元对应的传感器就位信号用I0.5的上升沿来触发累加。用上升沿而不是电平是为了防止传感器在硬币通过期间持续输出高电平导致重复计数。实际项目中硬币识别可能有不同面额需要多个传感器对应不同的累加值。在模拟项目中一台传感器定值累加就足够了。票价信息存储为VW102。选票时根据按下按钮的数据从3元、4元、2元里选择一个写入VW102。然后执行比较指令VW100余额是否大于等于VW102票价。如果条件满足就把当前状态从投币状态切换到出票找零状态同时锁定当前票价防止客户在出票过程中再次选票导致数据错乱。3.3 核心逻辑二找零计算与执行找零计算是自动售票机从“自动售货”变成“自动售票”的关键差异点。计算公式是找零金额 余额 - 票价。用整数减法指令SUB_I把结果存入VW104。如果找零金额为0则直接跳过找零执行。找零执行我用的是定时器脉冲控制。一个TON定时器产生一个2秒宽度的脉冲控制Q0.1找零电磁阀动作。这里有一个很重要的经验电磁阀动作时间不能太短否则机械机构还没完全动作完就复位了硬币会被卡在半路也不能太长否则影响下一位乘客使用。需要根据实际机的动作反应时间确定2秒是我在模拟装置上测试下来比较稳妥的值。出票执行则是控制Q0.0出票电机继电器吸合带动一个直流电机运转3秒模拟票卡从票箱被推送到出票口的过程。同时I0.6出票检测传感器实时监视票卡是否已经到达出票口一旦检测到票卡到位可以提前结束电机运转如果设定的3秒内始终检测不到票卡信号系统应该判断为卡票故障转入报警处理。3.4 状态流转用中间继电器做状态锁存梯形图里实现状态机最常用的手段就是“置位/复位”指令。S7-200的置位指令S和复位指令R配合内部辅助继电器M可以很方便地实现状态锁存。待机状态M0.0上电初始化后置位此时允许票种按钮输入。选票状态M0.1当M0.0为ON且任一票种按钮按下置位M0.1同时复位M0.0。投币状态M0.2当M0.1为ON且投币传感器上升沿信号到来置位M0.2同时复位M0.1。出票找零状态M0.3当M0.2为ON且余额大于等于票价置位M0.3同时复位M0.2。完成状态M0.4当出票检测到位且找零时长已到置位M0.4执行清零随后复位M0.4并置位M0.0。这套逻辑写起来不复杂但每个状态切换时必须保证“前一状态”的条件还在否则会出现状态跳变。比如出票找零状态M0.3它的前置条件是M0.2已经置位且余额满足两个条件同时为ON才允许置位。我调试时就看到过一次状态跳变的现象余额已经满足了但M0.2还没置位结果票种按钮的一个新脉冲直接把系统带飞了。解决方案就是在置位条件里加上M0.2的状态位相当于给状态机加了一把锁。4. MCGS组态画面设计与联动调试4.1 组态画面的功能分区与变量映射MCGS组态软件里一个完整的监控画面至少要包含状态显示区、操作按钮区、参数显示区、报警提示区四个部分。我设计的售票机画面把整个自动售票机的正面面板搬到了触摸屏上模拟售货机的用户交互体验。状态显示区放两个大型指示灯绿色代表系统运行红色代表紧急停止或故障。这个指示灯和PLC的Q0.2、Q0.3直接对应。操作按钮区放三个票种选择按钮和一个紧急停止按钮每个按钮都用一个“位开关”元件对应PLC的输入点I0.2到I0.7的某个位。参数显示区放两个数值显示框一个显示当前余额VW100一个显示票价VW102。这个数值显示必须设定数据转换方式因为PLC里存的是二进制整数MCGS默认按16位无符号数处理但在组态时你要明确告诉它VW100的数值范围是0到9999并且在显示时保留整数格式否则可能会出现负数或者乱码。报警提示区放一个信息显示窗口当PLC的M10.0报警继电器置位时MCGS自动弹出“找零机构故障”或“卡票故障”的提示文字。这个功能需要在MCGS的报警配置里设置“表达式报警”表达式写M10.0 1即可。4.2 动画组态让画面“活”起来MCGS强大之处在于它支持多种动画效果可以让画面中的元件与PLC变量联动。做自动售票机模拟项目不把动画做好就失去了“模拟”的意义。我在出票口位置放了一个小方块的图形元件代表票卡它的水平移动距离与Q0.0出票电机状态关联。当Q0.0为ON时票卡从票箱位置向右移动到出票口位置速度可以设置成匀速持续3秒。这一步看起来简单但实际组态时要注意MCGS的动画组态需要在“动画连接”对话框里关联“水平移动”属性起点和终点值要对应PLC变量Q0.0的0和1两个状态否则画面上的元件根本不会动。投币动画类似用一个硬币形状的元件在投币口有一个垂直下落的效果触发条件是I0.5的上升沿。由于PLC里的输入点信号是瞬时的动画可能太快看不清所以我在硬币下落前加了一个延时显示变量用PLC内部定时器做一个持续0.5秒的脉冲映射到MCGS里的“可见度”属性这样每次投币硬币都会在画面上清晰闪现一次。4.3 联调顺序与数据一致性核对MCGS和PLC都调好之后就是联调阶段。联调我建议遵循“先PLC后触摸屏先单点后联动”的原则不要一上来就直接跑完整流程。第一步单独给PLC运行程序用Micro/WIN软件的监控表观察每个输入输出点的变化。按下票种按钮对应的I0.2到I0.4应该能正常翻转用手动挡片触发投币传感器I0.5VW100的余额应该增加。这个过程没有触摸屏参与可以快速定位PLC程序本身的问题。第二步PLC程序确认无误后启动MCGS通讯先不看画面动画直接看MCGS的“设备调试”窗口确认COM口通讯状态是“正常”然后看读取到的VW100、VW102数值是否与PLC监控表里的一致。如果数据不一致优先检查寄存器地址是否映射错位比如VW100和VW102之间的偏移量是否搞反了。第三步数据一致后再启用画面动画用触摸屏上的按钮配合实物传感器完整走一遍流程选票、投币、出票、找零。走到这里如果还出问题基本都是动画关联或者参数显示格式的问题回组态里仔细检查每一项设置即可。4.4 设计画面布局时需要考虑的触摸屏响应问题MCGS触摸屏本质上是嵌入式系统和组态软件的配合画面元素过多、动画刷新频率过高时处理速度会明显下降。我在设计画面时所有动画元件都严格控制了数量总共不超过八个动画关联。数据刷新方面PLC寄存器数据要传递给MCGS时在设备组态里设置了采集周期为200毫秒。如果采集周期设得太短触摸屏会频繁向PLC发起通讯请求反而挤占PPI总线的带宽导致通讯拥堵。这个200毫秒是我在项目中反复实验出来的平衡点——对于出票、找零这些动作来说响应速度完全够用而且通讯一直很稳定。5. 调试中的典型问题与解决经验5.1 传感器抖动导致的票数重复计数第一次联调时我发现一个很刁钻的问题投一枚硬币MCGS画面上余额增加了3到4次甚至有时候会误触发票种选择。排查过程是这样的先在PLC监控表里观察I0.5的状态发现传感器的信号在硬币通过的瞬间并不是一个理想的单一脉冲而是伴随着多次高频抖动的连续信号。这是因为硬币在投币轨道里下落时会因为重力加速度弹跳同一个硬币会在光电传感器前面来回切割光线好几次。在真实AFC设备里投币检测用的是具有防抖功能的专用传感器或者通过软件滤波来解决。我在梯形图里用了一个简单的防抖处理当I0.5检测到上升沿时先启动一个0.2秒的定时器在这个定时器计时未完成期间后续的I0.5信号全部忽略。这样就保证了一次物理投币动作只产生一次有效的计数脉冲。这个问题的根因在传感器而不在程序但作为调试者你不能一味要求硬件零缺陷更多时候是通过程序逻辑去弥补机械层面的不足这才是工程思维。5.2 找零动作与出票动作时序冲突第二次调试时又遇到一个时序问题出票电机还在运转的时候找零电磁阀提前动作了导致机械结构上卡住了。原因在于我的梯形图里出票找零状态M0.3置位后Q0.0和Q0.1几乎是同时被驱动的。实际上票卡推送到位和找零机构动作需要有一个先后顺序先出票、后找零这样两者的机械动作才不会互相干涉。解决方案是引入一个顺序控制链M0.3置位后先启动出票电机Q0.0等出票检测传感器I0.6反馈票卡到位信号并延时0.5秒后才允许Q0.1找零电磁阀动作。这样相当于在出票和找零之间加了一个“握手确认”的环节时序冲突彻底解决。5.3 PPI通讯偶发性中断联调过程中MCGS偶尔会出现通讯超时的报警不是一直断而是间发性丢包。排查通讯问题我是从这几个方面入手的。检查了通讯线确认屏蔽层在触摸屏端单端接地而不是两端都接地避免地环路对通讯信号的干扰。把PLC的通讯波特率重新确认了一遍确保和MCGS一致。还有很关键的一点PLC的通讯端口和编程口是同一个调试时Micro/WIN软件在线监控和触摸屏通讯争抢同一个端口引起了冲突。拔掉编程线或者停止在线监控后通讯就恢复了。这个问题提示我们在做联调时一定要避免编程器在线监控和触摸屏通讯同时长时间占用同一个PPI端口否则会丢包。调试完PLC程序后最好把编程线断开只保留触摸屏和PLC的通讯线让触摸屏独占通讯资源。5.4 急停后恢复的初始化处理按照安全规范自动售票机按下紧急停止按钮后应该立即切断所有输出。但急停解除后系统如果直接从上一次断点继续运行往往会出现票卡半卡、找零未完成等中间状态很不安全。我的处理方式是在报警处理子程序里增加一个“急停恢复重初始化”逻辑当I0.7紧急停止按钮从1恢复为0时先复位出票找零状态M0.3、投币状态M0.2和所有输出Q0.0至Q0.3然后调用一次初始化子程序强制系统回到待机状态M0.0。这样做可以确保每次急停恢复后售票机都从干净的状态重新开始既安全又方便演示。需要注意的是在这个场景中急停复位后系统虽然回到待机状态但余额数据和票种数据也应该一并清空防止上一笔未完成的交易数据污染下一笔交易。所以初始化子程序里不但要复位状态位还要把VW100和VW102这两个关键数据寄存器清零。6. 关于梯形图设计习惯与效率的几个体会6.1 用注释管理长程序梯形图最怕的就是没有注释。S7-200程序里我强制自己每个网络都写满注释写明当前网络的逻辑意图和对应的状态。网络注释不是写给机器看的机器看的是指令代码注释是写给未来的自己看的。这个项目结束三个月后我回来看程序如果没有注释根本想不起来M0.2为什么会和定时器T37并联。有注释的情况下几分钟就能重新掌握程序全貌。6.2 数值运算统一使用VD还是VWS7-200的V区寄存器既可做字节操作也可做字操作。自动售票机的金额数值累计我在项目里用VW100保存余额、VW102保存票价、VW104保存找零都是16位字操作。如果涉及更大金额或更复杂的计算建议升级为VD双字操作避免溢出。这里要提醒的是MCGS组态时寄存器类型要和PLC指令一致。PLC里用字指令写入VW100MCGS里就按寄存器类型16位有符号/无符号处理如果PLC改成双字指令写入VD100MCGS里的寄存器地址也要改成32位。寄存器宽度不一致是通讯数据乱码的常见原因之一排查时一定要把PLC指令宽度和组态数据宽度串联起来看。6.3 继电器线圈消弧的备用方案前面提到中间继电器线圈要反向并联续流二极管实际项目中如果手边没有二极管也可以换成阻容吸收电路一个电阻串联一个电容并联在继电器线圈两端效果类似。但是有一点你必须坚持绝对不能省掉这个吸收电路。我见过一个现场因为没有加续流二极管电磁阀每次断电时产生的反向电动势直接打坏了触摸屏的电源模块维修成本远大于一个二极管的几毛钱。6.4 实验模型的机械结构建议如果读者朋友也打算复刻这套模拟售票机机械设备部分不需要太高精度。我用的是透明亚克力板做外壳投币口用一个漏斗状通道硬币落下经过光电传感器传感器型号是E3F-DS30C4漫反射式光电开关价格便宜而且灵敏度可调。出票电机用的是微型直流减速电机配合两个橡胶滚轮模拟票卡推送机构。找零机构相对麻烦一点我直接用了一个电磁铁推杆通电时把一颗“找零硬币”从储币槽推出虽然和真实找零机构原理差距较大但作为教学演示已经足够。6.5 教学演示模式的附加想法如果这套模拟售票机是用在教学场景里的我建议在MCGS画面上加一个“教学演示模式”切换按钮。开启后PLC自动定时循环演示一遍完整的购票流程自动选票、自动投币、自动出票、自动找零。这样在课堂上不需要有人手动操作按钮系统自己就能展示整个运行过程讲解效果比单纯静态画面好很多。实现思路很简单用一个M20.0位变量控制“演示模式”在这个模式里梯形图中增加一个周期为20秒的循环定时器每隔一段时间自动触发一次票种选择信号和投币信号代替人工按钮输入。其他逻辑完全不变。这套项目做完之后我对AFC系统的理解深度和PLC编程的综合能力都上了一个台阶。最关键的一点是我学会了先想清楚状态机再写梯形图而不是一边写一边改。对于想系统掌握S7-200和MCGS联调技巧的人来说自动售票机这个题目真的是性价比极高的练习目标——它不复杂但足够完整从IO分配、接线设计、梯形图逻辑到触摸屏组态、通讯联调整个PLC项目开发的流程它全部覆盖了一遍。把这套流程走通之后再去看其他类似的项目基本都能做到心里有数。
返回列表