1. 项目背景与问题分析
在工业自动化领域,飞剪控制一直是个既经典又具有挑战性的课题。我最近接手的一个包装产线改造项目,就遇到了一个典型的飞剪控制难题。客户原有的西门子S7-1500 PLC需要实现飞剪功能,但经过详细技术调研后发现,标准版S7-1500竟然不支持凸轮同步功能——这个在运动控制中至关重要的特性。
技术说明:凸轮同步(Cam Synchronization)是运动控制中的核心功能,它允许从轴(如刀轴)精确跟随主轴(如送料轴)的运动轨迹,实现完美的速度匹配和相位关系。
更让人头疼的是,支持凸轮功能的S7-1500T系列价格几乎是标准版的2-3倍,这对预算有限的项目来说简直是"致命打击"。面对这个技术-成本的两难选择,我决定另辟蹊径:既然硬件功能受限,那就从算法层面突破,用数学建模的方式实现等效的飞剪控制。
2. 飞剪控制的核心原理
2.1 飞剪工艺的基本要求
飞剪(Flying Shear)的本质是在材料连续运动过程中完成精确切割,其核心要求可归纳为:
- 同步阶段:刀轴必须与材料运动完全同步,确保切割瞬间相对速度为零
- 加速阶段:切割完成后刀轴需要加速返回起点
- 减速阶段:接近起点时平稳减速以避免机械冲击
- 等待阶段:保持静止等待下一个切割周期
传统凸轮方案之所以优秀,是因为它内置了完善的轨迹规划算法,能够自动生成满足上述所有要求的平滑运动曲线。
2.2 多项式插值的优势
在没有凸轮功能的情况下,我们需要自己构造刀轴的运动曲线。经过多种算法对比,我最终选择了五次多项式(Quintic Polynomial)作为解决方案,原因在于:
- 连续性:五次多项式可保证位置、速度、加速度的连续变化
- 灵活性:6个系数提供了足够的自由度来满足边界条件
- 计算效率:PLC的浮点运算能力完全足以实时计算
数学表达式为:
code复制θ(t) = a₀ + a₁t + a₂t² + a₃t³ + a₄t⁴ + a₅t⁵
其中θ(t)表示刀轴在时间t时的角度位置。
3. 具体实现方案
3.1 运动曲线参数计算
要实现完美的飞剪动作,需要根据工艺要求确定多项式的系数。假设一个完整的飞剪周期包含:
- 同步区间:t∈[0,T₁]
- 返回区间:t∈[T₁,T₂]
边界条件设置如下:
| 时间点 | 位置条件 | 速度条件 | 加速度条件 |
|---|---|---|---|
| t=0 | θ=0 | v=0 | a=0 |
| t=T₁ | θ=θ_max | v=v_material | a=0 |
| t=T₂ | θ=0 | v=0 | a=0 |
通过求解这6个方程组成的线性系统,可以得到唯一确定的多项式系数。在实际工程中,我开发了一个Excel计算工具来自动完成这个计算过程。
3.2 PLC程序架构设计
在TIA Portal中的程序结构如下:
code复制- OB1 (主循环组织块)
|- FC1000 飞剪控制主逻辑
|- FB500 五次多项式计算功能块
|- DB200 工艺参数数据块
关键功能块FB500的STL实现:
stl复制FUNCTION_BLOCK "FB_Poly5"
VAR_INPUT
t : REAL; // 归一化时间 [0,1]
a : ARRAY[0..5] OF REAL; // 多项式系数
END_VAR
VAR_OUTPUT
pos : REAL; // 输出位置
vel : REAL; // 输出速度
acc : REAL; // 输出加速度
END_VAR
VAR_TEMP
t2, t3, t4, t5 : REAL;
END_VAR
BEGIN
t2 := t*t;
t3 := t2*t;
t4 := t3*t;
t5 := t4*t;
// 位置计算
pos := a[0] + a[1]*t + a[2]*t2 + a[3]*t3 + a[4]*t4 + a[5]*t5;
// 速度计算(一阶导数)
vel := a[1] + 2*a[2]*t + 3*a[3]*t2 + 4*a[4]*t3 + 5*a[5]*t4;
// 加速度计算(二阶导数)
acc := 2*a[2] + 6*a[3]*t + 12*a[4]*t2 + 20*a[5]*t3;
END_FUNCTION_BLOCK
3.3 运动控制时序管理
飞剪动作必须与送料编码器严格同步,我的解决方案是:
- 通过高速输入模块采集编码器信号
- 在OB35循环中断组织块(建议2ms周期)中处理位置跟踪
- 使用归一化时间参数简化计算:
stl复制// 在OB35中计算归一化时间
IF "飞剪使能" THEN
"当前周期时间" := "当前周期时间" + "OB35周期时间";
"归一化时间" := "当前周期时间" / "总周期时间";
IF "归一化时间" >= 1.0 THEN
"当前周期时间" := 0.0;
"切割完成" := TRUE;
END_IF;
END_IF;
4. 调试经验与优化技巧
4.1 参数整定方法
经过多次现场调试,我总结出以下参数优化流程:
- 先设置保守的速度/加速度值,确保机械安全
- 通过TIA Portal的Trace功能记录实际运动曲线
- 逐步提高速度,观察以下关键指标:
- 切割瞬间的同步误差
- 最大机械振动幅度
- 电机负载率
重要提示:务必在刀轴行程的两端设置软件限位,防止参数错误导致机械碰撞。
4.2 常见问题排查
在实际应用中遇到过几个典型问题及解决方案:
| 问题现象 | 可能原因 | 解决方案 |
|---|---|---|
| 切割位置不一致 | 编码器信号干扰 | 增加信号滤波器,改用差分输入 |
| 返回阶段振动大 | 加速度不连续 | 调整多项式系数,确保加速度平滑过渡 |
| 高速时不同步 | PLC周期不稳定 | 优化程序结构,确保OB35执行时间稳定 |
4.3 性能优化技巧
- 计算优化:预先计算并存储常用系数组合,减少在线计算量
- 中断处理:将关键计算放在更高优先级的OB中断中
- 死区补偿:针对传动间隙添加位置补偿算法
- 自适应调节:根据材料速度自动调整运动曲线参数
5. 方案对比与扩展应用
5.1 与传统方案的比较
| 指标 | 多项式算法 | 1500T凸轮功能 |
|---|---|---|
| 硬件成本 | 低 | 高 |
| 开发难度 | 中 | 低 |
| 灵活性 | 高 | 中 |
| 最高同步精度 | ±0.1mm | ±0.05mm |
| 适用场景 | 中低速应用 | 高速高精度 |
5.2 扩展应用方向
这套算法框架经过适当调整,还可以应用于:
- 追剪控制系统
- 旋转刀切割设备
- 同步送料机构
- 电子齿轮应用
特别是在需要非对称运动曲线的场合,多项式算法的灵活性优势更加明显。我曾成功将其应用于一个特殊包装机,要求刀轴在前进和返回阶段采用不同的速度曲线,这是标准凸轮功能难以实现的。
6. 关键代码详解
6.1 多项式系数计算
在实际工程中,我开发了专门的系数计算功能块:
stl复制FUNCTION "FC_CalcCoeff" : VOID
VAR_INPUT
startPos : REAL;
endPos : REAL;
startVel : REAL;
endVel : REAL;
startAcc : REAL;
endAcc : REAL;
moveTime : REAL;
END_VAR
VAR_OUTPUT
coeff : ARRAY[0..5] OF REAL;
END_VAR
VAR_TEMP
T2, T3, T4, T5 : REAL;
matrix : ARRAY[0..5, 0..5] OF REAL;
bVector : ARRAY[0..5] OF REAL;
solution : ARRAY[0..5] OF REAL;
END_VAR
BEGIN
// 构建矩阵方程
T2 := moveTime*moveTime;
T3 := T2*moveTime;
T4 := T3*moveTime;
T5 := T4*moveTime;
// 第一行:t=0时的位置
matrix[0,0] := 1; matrix[0,1] := 0; matrix[0,2] := 0; matrix[0,3] := 0; matrix[0,4] := 0; matrix[0,5] := 0;
bVector[0] := startPos;
// 第二行:t=0时的速度
matrix[1,0] := 0; matrix[1,1] := 1; matrix[1,2] := 0; matrix[1,3] := 0; matrix[1,4] := 0; matrix[1,5] := 0;
bVector[1] := startVel;
// 第三行:t=0时的加速度
matrix[2,0] := 0; matrix[2,1] := 0; matrix[2,2] := 2; matrix[2,3] := 0; matrix[2,4] := 0; matrix[2,5] := 0;
bVector[2] := startAcc;
// 第四行:t=moveTime时的位置
matrix[3,0] := 1; matrix[3,1] := moveTime; matrix[3,2] := T2; matrix[3,3] := T3; matrix[3,4] := T4; matrix[3,5] := T5;
bVector[3] := endPos;
// 第五行:t=moveTime时的速度
matrix[4,0] := 0; matrix[4,1] := 1; matrix[4,2] := 2*moveTime; matrix[4,3] := 3*T2; matrix[4,4] := 4*T3; matrix[4,5] := 5*T4;
bVector[4] := endVel;
// 第六行:t=moveTime时的加速度
matrix[5,0] := 0; matrix[5,1] := 0; matrix[5,2] := 2; matrix[5,3] := 6*moveTime; matrix[5,4] := 12*T2; matrix[5,5] := 20*T3;
bVector[5] := endAcc;
// 调用高斯消元法求解线性方程组
"FC_LinAlg_Solve"(A:=matrix, b:=bVector, x=>solution);
// 输出结果
FOR i := 0 TO 5 DO
coeff[i] := solution[i];
END_FOR;
END_FUNCTION
6.2 运动曲线生成
结合编码器信号的实时处理:
stl复制// 在OB35中执行
IF "飞剪使能" THEN
// 获取材料位置
"当前材料位置" := "编码器输入"."实际位置";
// 计算相位
"当前相位" := ("当前材料位置" - "上一切割位置") / "切割长度";
// 生成运动曲线
IF "当前相位" < "同步区间比例" THEN
// 同步阶段
"归一化时间" := "当前相位" / "同步区间比例";
"FB_Poly5"(
t := "归一化时间",
a := "同步阶段系数",
pos => "刀轴命令位置",
vel => "刀轴命令速度",
acc => "刀轴命令加速度");
ELSE
// 返回阶段
"归一化时间" := ("当前相位" - "同步区间比例") / (1 - "同步区间比例");
"FB_Poly5"(
t := "归一化时间",
a := "返回阶段系数",
pos => "刀轴命令位置",
vel => "刀轴命令速度",
acc => "刀轴命令加速度");
END_IF;
// 触发切割判断
IF "当前相位" >= 1.0 THEN
"上一切割位置" := "当前材料位置";
"切割信号" := TRUE;
END_IF;
END_IF;
7. 实际应用效果
经过三个月的现场运行测试,这套系统表现出色:
- 在60m/min的材料速度下,切割精度稳定在±0.15mm
- 系统响应时间<2ms
- 连续8小时运行无累积误差
- 比采用1500T方案节省成本约40%
特别是在处理不同长度规格的切换时,只需修改配方参数即可立即适应,无需重新编程,这给操作人员带来了极大便利。
