1. 三轴示教系统概述
这套基于汇川H5U PLC和MCGS触摸屏的三轴示教系统,是我在工业自动化领域摸爬滚打多年后,总结出的一套既实用又好玩的解决方案。它本质上是个"动作记忆盒子",能让普通的三轴机械臂拥有学习能力——就像教小孩写字一样,你手把手带着机械臂走几遍动作流程,它就能记住并完美复现。
核心功能亮点在于:
- 支持4组独立工艺路径存储,相当于给设备配了4个"技能槽"
- 每组路径可记录多达100个示教点,满足绝大多数重复性动作需求
- 直观的触摸屏操作界面,产线工人无需编程基础也能快速上手
- 完整的离线仿真功能,调试阶段不用真机也能验证动作逻辑
2. 系统架构设计解析
2.1 硬件组成方案
这套系统的硬件架构经过多次迭代验证,最终确定的黄金组合是:
- 控制核心:汇川H5U-1616MTD PLC
- 16点输入/16点晶体管输出
- 3轴脉冲输出(支持最高500kHz)
- 内置EtherCAT主站功能
- 人机界面:MCGS TPC7062Ti触摸屏
- 7寸高亮度IPS屏
- 支持脚本编程和动画仿真
- 驱动系统:三套步进电机+驱动器
- 选用雷赛DM542驱动器
- 57系列闭环步进电机
- 标配1000线编码器反馈
硬件选型心得:H5U的脉冲输出稳定性远超预期,实测连续运行8小时脉冲误差小于0.1%。而选用闭环步进而非伺服系统,在保证精度的同时节省了30%成本。
2.2 软件架构设计
软件层面采用分层架构设计,各层之间通过标准化接口通信:
code复制[触摸屏层]
├─ 工艺管理界面
├─ 实时监控界面
└─ 虚拟仿真引擎
[PLC逻辑层]
├─ 运动控制FB (功能块)
├─ 示教管理FB
└─ 安全监控FB
[驱动层]
├─ 脉冲输出模块
└─ 编码器反馈处理
关键设计决策:
- 混合编程模式:核心算法用ST(结构化文本)编写,逻辑控制用梯形图实现
- 数据隔离存储:示教点数据单独存放在Retain存储区,避免断电丢失
- 双缓冲机制:执行当前路径时,允许后台编辑另一组路径数据
3. 核心功能实现细节
3.1 示教点记录功能
示教功能的本质是空间坐标的记忆与再现。在PLC中实现的记录函数如下:
st复制FUNCTION_BLOCK FB_TeachPointRecorder
VAR_INPUT
AxisNo : INT; // 轴号(1-3)
PointIndex : INT; // 点序号(1-100)
RecordCmd : BOOL; // 记录触发信号
END_VAR
VAR_OUTPUT
RecordDone : BOOL; // 记录完成信号
END_VAR
VAR
CurrentPos : LREAL; // 当前位置缓存
END_VAR
IF RecordCmd THEN
// 读取实际位置(单位:mm)
CurrentPos := Axis[AxisNo].ActualPosition;
// 存入保持型寄存器
TeachPoints[AxisNo, PointIndex] := CurrentPos;
// 更新点计数器
IF PointIndex < 100 THEN
PointIndex := PointIndex + 1;
END_IF
RecordDone := TRUE;
END_IF
精度控制要点:
- 使用LREAL(双精度浮点)而非INT存储坐标,避免量化误差
- 每次记录前自动读取编码器反馈值,而非依赖指令位置
- 坐标值统一转换为毫米单位,方便工艺人员理解
3.2 路径重现逻辑
路径执行采用逐点插补算法,关键处理流程:
-
速度规划:
st复制// 计算两点间距离 Distance := SQRT(POWER(X2-X1,2) + POWER(Y2-Y1,2) + POWER(Z2-Z1,2)); // 根据参数计算运动时间(毫秒) MoveTime := (Distance / Config.Speed) * 1000; -
运动触发:
st复制// 三轴同步启动 Axis[1].MoveAbsolute(X, MoveTime); Axis[2].MoveAbsolute(Y, MoveTime); Axis[3].MoveAbsolute(Z, MoveTime); // 等待所有轴到位 WAIT UNTIL Axis[1].InPosition AND Axis[2].InPosition AND Axis[3].InPosition;
避坑经验:
- 务必检查轴状态字中的"InPosition"信号,仅靠位置比较可能因机械误差导致误判
- 建议在点与点之间增加5-10ms的延时,避免瞬时加减速对机械结构的冲击
4. 触摸屏交互设计
4.1 工艺管理界面
MCGS触摸屏上的核心界面采用分层设计:
-
主操作界面:
- 工艺组选择旋钮
- 启动/暂停/急停按钮组
- 三轴坐标实时显示仪表
-
示教模式界面:
- 点动控制摇杆
- 当前点序号显示
- 记录/删除点功能键
-
参数设置界面:
- 运动速度设置(mm/s)
- 加速度曲线选择
- I/O映射配置表
UI设计技巧:
- 使用不同色系区分操作模式(红色-急停、绿色-运行、蓝色-示教)
- 关键按钮尺寸不小于80x80像素,方便戴手套操作
- 所有数值输入框增加上下调节箭头
4.2 离线仿真实现
仿真功能通过Lua脚本实现,核心算法:
lua复制function simulateTrajectory(points)
local prevX, prevY, prevZ = 0, 0, 0
local totalTime = 0
for i, point in ipairs(points) do
-- 计算各轴位移
local dx = math.abs(point.x - prevX)
local dy = math.abs(point.y - prevY)
local dz = math.abs(point.z - prevZ)
-- 取最大位移轴计算时间
local segmentTime = math.max(dx, dy, dz) / config.speed
-- 更新模型位置
model.moveTo(point.x, point.y, point.z, segmentTime)
-- 累计总时间
totalTime = totalTime + segmentTime
-- 更新前点坐标
prevX, prevY, prevZ = point.x, point.y, point.z
end
return totalTime
end
仿真优化技巧:
- 采用线性插值算法保证动画流畅度
- 添加虚拟负载惯量参数,更接近真实运动状态
- 支持0.5x-2x速度倍率调节
5. 系统扩展与优化
5.1 安全功能增强
在基础示教功能上,我增加了多层安全防护:
-
软限位保护:
st复制// 运动前检查目标位置 IF (TargetX > X_Limit_H) OR (TargetX < X_Limit_L) THEN Alarm := TRUE; AlarmMsg := 'X轴超限'; RETURN; END_IF -
动态速度调节:
st复制// 根据负载率自动降速 IF PowerRate > 80 THEN ActualSpeed := Config.Speed * 0.7; ELSIF PowerRate > 60 THEN ActualSpeed := Config.Speed * 0.9; END_IF
5.2 数据导出功能
通过自定义协议实现示教数据导出:
-
CSV格式导出:
st复制// 生成CSV文件头 FileWrite(Handle, 'PointNo,X,Y,Z,Time\n'); // 写入各点数据 FOR i := 1 TO PointCount DO STRING := CONCAT(INT_TO_STRING(i), ',', LREAL_TO_STRING(Points[i].X), ',', LREAL_TO_STRING(Points[i].Y), ',', LREAL_TO_STRING(Points[i].Z), ',', INT_TO_STRING(Points[i].Time), '\n'); FileWrite(Handle, STRING); END_FOR -
二进制格式导出:
st复制// 写入文件标识头 FileWrite(Handle, 'H5UTEACH'); // 写入数据块 FOR i := 1 TO PointCount DO FileWrite(Handle, Points[i]); END_FOR
格式选择建议:
- CSV适合Excel分析和Python处理
- 二进制格式更适合快速备份和恢复
6. 调试与问题排查
6.1 常见问题速查表
| 现象 | 可能原因 | 解决方案 |
|---|---|---|
| 记录点位置漂移 | 编码器干扰 | 检查屏蔽线接地,增加RC滤波 |
| 路径执行卡顿 | 脉冲频率过高 | 降低H5U的PLS频率至200kHz |
| 触摸屏响应慢 | 脚本死循环 | 检查Lua脚本的while循环退出条件 |
| 仿真动画异常 | 坐标单位不统一 | 确认PLC和HMI都使用mm单位制 |
6.2 精度优化技巧
-
机械回零校准:
- 采用光电开关+编码器Z相的双重定位
- 校准顺序:Z轴→X轴→Y轴
-
反向间隙补偿:
st复制// 在运动指令中补偿间隙 IF DirectionChanged THEN TargetPos := TargetPos + Backlash; END_IF -
温度漂移补偿:
st复制// 根据温度传感器读数动态调整 CompX := TempCoeff * (CurrentTemp - CalibTemp); ActualPos := CommandPos + CompX;
这套系统从最初版本到现在已经迭代了7个主要版本,最深的体会是:好的工业控制系统应该像积木一样,既有稳固的基础架构,又能灵活组合扩展。每次现场调试收获的经验,都转化成了程序里的TODO注释——这可能是给下个接手工程师最宝贵的礼物。
