插补定义:根据给定轮廓参数(直线起点/终点、圆弧圆心/半径),在起点和终点间实时计算中间点坐标,用微小位移增量拟合目标轨迹的过程。
核心分类:
脉冲增量插补:逐点计算,每步输出1个脉冲(脉冲当量δ),适用于步进电机,代表算法:逐点比较法、DDA法。
数据采样插补:按固定采样周期计算位移增量,适用于伺服电机,代表算法:时间分割法。
逐点比较法核心流程:偏差判别 → 坐标进给 → 偏差递推 → 终点判别(循环至终点)。
脉冲当量δ:1个脉冲对应的执行机构位移(如δ=0.01mm/脉冲),δ越小精度越高,步数越多。
前提:起点平移至原点,Xₑ=xₑ-x₀,Yₑ=yₑ-y₀,δ=1
偏差函数:Fᵢ = xᵢYₑ - yᵢXₑ
判别规则:Fᵢ≥0 → +X进给;Fᵢ<0 → +Y进给
偏差递推:
+X进给:Fᵢ₊₁ = Fᵢ + Yₑ
+Y进给:Fᵢ₊₁ = Fᵢ - Xₑ
总步数:N = |Xₑ| + |Yₑ|
总步数N=5,初始F₀=0,插补过程:
| 步数 | Fᵢ | 进给方向 | Fᵢ₊₁ | 剩余步数 |
|---|---|---|---|---|
| 0 | 0 | +X | 2 | 4 |
| 1 | 2 | +X | 4 | 3 |
| 2 | 4 | +X | 6 | 2 |
| 3 | 6 | +Y | 3 | 1 |
| 4 | 3 | +Y | 0 | 0 |
前提:圆心在原点,半径R=√(x₀²+y₀²),δ=1
偏差函数:Fᵢ = xᵢ² + yᵢ² - R²
判别规则:Fᵢ≥0 → -X进给;Fᵢ<0 → +Y进给
偏差递推:
-X进给:Fᵢ₊₁ = Fᵢ - 2xᵢ + 1
+Y进给:Fᵢ₊₁ = Fᵢ + 2yᵢ + 1
总步数:N = |xₑ-x₀| + |yₑ-y₀|
| 步数 | Fᵢ | 进给方向 | Fᵢ₊₁ | 坐标(x,y) | 剩余步数 |
|---|---|---|---|---|---|
| 0 | 0 | -X | -7 | (3,0) | 7 |
| 1 | -7 | +Y | -6 | (3,1) | 6 |
| 2 | -6 | +Y | -3 | (3,2) | 5 |
| 3 | -3 | +Y | 2 | (3,3) | 4 |
| 4 | 2 | -X | -3 | (2,3) | 3 |
| 5 | -3 | +Y | 4 | (2,4) | 2 |
| 6 | 4 | -X | 1 | (1,4) | 1 |
| 7 | 1 | -X | 0 | (0,4) | 0 |
核心:非第一象限取|x'|、|y'|按第一象限计算,再映射实际进给方向(x'=x-x_c,y'=y-y_c,圆心平移至原点)。
| 象限 | 坐标符号(x',y') | 等效进给方向 | 实际进给方向 | 偏差递推公式 |
|---|---|---|---|---|
| Ⅰ | (+,+) | -X/+Y | -X/+Y | Fᵢ₊₁=Fᵢ-2|x'|+1(-X等效) Fᵢ₊₁=Fᵢ+2|y'|+1(+Y等效) |
| Ⅱ | (-,+) | -X/+Y | +X/+Y | |
| Ⅲ | (-,-) | -X/+Y | +X/-Y | |
| Ⅳ | (+,-) | -X/+Y | -X/-Y |
| 象限 | 坐标符号(x',y') | 等效进给方向 | 实际进给方向 | 偏差递推公式 |
|---|---|---|---|---|
| Ⅰ | (+,+) | -Y/+X | -Y/+X | Fᵢ₊₁=Fᵢ-2|y'|+1(-Y等效) Fᵢ₊₁=Fᵢ+2|x'|+1(+X等效) |
| Ⅱ | (-,+) | -Y/+X | -Y/-X | |
| Ⅲ | (-,-) | -Y/+X | +Y/-X | |
| Ⅳ | (+,-) | -Y/+X | +Y/+X |
| 变量名 | 数据类型 | 说明 |
|---|---|---|
| X_Current | Int | 当前X坐标 |
| Y_Current | Int | 当前Y坐标 |
| F | Int | 偏差值 |
| N_Total | Int | 总步数 |
| N_Remain | Int | 剩余步数 |
| X_Pulse | Bool | X轴脉冲输出(Q0.0) |
| Y_Pulse | Bool | Y轴脉冲输出(Q0.1) |
// 初始化程序(OB100:启动组织块)DB1.X_Current := 4; // 起点X坐标DB1.Y_Current := 0; // 起点Y坐标DB1.F := 0; // 初始偏差值DB1.N_Total := 8; // 总步数:|0-4|+|4-0|=8DB1.N_Remain := DB1.N_Total; // 剩余步数初始化DB1.X_Pulse := FALSE; DB1.Y_Pulse := FALSE;// 插补主循环(OB1:循环组织块)IF DB1.N_Remain > 0 THENIF DB1.F >= 0 THEN// F≥0,-X方向进给DB1.X_Pulse := TRUE; // 输出X轴脉冲// 偏差递推:F = F - 2*X + 1DB1.F := DB1.F - 2*DB1.X_Current + 1; DB1.X_Current := DB1.X_Current - 1;// X坐标减1// 脉冲复位(实际需加延时,此处简化)DB1.X_Pulse := FALSE;ELSE// F<0,+Y方向进给DB1.Y_Pulse := TRUE; // 输出Y轴脉冲// 偏差递推:F = F + 2*Y + 1DB1.F := DB1.F + 2*DB1.Y_Current + 1; DB1.Y_Current := DB1.Y_Current + 1;// Y坐标加1// 脉冲复位DB1.Y_Pulse := FALSE;END_IFDB1.N_Remain := DB1.N_Remain - 1; // 剩余步数减1ELSE// 插补完成,复位输出DB1.X_Pulse := FALSE; DB1.Y_Pulse := FALSE;END_IF
实际项目中需为脉冲输出增加1-10ms延时(如使用TON定时器),确保电机识别脉冲;
全象限扩展:增加象限判断逻辑,对X/Y坐标取绝对值计算,再按映射表输出脉冲方向;
可通过PROFINET/EtherCAT总线连接伺服驱动器,替换硬接线脉冲输出。
| 软元件 | 说明 |
|---|---|
| D0 | 当前X坐标 |
| D1 | 当前Y坐标 |
| D2 | 偏差值F |
| D3 | 剩余步数 |
| Y0 | X轴脉冲输出 |
| Y1 | Y轴脉冲输出 |
| M0 | 插补启动标志 |
| T0 | 脉冲延时定时器(10ms) |
// 初始化程序(M8002:上电初始化)LD M8002 MOV K4 D0 // D0=4(起点X)MOV K0 D1 // D1=0(起点Y)MOV K0 D2 // D2=0(初始偏差)MOV K8 D3 // D3=8(总步数)SET M0 // M0=1,启动插补// 插补主循环LD M0 LDD>= D2 K0 // 判断F≥0AND> D3 K0 // 剩余步数>0OUT Y0 // Y0输出(X轴脉冲)OUT T0 K1 // T0延时10msLD T0 RST Y0 // 复位Y0// 偏差递推:F = F - 2*X + 1MUL K2 D0 D10 SUB D2 D10 D2 ADD D2 K1 D2// X坐标减1DEC D0// 剩余步数减1DEC D3// F<0时的处理LD M0 LDD< D2 K0 // 判断F<0AND> D3 K0 OUT Y1 // Y1输出(Y轴脉冲)OUT T0 K1 // T0延时10msLD T0 RST Y1 // 复位Y1// 偏差递推:F = F + 2*Y + 1MUL K2 D1 D11 ADD D2 D11 D2 ADD D2 K1 D2// Y坐标加1INC D1// 剩余步数减1DEC D3// 插补完成复位LD M0 LDD<= D3 K0 // 剩余步数≤0RST M0 // 停止插补RST Y0 RST Y1
三菱FX系列无ST语言,常用梯形图/指令表编程,上述为指令表格式,可直接导入GX Works2;
T0定时器用于脉冲延时(10ms),匹配电机的脉冲响应时间;
全象限扩展:增加MOVN(取反)、ABS(绝对值)指令处理坐标符号,按映射表切换Y0/Y1的输出方向(如Y2控制X轴方向,Y3控制Y轴方向);
可使用FX3U-1PG限制发布模块替代硬接线脉冲输出,提升插补精度。