简介:本资源是一份面向自动化专业本科生及PLC初学者的课程设计实践文档,聚焦基于西门子S7-200系列PLC的自动售货机控制系统开发,解决工业场景下逻辑控制、I/O分配、梯形图编程与硬件接线等核心问题。文档完整覆盖控制需求分析、I/O点分配表、顺序功能图(SFC)、STEP7编写的梯形图程序及外部接线图设计,特别包含投入硬币识别、超时退币、商品选择与出货、找零策略(支持一元/五角选择)等8项具体功能实现说明。资源为单个Word文档(.doc),大小466KB,内容结构清晰,含引言、PLC原理、程序设计、结论与参考文献等章节,虽存在格式瑕疵但技术细节扎实,适合作为课程设计参考或PLC实训补充材料。已有999人学习下载,可直接用于理解小型嵌入式控制系统的设计逻辑与工程落地路径。
1. 为什么用PLC做自动售货机不是“大材小用”,而是工业级可靠性的必然选择?
当你在便利店买一瓶水,硬币投入、按键按下、货道旋转、商品掉落——这看似简单的交互背后,藏着对响应确定性、故障容错性、环境适应性和长期免维护运行的严苛要求。单片机方案易受电源波动干扰,嵌入式Linux存在不可预测的调度延迟,而商用IoT网关在-10℃~55℃宽温、粉尘潮湿、频繁断电重启场景下常出现看门狗失效或文件系统损坏。PLC(可编程逻辑控制器)恰恰是为这类场景而生:它采用循环扫描执行机制,指令周期稳定在毫秒级;输入/输出模块具备光电隔离与浪涌保护;梯形图逻辑天然契合“投币→验证→选品→出货→找零”这一串行状态流;更重要的是,西门子S7-1200、三菱FX5U、汇川H3U等主流机型已内置RS485/Modbus RTU接口,可直接驱动步进电机驱动器、电磁锁、LED状态灯、纸币识别器等标准工业器件,无需额外开发驱动层。本设计面向高校课程设计、实训平台及小型商用设备落地,聚焦PLC如何用最少硬件资源实现完整售货逻辑闭环——不堆砌功能,不依赖上位机,所有判断与动作均由PLC本地完成。
2. 从I/O分配到状态机建模:PLC自动售货机的底层逻辑拆解
2.1 硬件资源约束下的最小化I/O规划
自动售货机核心动作包括:硬币/纸币识别、按键输入、货道驱动、找零执行、状态指示。若按传统思路为每个货道配独立输出点,16个货道将占用16路DO,加上传感器、指示灯、电机使能等,IO点迅速超限。常见做法是采用“矩阵扫描+译码驱动”结构:
- 输入侧:4×4矩阵键盘(16个商品键)仅需8路DI(4行+4列);硬币信号(1元/5角)用2路DI;红外对射检测货道是否卡货用16路DI → 共26路DI;
- 输出侧:16个货道共用1路步进电机脉冲+1路方向+1路使能(通过译码器74LS138选通目标货道),找零电机用2路DO(正转/反转),LED状态灯用4路DO(投币/选品/出货/故障),蜂鸣器1路DO → 共10路DO。
提示:实际选型时优先选用带高速计数器(HSC)的PLC型号(如FX5U-32MT/ES),硬币信号需接入HSC端口以准确捕获短脉冲(<10ms),避免普通DI因扫描周期漏计。
2.1.1 I/O地址映射表(以三菱FX5U为例)
| 功能类型 | 设备名称 | PLC地址 | 说明 |
|---|---|---|---|
| 输入 | 硬币1元信号 | X0 | 接入HSC0,上升沿触发计数 |
| 输入 | 硬币5角信号 | X1 | 接入HSC1 |
| 输入 | 键盘行线R0-R3 | X10-X13 | 扫描时输出低电平 |
| 输入 | 键盘列线C0-C3 | X20-X23 | 检测列线高电平 |
| 输入 | 货道1卡货检测 | X30 | 红外对射接收端 |
| ... | ... | ... | X30-X45共16路 |
| 输出 | 步进电机脉冲 | Y0 | PUL+信号 |
| 输出 | 步进电机方向 | Y1 | DIR信号 |
| 输出 | 译码器使能 | Y2 | 控制74LS138的E1端 |
| 输出 | 找零电机正转 | Y10 | 驱动直流减速电机 |
| 输出 | LED投币指示 | Y20 | 绿色LED |
2.2 基于顺序功能图(SFC)的状态迁移设计
售货流程本质是有限状态机(FSM):初始态→投币态→选品态→出货态→找零态→复位态。PLC梯形图难以直观表达多分支跳转,我一般会先用SFC图建模再转换:
- 初始态(S0):所有输出清零,等待X0/X1硬币信号;
- 投币态(S1):累计HSC0/HSC1值,实时更新内部寄存器D100(总金额),当D100≥最低商品价格(设为D101=100)时,置位M100(允许选品标志);
- 选品态(S2):扫描键盘矩阵,识别按键坐标(Ri+Cj→商品编号K),查表D200[K]获取该商品价格,若D100≥D200[K]则进入出货态,否则Y20闪烁提示余额不足;
- 出货态(S3):激活对应货道译码(如商品1→Y2=ON,Y3=OFF,Y4=OFF),Y0发送固定脉冲数(D300[K]存储各货道所需脉冲),Y1控制方向,完成后检测X30-X45对应红外信号是否由ON变OFF(货已掉落);
- 找零态(S4):计算D100-D200[K],驱动Y10/Y11控制找零电机转动圈数(每圈对应1角),同时Y21红灯闪烁;
- 复位态(S5):所有寄存器清零,M100复位,返回S0。
2.2.1 关键寄存器定义与初始化
D100: 当前余额(单位:分) D101: 最低商品价格(默认100分=1元) D200-D215: 商品价格表(D200[0]=100, D200[1]=150...) D300-D315: 各货道脉冲数(D300[0]=200表示商品0需200脉冲) M100: 选品使能标志(S1→S2条件) M101: 出货完成标志(S3→S4条件)注意:SFC中每个状态块需设置“转移条件”(Transition Condition)。例如S1→S2的转移条件为
M100=ON AND 键盘有有效按键,该条件必须在S1内持续扫描,而非单次触发——这是初学者最易忽略的细节,否则会导致按键失灵。
3. 梯形图实现:用三菱GX Works3编写核心控制逻辑
3.1 硬币累计与金额校验的抗抖动处理
硬币信号存在机械触点抖动,直接接HSC会导致计数翻倍。必须在HSC后加软件滤波:
// 硬币1元信号处理(X0) LD X0 AND M0 // M0为上一周期X0状态 OUT M1 // M1暂存当前X0 LD X0 ANDN M0 // 检测上升沿 OUT M2 // M2为去抖后上升沿 LD M2 OUT C0 K1 // C0为HSC0计数值锁存器 LD C0 OUT D100 // 将计数值写入余额寄存器逻辑说明:M0存储上周期X0状态,M2仅在X0由OFF→ON瞬间置位(即上升沿),避免抖动期间重复触发。C0为HSC0的当前计数值寄存器,每次M2置位时将其值累加到D100。参数说明:K1表示计数器类型为16位增计数器,实际应用中需在PLC参数设置里将X0指定为HSC0输入端口。
3.2 键盘矩阵扫描的时序控制
4×4键盘需分时扫描,避免行线同时输出导致短路。采用定时中断(如10ms)触发扫描:
// 定时中断程序(D8010=10ms) LD M8013 // 100ms时钟脉冲(作示例,实际用D8010) AND M100 // 仅在选品使能时扫描 OUT T0 K10 // T0延时10ms,控制行线切换节奏 LD T0 OUT Y10 // Y10-Y13为行线输出 LD Y10 AND X20 // 检测列线C0 OUT M200 // M200=ON表示按键(0,0)按下 LD Y10 AND X21 // 检测列线C1 OUT M201 // M201=ON表示按键(0,1)按下 // ...其余行列组合类似参数说明:T0为10ms定时器,K10表示设定值10(即10×10ms=100ms周期),确保每行扫描间隔足够长以稳定读取列线电平。Y10-Y13依次输出低电平(0V),X20-X23检测对应列线是否被拉低。
3.3 出货脉冲生成与货道选通逻辑
步进电机驱动需精确脉冲数,且不同货道对应不同译码组合:
// 出货态(S3)内执行 LD S3 AND M200 // 商品0被选中 OUT Y2 // 译码器使能 LD M200 AND S3 OUT Y3 // 74LS138的A0=ON LD M200 AND S3 OUT Y4 // A1=ON LD M200 AND S3 OUT Y5 // A2=ON(000→商品0) LD S3 AND M200 OUT Y0 // 启动脉冲输出 LD Y0 AND T10 // T10为脉冲定时器(1ms周期) OUT Y0 // 形成方波 LD T10 OUT C10 K200 // C10计数200次(对应D300[0]) LD C10 OUT M101 // 计数完成,置位出货完成标志逻辑说明:Y2-Y5控制74LS138的地址线与使能端,实现16选1;Y0通过T10(1ms定时器)产生占空比50%的方波,C10对Y0下降沿计数,达到K200后触发M101。关键参数:T10的K值设为1(1×1ms=1ms),确保脉冲频率1kHz,适配常见步进电机驱动器。
4. 通信与扩展:Modbus RTU对接纸币识别器与远程监控
4.1 用PLC串口实现Modbus主站读取纸币识别器数据
当系统需支持纸币支付时,纸币识别器(如MEI Cashflow系列)通常提供RS485 Modbus RTU接口。PLC需作为主站轮询从站寄存器:
| 寄存器地址 | 数据类型 | 含义 | 示例值 |
|---|---|---|---|
| 40001 | UINT16 | 当前识别纸币面额 | 1000 |
| 40002 | UINT16 | 纸币状态(0=正常) | 0 |
| 40003 | UINT16 | 累计识别张数 | 127 |
在GX Works3中配置串口参数:
- 通讯协议:Modbus RTU
- 波特率:9600
- 数据位:8
- 停止位:1
- 校验:None
- 从站地址:1(纸币器ID)
4.1.1 Modbus读取指令调用(FX5U专用指令)
// 每100ms执行一次读取 LD M8012 // 1s时钟脉冲(降频用) AND M100 // 投币态后启动读取 OUT M300 // 触发读取标志 LD M300 MOV K1 D1000 // 从站地址=1 MOV K40001 D1001 // 起始地址=40001 MOV K3 D1002 // 读取3个寄存器 MODBUSRD D1000 D1010 // 执行读取,结果存入D1010起始 LD MODBUSRD_OK // 读取成功标志 OUT M301 // 置位成功标志参数说明:
MODBUSRD为FX5U内置指令,D1000-D1002为参数寄存器,D1010-D1012存储读取结果。若MODBUSRD_OK=OFF,需检查D1020(错误码):0=无错,1=超时,2=校验错,3=从站无响应。
4.2 通过以太网上传运行日志至SCADA系统
FX5U支持TCP/IP协议栈,可主动向SCADA服务器(如Ignition、组态王)发送JSON格式日志:
{ "timestamp": "2024-06-15T08:23:45", "machine_id": "VEND-001", "event": "sale_complete", "item_code": 5, "amount_paid": 150, "change_given": 50, "error_code": 0 }实现步骤:
- 在GX Works3中启用“Socket通信”功能,配置目标IP(SCADA服务器)与端口(如1883);
- 编写结构化数据打包程序:用
MOV指令将D1000-D1005(时间戳高位/低位、商品号、金额等)拼接为ASCII字符串; - 调用
SOCKET_SEND指令发送,失败时重试3次并记录错误码至D2000。
提示:为降低网络负载,日志采用二进制编码而非JSON文本——将6个字段压缩为12字节结构体(如时间戳用DWORD,商品号用BYTE),SCADA端解析更高效。
5. 故障诊断与现场调试:3类高频问题的定位方法
5.1 货道不出货的逐级排查表
| 现象 | 可能原因 | 验证方法 | 解决方案 |
|---|---|---|---|
| 按键无响应 | 键盘扫描周期过短 | 监控Y10-Y13输出波形,确认每行保持低电平≥5ms | 增大T0设定值(如K20→K50) |
| 某货道始终不出货 | 译码器地址线接错 | 用万用表测Y2-Y5电压,对照74LS138真值表验证A0-A2组合 | 重新焊接Y3/Y4/Y5至正确引脚 |
| 出货后红外未检测到 | 红外对射未对准或被遮挡 | 断开X30-X45接线,短接对应输入端子,观察M101是否置位 | 调整发射/接收端角度或清洁镜片 |
| 脉冲输出但电机不转 | 步进驱动器使能信号缺失 | 测Y2电压,确认出货态时Y2=ON;检查驱动器EN端是否接Y2 | 将Y2接入驱动器EN端 |
| 找零金额错误 | D100余额未清零 | 强制复位后立即投币,监控D100初始值是否为0 | 在S5态添加MOV K0 D100指令 |
5.2 用PLC内置诊断功能快速定位通信异常
FX5U提供PLC诊断缓冲区(D8000-D8099),其中关键地址:
- D8000:CPU运行状态(0=RUN,1=STOP)
- D8001:最后错误代码(如101=程序错误,202=通信超时)
- D8002:错误发生地址(指向梯形图步序)
- D8010:Modbus错误码(0=OK,1=超时,2=校验错)
现场调试技巧:在GX Works3中打开“在线监视”→“软元件监视”,添加D8000-D8002,当故障发生时立即冻结画面,根据D8001值查手册定位根因。例如D8001=202,说明某条指令执行超时,需检查该指令前是否有未复位的条件锁死。
5.3 用LED状态灯实现无屏故障自检
在无HMI屏幕的简易机型中,用Y20-Y23四颗LED编码故障类型:
- Y20闪烁1次:硬币计数异常(HSC未触发)
- Y20闪烁2次:键盘扫描失败(连续10次未读到有效按键)
- Y20闪烁3次:货道红外超时(出货后5秒未检测到信号变化)
- Y20-Y23全亮:Modbus通信中断(D8010≠0且持续10秒)
实现逻辑:
LD D8010 CMP K0 D8010 M400 // M400=ON当Modbus正常 LDN M400 OUT T100 K100 // T100=10s定时器 LD T100 OUT Y20 // 故障灯常亮注意:此方案牺牲了部分IO资源,但极大降低售后维护成本——维修人员无需笔记本即可通过LED闪烁模式判断故障层级,平均缩短排故时间60%以上。
本文还有配套的精品资源,点击获取