1. 项目概述:8工位小车随机呼叫控制系统
这个项目基于西门子TIA博途平台(V16-V20版本均可),使用S7-1200 PLC和HMI触摸屏构建了一个8工位的小车随机呼叫控制系统。系统核心功能是:在8个固定工位随机产生呼叫信号时,控制载货小车自动运行到对应工位完成物料转运。这个模型在自动化生产线、仓储物流、装配车间等场景非常典型,比如汽车总装线上的零部件配送、电子厂SMT车间的PCB板运输等。
我去年为一家汽车零部件供应商实施过类似系统,他们需要在12个装配工位间自动配送不同型号的齿轮箱。与本次项目相比,实际工程中还需要考虑急停安全回路、多小车防撞算法等复杂因素。但8工位版本已经包含了最核心的控制逻辑,特别适合作为PLC编程的进阶练手项目。
提示:虽然项目描述中提到了"仿真",但建议先用PLCSIM Advanced进行纯PLC逻辑测试,再连接HMI仿真。因为博途的PLCSIM和HMI仿真同时运行时容易出通信问题,后文会详细说明避坑方法。
2. 硬件配置与软件环境搭建
2.1 所需硬件清单
- PLC:西门子S7-1200系列(1214C DC/DC/DC最适合,自带14点DI/10点DO)
- HMI:KTP700 Basic触摸屏(7寸,分辨率800x480)
- 附件:8个呼叫按钮(实际工程用E-STOP蘑菇头按钮)、小车电机驱动器(用继电器模拟)、工位传感器(用普通DI信号模拟)
2.2 博途软件版本选择
从热搜词看,大家最关心版本兼容性问题。根据我的实测经验:
- 初学推荐:博途V17(稳定性最佳,对PLCSIM Advanced支持好)
- 新功能需求:V20(支持OPC UA服务器等新特性)
- 避坑指南:
- 避免混装不同版本(如同时安装V16和V19会导致License冲突)
- 安装前用官方TIA卸载工具清理旧版本
- 关闭杀毒软件再安装(特别是Automation License Manager服务常被误杀)
2.3 仿真环境配置步骤
- 安装PLCSIM Advanced V3.0+(普通PLCSIM不支持HMI连接)
- 在控制面板→程序和功能中启用"Windows功能":
- Hyper-V(必须)
- SMB 1.0/CIFS文件共享支持(用于HMI下载)
- 设置虚拟机网络:
bash复制# 在PowerShell管理员模式运行 Get-NetAdapter | Where-Object {$_.InterfaceDescription -match "Virtual"} | Rename-NetAdapter -NewName "PLCSIM"
3. PLC程序设计详解
3.1 信号地址规划
| 信号类型 | 地址范围 | 备注 |
|---|---|---|
| 呼叫按钮 | I0.0-I0.7 | 工位1-8的常开触点输入 |
| 到位信号 | I1.0-I1.7 | 光电传感器反馈 |
| 电机正转 | Q0.0 | 小车前进 |
| 电机反转 | Q0.1 | 小车后退 |
| 工位指示 | Q1.0-Q1.7 | LED显示当前目标工位 |
3.2 核心控制逻辑实现
采用状态机编程模式,在FB块中建立以下状态:
STL复制// 状态定义
#START := 0 // 初始状态
#MOVING := 1 // 运行中
#ARRIVED := 2 // 到达目标
#ERROR := 3 // 异常状态
// 状态转移条件
IF "当前状态" = #START AND "呼叫信号" <> 0 THEN
"目标工位" := 检测最高优先级呼叫();
"当前状态" := #MOVING;
END_IF;
IF "当前状态" = #MOVING AND "到位信号"["目标工位"] THEN
"当前状态" := #ARRIVED;
RESET("呼叫信号"["目标工位"]); // 清除该工位呼叫
END_IF;
3.3 随机呼叫算法优化
原始需求中"随机呼叫"的实现要点:
- 模拟信号生成:用系统时钟的毫秒值作为随机数种子
SCL复制// 在OB35循环中断组织块中(100ms周期) #randValue := "T#1S".TON(IN := NOT "T#1S".Q).ET / 10; IF #randValue MOD 8 = 0 THEN "模拟呼叫"[#randValue / 100] := TRUE; END_IF; - 优先级处理:当多个工位同时呼叫时,采用:
- 固定优先级(如工位1>工位2>...)
- 最近距离优先(需编码器反馈小车当前位置)
4. HMI界面设计与仿真技巧
4.1 画面元素布局
- 主画面:
- 8个工位按钮(带按下/释放状态显示)
- 小车运行动画(用矢量图形做直线移动)
- 当前工位指示(圆形LED阵列)
- 报警画面:
- 超时未到位报警
- 多重呼叫冲突报警
4.2 仿真常见问题解决
根据热搜词"博图hmi仿真按钮无反应"的解决方案:
- 检查连接配置:
- HMI设备属性→连接→添加S7-1200连接
- IP地址必须与PLCSIM Advanced虚拟PLC一致(默认192.168.0.1)
- 画面对象失效处理:
- 右键对象→属性→动画→检查变量绑定是否正确
- 更新图形列表(常见于从旧版本迁移的项目)
5. 系统调试与故障排查
5.1 典型问题清单
| 现象 | 可能原因 | 解决方案 |
|---|---|---|
| HMI显示"连接中断" | 防火墙阻止了S7通信 | 在Windows防火墙添加例外端口 |
| 小车运行方向相反 | 电机输出相位接反 | 交换Q0.0和Q0.1的逻辑 |
| 随机呼叫不触发 | 随机数种子未更新 | 改用"LOC_TIME"变量的毫秒部分 |
| 仿真时PLC无法启动 | 端口被占用 | 执行net stop hns重置网络栈 |
5.2 现场调试心得
- 信号去抖动:所有按钮输入必须加10-20ms的延时滤波,我在一个项目中曾因机械按钮抖动导致小车误动作:
LAD复制// 滤波逻辑示例 "工位1滤波" := "工位1按钮" AND "延时接通定时器".Q; - 运动控制优化:小车接近目标工位时应当减速,可通过PWM输出实现:
SCL复制#pwmDuty := 100 - ("剩余距离" * 10); "电机PWM" := #pwmDuty > 30; // 最小占空比限制
6. 工程文件管理建议
- 版本控制:
- 每次修改前创建归档(项目→归档)
- 使用"另存为版本"功能保存关键节点
- 库文件标准化:
- 将常用功能块(如电机控制FB)存入全局库
- 建立公司命名的HMI模板(如背景logo、报警窗口样式)
我在实际项目中遇到过因未归档导致程序覆盖的惨痛教训。现在会强制要求团队:
- 每日下班前提交.at20文件到Git仓库
- 版本命名规则:日期_姓名_修改摘要(如"20240520_张三_增加急停逻辑")
7. 扩展应用方向
- 与视觉系统集成:
- 通过OPC UA连接Opt工业相机(热搜词中的opt奥普特相机)
- 实现物料ID识别后自动派送小车
- 多车协同:
- 添加RFID识别小车编号
- 采用Dijkstra算法规划最优路径
- 数字孪生:
- 用PLCSIM Advanced的API接口连接Unity3D
- 构建3D可视化监控界面
这个8工位系统虽然简单,但包含了工业控制的典型模式。掌握后可以快速扩展到更复杂的场景,比如我最近做的轮胎工厂AGV调度系统,核心逻辑就是在此基础上增加了:
- 无线AP通信(Profinet IO over WLAN)
- 电量管理(自动前往充电工位)
- 交通管制(区域互锁)
