1. 项目概述:当PLC遇上自动售货机
去年帮朋友改造一台老式自动售货机时,我第一次将西门子S7-1200 PLC应用在这个领域。传统售货机的继电器控制线路复杂得像一团乱麻,而改用PLC后,不仅可靠性提升,新增功能也只需修改程序。这次经历让我意识到,用博途平台开发售货机控制系统,是工业自动化技术与商业设备结合的典型范例。
这个模拟程序开发项目,本质上是通过PLC实现售货机的完整工作逻辑:包括货道选择、电机驱动、金额计算、找零控制等核心功能。与真实设备相比,我们省去了投币器和纸币器的硬件部分,用HMI按钮模拟投币动作,但保留了完整的控制逻辑。选择S7-1200系列PLC是因为其性价比优势——相比S7-1500更经济,又比S7-200 SMART具有更强的通信扩展能力。
2. 硬件配置与博途环境搭建
2.1 硬件选型清单
在我的实际项目中,使用了以下配置:
- 控制器:西门子S7-1214C DC/DC/DC(6ES7 214-1AG40-0XB0)
- HMI设备:KTP700 Basic触摸屏(6AV2 123-2GB03-0AX0)
- 数字量扩展模块:SM1223 16DI/16DO(6ES7 223-1BL30-0XB0)
- 模拟量输入:SM1231 8AI(6ES7 231-4HF30-0XB0)
注意:如果只是模拟测试,可以仅使用PLC本体,通过博途的PLCSIM Advanced进行仿真,无需实际购买扩展模块。
2.2 博途V16安装避坑指南
根据我多次安装的经验,特别提醒以下几点:
- 安装前务必关闭所有杀毒软件,特别是某些国产安全卫士
- 安装路径不要包含中文或特殊字符
- 如果遇到SQL Server安装失败,先手动安装SQL Server 2016 SP2
- 许可证管理使用Automation License Manager 5.0以上版本
安装完成后,建议按这个顺序激活许可证:
code复制STEP 7 Professional
WinCC Professional
S7-PLCSIM
3. 售货机控制逻辑设计
3.1 功能需求分解
一个标准的自动售货机需要实现:
- 货道管理(8-16个货道)
- 投币识别(硬币/纸币)
- 金额累计与显示
- 商品选择与库存判断
- 电机驱动出货
- 找零计算与执行
- 销售数据统计
在模拟环境中,我们用HMI按钮替代真实的投币信号,但处理逻辑保持一致。
3.2 PLC程序结构设计
我的项目采用模块化编程结构:
code复制Organization Blocks (OB)
├─ OB1:主循环
├─ OB35:100ms定时中断(用于电机控制)
├─ OB82:诊断错误处理
Function Blocks (FB)
├─ FB1:投币处理
├─ FB2:货道控制
├─ FB3:找零计算
├─ FB4:HMI交互
Data Blocks (DB)
├─ DB1:系统参数
├─ DB2:货道信息
├─ DB3:销售统计
4. 核心功能实现详解
4.1 货道控制程序设计
每个货道对应一个QB输出点驱动电机,典型程序段:
ST复制// 货道1出货控制
IF "启动出货" AND "货道1有货" AND "金额足够" THEN
"货道1电机" := TRUE;
"出货计时器"(IN := TRUE, PT := T#2S);
END_IF;
IF "出货计时器".Q THEN
"货道1电机" := FALSE;
"货道1库存" := "货道1库存" - 1;
"当前金额" := "当前金额" - "货道1价格";
END_IF;
经验:电机运行时间建议设置在1.5-2秒,时间太短可能卡货,太长会浪费等待时间。
4.2 金额计算与找零逻辑
采用BCD码处理金额运算,避免浮点数精度问题:
LAD复制// 投币金额累加
L "当前金额"
L "投币面额"
+I
T "当前金额"
// 找零计算
L "当前金额"
L "商品价格"
-I
JCN NEG // 结果为负跳转
T "应找零"
JU END
NEG: L 0
T "应找零"
END: NOP 0
5. HMI界面设计与联动
5.1 触摸屏页面规划
- 首页:商品展示与价格
- 投币页:模拟不同面额投币
- 管理页:库存设置、价格调整
- 统计页:销售数据查询
5.2 关键HMI元素配置
- 商品按钮:关联PLC的M区触发位
- 金额显示:连接DB3.CurrentAmount变量
- 库存显示:使用符号IO域连接DB2.Inventory数组
- 出货动画:通过PLC的Q点状态触发
6. 调试技巧与问题排查
6.1 常见故障处理表
| 现象 | 可能原因 | 解决方法 |
|---|---|---|
| 出货后电机不停 | 定时器未复位 | 检查OB35中的定时器逻辑 |
| 金额计算错误 | 数据类型不匹配 | 统一使用INT或BCD格式 |
| HMI按钮无响应 | 变量连接错误 | 检查HMI变量与PLC地址对应关系 |
| 通信中断 | IP地址冲突 | 重置PLC和HMI的IP地址 |
6.2 调试工具使用心得
- 在线监控时,使用"强制"功能模拟投币信号
- 交叉引用查找是定位问题的利器
- 趋势图功能适合观察电机控制时序
- 诊断缓冲区能快速定位硬件故障
7. 项目进阶方向
完成基础功能后,可以考虑:
- 增加Modbus TCP通信实现远程监控
- 添加RFID卡支付功能
- 与云平台对接实现销售数据分析
- 温度监控(适用于冷藏型售货机)
我在实际项目中添加了微信支付模块,通过PLC的开放式用户通信(OUC)与第三方支付盒子通信,核心代码片段:
SCL复制// 微信支付结果查询
IF "支付查询使能" THEN
TCON := TRUE;
"TCON_DB"(REQ := TCON,
CONT := TRUE,
ID := 1,
INTERVAL := 1000,
LADDR := 256,
CONNECT := "连接参数");
IF "TCON_DB".DONE THEN
TRCV := TRUE;
"TRCV_DB"(EN_R := TRCV,
ID := 1,
LEN := 20,
DATA := "接收缓冲区");
END_IF;
END_IF;
这个项目最让我有成就感的是,原本需要专业工程师维护的设备,现在普通便利店店员就能通过触摸屏进行补货和简单设置。PLC的稳定性和博途平台的灵活性,让自动售货机的智能化改造变得简单可靠。
