1. 项目背景与核心价值
去年接手了一个食品包装产线的改造项目,产线上需要控制四台伺服电机完成物料分拣和装箱动作。甲方要求用汇川H5U系列PLC实现,同时预算有限不能上运动控制器。这个看似简单的需求背后,其实藏着不少坑。今天就把整个开发过程中的实战经验做个系统梳理,特别是那些手册上不会写的细节问题。
H5U作为汇川中型PLC的主力机型,虽然本体不带运动控制模块,但通过高速脉冲输出配合EtherCAT总线扩展,完全能够实现四轴联动的精确定位控制。关键在于如何合理规划轴资源、优化运动曲线以及处理多轴协同中的时序问题。下面就从硬件配置开始,一步步拆解整个开发流程。
2. 硬件配置与参数设定
2.1 硬件选型方案
最终采用的硬件组合如下:
- 主控:H5U-1616MTD(16点输入/16点晶体管输出)
- 扩展模块:AM600-4E4ST(4路EtherCAT从站)
- 伺服驱动器:SV660N系列(支持EtherCAT通讯)
- 伺服电机:100W~400W不等(根据各轴负载选配)
重要提示:H5U本体脉冲输出最高只支持200kHz,而通过EtherCAT总线可以跑到1MHz。建议将要求高的定位轴(如抓取轴)挂在EtherCAT总线上,普通输送带轴用本体脉冲即可。
2.2 伺服参数关键设置
每个伺服轴都需要校准以下参数(以SV660N为例):
ini复制[电机参数]
PA12=1000 // 电子齿轮分子
PA13=1 // 电子齿轮分母
PA14=10000 // 每转脉冲数
[控制参数]
PD01=1 // 控制模式:位置控制
PD04=300 // 位置环增益
PD05=15 // 速度环增益
调试时最容易出问题的就是电子齿轮比设置。有个快速验证方法:在手动模式下给5000个脉冲,测量电机实际转动角度。理论值=5000/(PA14×PA12/PA13),如果实测偏差超过5%,就需要重新校准编码器零点。
3. 软件编程核心逻辑
3.1 轴控指令封装
汇川的PLC编程软件AutoShop提供了标准运动控制指令库,但直接使用原生命令代码会非常冗长。我封装了几个常用功能块:
st复制// 绝对定位功能块
FUNCTION_BLOCK FB_AxisMove
VAR_INPUT
Axis: INT; // 轴号
Position: REAL; // 目标位置(mm)
Velocity: REAL; // 运行速度(mm/s)
END_VAR
VAR_OUTPUT
Done: BOOL;
END_VAR
VAR
cmdPos: LREAL;
END_VAR
// 单位换算(假设机械传动比为1:1)
cmdPos := Position * 1000; // 转成um单位
MC_MoveAbsolute(Axis, cmdPos, Velocity, 0.5, 0.5, TRUE);
3.2 多轴联动控制
包装线需要两个轴同步运行(X轴移载+Y轴升降),采用主从轴跟随模式:
st复制// 主从轴绑定(在初始化时执行)
MC_GearIn(Axis_Y, 1.0, Axis_X);
// 运行时只需给主轴发指令
MC_MoveVelocity(Axis_X, 100.0, 0.5);
这里有个关键细节:跟随比1.0表示从轴与主轴完全同步。如果存在机械传动比(比如2:1的同步带),就需要按实际比例调整这个参数。
4. 运动曲线优化技巧
4.1 S曲线加减速配置
直接使用梯形加减速会导致设备震动,改为S曲线后运行更平稳:
st复制MC_SetOverride(Axis_1,
Velocity := 100.0,
Acceleration := 300.0,
Deceleration := 300.0,
Jerk := 1000.0); // 加加速度参数
不同负载特性的轴需要差异化设置:
- 大惯量轴(如升降机构):降低加加速度(Jerk值)
- 轻负载轴(如平移模组):可适当提高加速度
4.2 位置比较输出
利用CMP指令实现精准位置触发:
st复制// 当Axis_1到达500mm位置时立即输出信号
MC_CamCompare(Axis_1,
Position := 500000.0, // um单位
Output := Y10);
这个功能在分拣动作中特别有用,可以实现飞拍、喷码等同步操作。注意比较点的提前量补偿,要考虑信号响应延迟(通常预留2-3ms)。
5. 故障诊断与调试
5.1 常见报警处理
| 错误代码 | 含义 | 解决方案 |
|---|---|---|
| 4080h | 跟随误差过大 | 检查负载是否卡死,降低加速度 |
| 4090h | 超程 | 检查限位开关接线 |
| 40A0h | EtherCAT通讯中断 | 检查网线,重启从站 |
| 40F0h | 伺服使能未打开 | 检查伺服驱动器的使能信号 |
5.2 实时监控技巧
在AutoShop中创建监控画面时,建议添加以下关键变量:
- 各轴的实际位置/指令位置差值(跟随误差)
- 驱动器的实时电流反馈
- 运动指令的执行状态字
遇到震动问题时,可以录制位置误差曲线。如果看到高频振荡(如图),就需要调整伺服增益:
code复制跟随误差曲线示例:
正常情况:______/^^^^^\______
振荡情况:_/\/\/\/\/\/\/\_
6. 程序架构设计
6.1 状态机实现
采用分层状态机管理整个流程:
st复制CASE step OF
0: // 待机状态
IF start_signal THEN
step := 10;
END_IF
10: // X轴移动到取料位
FB_AxisMove(Axis_X, 300.0, 150.0);
IF Axis_X.Done THEN
step := 20;
END_IF
20: // Z轴下降
FB_AxisMove(Axis_Z, -50.0, 30.0);
...
END_CASE
6.2 安全互锁逻辑
所有运动指令前必须加入安全判断:
st复制// 检查急停和防护门状态
IF NOT emergency_stop AND door_closed THEN
MC_MoveAbsolute(...);
ELSE
MC_Stop(...); // 平滑停止
END_IF
特别要注意的是,急停触发后不能简单地切断伺服使能,否则负载可能自由下落。正确的做法是先发平滑停止命令,待速度降为零后再关闭使能。
经过三个月的现场调试,这套系统最终实现了±0.1mm的重复定位精度,单次搬运节拍控制在1.2秒以内。最深的体会是:运动控制程序不能只关注定位精度,更要考虑设备全生命周期的可靠性和可维护性。比如在程序中预留手动微调接口,现场人员可以通过HMI直接修改关键位置的偏移量,这对后期工艺调整非常重要。
