1. 项目概述
这个基于松下FP-XHC60T PLC和昆仑通态触摸屏的工业自动化项目,是我最近完成的一个典型多轴控制系统。整套方案包含了完整的自动化产线所需的核心功能模块:从基础的故障处理、模式切换,到复杂的多轴协同控制、视觉系统通讯,再到实用的配方管理和产能统计功能。
项目最大的亮点在于其标准化的程序框架设计。采用模块化编程思路,将不同功能解耦为独立模块,通过清晰定义的接口进行交互。这种架构不仅便于当前项目的调试维护,更能快速适配其他类似产线需求。特别值得一提的是轴控制部分采用的数据表定位模式,通过参数化配置实现了运动控制的柔性化调整。
2. 系统架构设计
2.1 硬件配置方案
项目采用松下FP-XHC60T作为主控制器,这是一款支持6轴运动控制的中高端PLC。实际配置如下:
| 硬件组件 | 型号规格 | 数量 | 主要用途 |
|---|---|---|---|
| PLC主机 | FP-XHC60T | 1台 | 主控制器 |
| 触摸屏 | 昆仑通态MCGS | 1台 | HMI交互 |
| 伺服驱动器 | 松下MINAS A6 | 6套 | 轴控制 |
| 视觉系统 | 基恩士CV-X | 1套 | 质量检测 |
| IO模块 | FP-X E16YT | 2块 | 扩展IO |
这套配置的选型考虑了以下因素:
- PLC的轴控制能力需匹配产线机械结构
- 触摸屏要支持配方功能且响应速度快
- 伺服系统需具备高精度位置控制
- 视觉系统分辨率要满足检测要求
2.2 软件架构设计
程序采用分层模块化设计,主要分为以下几个功能层:
-
设备驱动层:直接控制硬件设备,包括:
- 伺服轴控制
- IO信号处理
- 通讯协议实现
-
功能模块层:
- 故障处理模块
- 模式控制模块(自动/手动/复位)
- 配方管理模块
- 生产统计模块
-
应用逻辑层:
- 工艺流程实现
- 设备协同控制
- 异常处理流程
-
HMI交互层:
- 触摸屏界面
- 参数设置
- 状态监控
这种分层架构使得各功能模块高度独立,修改某个模块不会影响其他部分的运行。例如当需要调整轴控制参数时,只需修改设备驱动层的相关代码,无需改动上层逻辑。
3. 核心功能实现
3.1 多轴控制实现
轴控制采用数据表定位模式,相比传统的硬编码方式具有明显优势:
- 参数化配置:所有位置参数存储在数据表中,修改位置只需更新表格数据
- 动态调整:运行时可通过HMI修改位置参数,无需停机下载程序
- 扩展方便:新增工位只需在表格中添加记录,程序逻辑无需改动
具体实现代码如下:
st复制// 轴位置数据表定义
VAR
AxisPosTable : ARRAY[1..MAX_STATION] OF LREAL :=
[0.0, 100.0, 200.0, 300.0, 400.0, 500.0]; // 各工位基准位置
CurrentStation : INT := 1; // 当前工位索引
END_VAR
// 轴移动函数
FUNCTION MoveToStation : BOOL
VAR_INPUT
StationNo : INT;
END_VAR
VAR
TargetPos : LREAL;
MoveCmd : MC_MoveAbsolute;
END_VAR
// 参数检查
IF (StationNo < 1) OR (StationNo > MAX_STATION) THEN
RETURN FALSE;
END_IF
// 获取目标位置
TargetPos := AxisPosTable[StationNo];
// 执行绝对位置移动
MoveCmd(
Axis := Axis1,
Position := TargetPos,
Velocity := 100.0,
Acceleration := 50.0,
Deceleration := 50.0,
Execute := TRUE);
// 等待定位完成
IF MoveCmd.Done THEN
CurrentStation := StationNo;
RETURN TRUE;
END_IF
RETURN FALSE;
注意事项:数据表中的位置参数需考虑机械结构的实际零点偏移量。建议先通过手动模式校准各工位位置,再将实测值填入表格。
3.2 配方管理系统
配方功能通过昆仑通态触摸屏的配方控件实现,PLC端主要处理配方的加载和应用。系统支持多达50组配方,每组配方包含以下参数:
- 工艺速度
- 温度设定值
- 压力阈值
- 检测标准值
配方数据存储在触摸屏的Flash存储器中,PLC通过Modbus TCP协议读取当前激活的配方数据。关键实现如下:
st复制// 配方数据结构
TYPE RecipeData :
STRUCT
Speed : REAL; // 工艺速度(mm/s)
Temp : REAL; // 温度设定(℃)
Pressure : REAL; // 压力阈值(MPa)
Tolerance : REAL; // 尺寸公差(mm)
END_STRUCT
END_TYPE
// 配方处理函数
FUNCTION ApplyRecipe : BOOL
VAR_INPUT
RecipeID : INT;
END_VAR
VAR
TempRecipe : RecipeData;
RegAddr : INT;
END_VAR
// 计算Modbus寄存器地址
RegAddr := RecipeID * 10 + 1000;
// 读取配方数据
TempRecipe.Speed := MB_READ_REAL(RegAddr);
TempRecipe.Temp := MB_READ_REAL(RegAddr+2);
TempRecipe.Pressure := MB_READ_REAL(RegAddr+4);
TempRecipe.Tolerance := MB_READ_REAL(RegAddr+6);
// 应用配方参数
SET_PROCESS_PARAM(
Speed := TempRecipe.Speed,
Temp := TempRecipe.Temp,
Pressure := TempRecipe.Pressure,
Tolerance := TempRecipe.Tolerance);
RETURN TRUE;
实际使用中发现几个关键点:
- 配方ID建议采用1-based索引,与触摸屏控件保持一致
- Modbus寄存器地址需要与触摸屏配置严格对应
- 每次更换产品时应先停止设备再切换配方
3.3 产能统计功能
产能统计模块实时记录以下生产数据:
- 班次产量
- 良品数量
- 不良品数量
- 平均节拍时间
- 设备综合效率(OEE)
实现逻辑如下:
st复制// 生产统计变量
VAR
TotalCount : UDINT; // 总产量
GoodCount : UDINT; // 良品数
StartTime : TIME; // 班次开始时间
LastCycleTime : TIME; // 上一周期时间
OEE : REAL; // 设备综合效率
END_VAR
// 产品完成信号处理
IF Product_Finished THEN
TotalCount := TotalCount + 1;
// 质量检测结果
IF Quality_OK THEN
GoodCount := GoodCount + 1;
END_IF
// 计算周期时间
LastCycleTime := CURRENT_TIME - LastProductTime;
LastProductTime := CURRENT_TIME;
// 计算OEE
OEE := (GoodCount / TotalCount) *
(TheoreticalCycleTime / LastCycleTime) *
(RUNNING_TIME / SHIFT_TIME);
END_IF
为提高统计准确性,特别增加了以下处理:
- 使用硬件中断捕获产品完成信号,避免扫描周期影响
- 对周期时间进行移动平均滤波,消除异常值影响
- 班次切换时自动保存数据到触摸屏的历史数据库
4. 关键问题解决方案
4.1 多轴同步控制
在物料搬运场景中,需要两个轴(X轴和Y轴)协同运动。最初尝试分别控制两个轴,但出现了不同步现象。最终解决方案是使用PLC的电子齿轮功能:
st复制// 主从轴配置
MC_GearIn(
Master := X_Axis,
Slave := Y_Axis,
Ratio := 1.0, // 速度比
StartMode := BufferMode,
Execute := TRUE);
// 设置耦合关系后,只需移动主轴
MC_MoveAbsolute(
Axis := X_Axis,
Position := TargetX,
Velocity := 100.0,
Execute := TRUE);
调试要点:
- 必须先建立齿轮耦合关系再发送移动指令
- 实际速度比需要考虑机械传动比
- 加减速参数应以响应较慢的轴为准
4.2 视觉通讯超时处理
与视觉系统的通讯采用TCP/IP协议,实际运行中发现偶尔会出现通讯超时。通过以下措施提高了稳定性:
- 增加心跳检测机制
st复制// 心跳检测
IF NOT Vision_Connected THEN
TCP_Connect(
ConnId := Vision_Conn,
Addr := '192.168.1.100',
Port := 2000,
Connect := TRUE);
END_IF
// 定时发送心跳包
IF HeartbeatTimer.Q THEN
TCP_Send(
ConnId := Vision_Conn,
Data := 'HEARTBEAT',
SendLen := 9,
Send := TRUE);
HeartbeatTimer(IN := FALSE);
END_IF
- 实现通讯重试机制
st复制// 带重试的发送函数
FUNCTION SendWithRetry : BOOL
VAR_INPUT
Data : STRING;
MaxRetries : INT := 3;
END_VAR
VAR
RetryCount : INT := 0;
END_VAR
WHILE RetryCount < MaxRetries DO
IF TCP_Send(Data := Data) THEN
RETURN TRUE;
ELSE
RetryCount := RetryCount + 1;
DELAY(100); // 等待100ms重试
END_IF;
END_WHILE;
RETURN FALSE;
- 关键参数配置优化:
- TCP KeepAlive时间设为30秒
- 接收超时设为500ms
- 发送缓冲区大小调整为1024字节
4.3 触摸屏响应优化
当配方数据较多时,触摸屏操作会出现延迟。通过以下方法显著提升了响应速度:
- 数据分组加载:将50组配方分为5页,每次只加载当前页的10组数据
- 使用异步通讯:非关键数据采用后台轮询方式更新
- 精简界面元素:每个画面控件数量控制在20个以内
- 启用触摸屏的本地缓存功能
5. 程序框架扩展建议
这个标准框架可以根据不同需求进行灵活扩展:
5.1 增加远程监控功能
通过添加以下模块实现:
- OPC UA服务器模块:提供标准化数据接口
- 数据日志模块:记录关键参数变化历史
- Web访问模块:支持手机端查看状态
5.2 增强诊断功能
建议扩展:
- 故障预测:基于运行参数的趋势分析
- 维护提醒:根据设备使用时长自动提示
- 调试模式:记录详细运行日志
5.3 支持更多设备类型
框架可通过以下方式扩展设备支持:
- 抽象设备接口层
- 增加设备驱动插件机制
- 统一参数配置界面
实际项目中,这个框架已经成功应用于多个不同行业的生产线,包括:
- 电子装配线
- 食品包装机
- 汽车零部件检测设备
- 医药灌装生产线
每个项目的核心框架复用率达到70%以上,大大缩短了开发周期。特别是在最近的一个半导体设备项目中,从框架搭建到系统联调仅用了3周时间,比传统开发方式节省了近50%的时间。