2. 数控系统基础

数控系统(CNC,Computer Numerical Control)是开放式运动控制开发的基石。无论你使用LinuxCNC、EtherCAT主站还是自研脉冲卡,都必须首先建立对CNC工作原理、插补机制以及轴、坐标、进给率、主轴等核心术语的准确理解。本章将从运动控制工程师的视角,拆解CNC从“零件程序”到“电机转动”的完整信号链,并重点辨析插补的数学本质与工程实现之间的差异。

CNC 运动控制信号链与插补原理 零件程序 G01 X100 Y50 F300 M03 S1200 CNC 内核 译码 → 刀具补偿 → 速度规划 → 插补器 插补点序列 ΔX, ΔY, ΔZ 周期 1ms 伺服驱动 位置环/速度环 电机 → 机械执行 插补核心概念 起点 (0,0) 终点 (X,Y) 插补点(周期采样) 圆弧起点 圆弧终点 圆弧插补(G02/G03) 轴:X/Y/Z 直线轴,A/B/C 旋转轴 进给率:F 值,mm/min 或 mm/rev 主轴:S 值,rpm 转速

2.1 CNC 工作原理:从代码到运动的完整信号链

核心原理:解释器与运动控制器的分层协作

CNC系统的本质是一个实时解释执行器。它读取符合ISO 6983(G代码)标准的文本程序,将其逐行翻译为内部数据结构,再经过刀具半径补偿、速度规划、插补计算,最终输出位置指令给伺服驱动器。在LinuxCNC中,这一过程被明确划分为两个任务层:非实时任务(用户界面、G代码解析、MDI命令)和实时任务(伺服周期内的插补与位置指令生成)。理解这一分层是进行开放式开发的前提——任何需要修改插补算法的操作都必须进入实时线程。

操作流程:CNC启动与执行的五个阶段

  1. 程序载入与语法检查:系统逐行读取G代码,检查非法指令、缺失参数、超范围坐标值。LinuxCNC中可通过linuxcnc -v验证程序文件。
  2. 译码与预处理:将G代码转换为内部规范结构,包括模态代码(如G01/G02的切换)、非模态代码(如G04暂停)、辅助功能(M代码)。此阶段同时完成刀具长度补偿和半径补偿的预计算。
  3. 速度规划:根据进给率F值、加减速参数(加速度、加加速度)以及路径拐角,生成速度-时间曲线。LinuxCNC的tp模块(轨迹规划器)负责此任务。
  4. 插补计算:在每个伺服周期(通常1ms)内,计算当前时刻各轴的目标位置增量。这是CNC最核心的实时计算。
  5. 伺服输出:将插补结果通过总线(如EtherCAT、Step/Dir)发送至驱动器,驱动器完成电流环、速度环、位置环的闭环控制。
工程要点:在LinuxCNC中,BASE_PERIOD(伺服周期)和SERVO_PERIOD(插补周期)是两个独立参数。默认情况下,插补周期是伺服周期的整数倍。开发自定义运动控制算法时,必须确保算法执行时间小于插补周期,否则会导致实时性超时(RTCPU报警)。

案例拆解:直线插补的实时计算过程

假设执行指令G01 X100 Y50 F300,当前刀具位于(0,0)。系统计算过程如下:

  • 路径长度:L = √(100² + 50²) = 111.8 mm
  • 总时间:T = L / F = 111.8 / (300/60) = 22.36 秒(F单位mm/min需换算为mm/s)
  • 插补周期:若插补周期为1ms,则总插补点数N = 22360
  • 每周期增量:ΔX = 100/22360 ≈ 0.00447 mm,ΔY = 50/22360 ≈ 0.00224 mm

实际系统中,速度规划会先加速到F值,再匀速,最后减速停止,因此各周期的增量并非恒定。LinuxCNC的tp模块会生成梯形或S形速度曲线,插补器根据当前速度计算增量。

常见误区:初学者常误以为插补就是简单的“直线段细分”。实际上,插补必须考虑加减速、轮廓误差、伺服滞后补偿。例如,在高速加工中,若忽略加加速度限制,会导致机床振动和轮廓超差。LinuxCNC的EMCMOT模块提供了max_acceleration和max_jerk参数,必须根据机床机械特性合理设置。

2.2 插补概念:直线、圆弧与样条的本质区别

核心原理:插补的数学本质

插补(Interpolation)是在已知路径起点和终点(或圆弧圆心、半径)的前提下,按照一定的时间间隔,计算出中间点的坐标值。其数学本质是参数曲线的离散化采样。对于直线,参数方程为:

P(t) = P0 + t * (P1 - P0),  t ∈ [0, 1]

对于圆弧,参数方程为:

P(θ) = C + R * (cosθ, sinθ),  θ ∈ [θ_start, θ_end]

插补算法的核心任务是在每个采样周期内,根据当前参数值(t或θ)计算出坐标增量,并保证轮廓误差在允许范围内。

判断方法:如何选择插补类型

插补类型 G代码 适用场景 轮廓误差控制 计算复杂度
直线插补 G01 铣削直线轮廓、钻孔定位 误差仅由伺服跟踪滞后引起 低(乘法+加法)
圆弧插补 G02/G03 圆孔、倒角、圆弧槽 需考虑半径补偿和圆心偏移 中(三角函数或DDA)
样条插补 G05/G06 复杂曲面、模具加工 需高阶连续,避免速度突变 高(NURBS求值)

实战场景:圆弧插补的I、J、K编程陷阱

在LinuxCNC中,圆弧插补支持两种编程方式:圆心增量坐标(I、J、K)和半径R。使用I、J、K时,必须注意:

G17 G02 X100 Y50 I50 J0 F200
; 从当前点(50,50)到(100,50),圆心相对起点偏移(50,0)

常见错误:I、J、K是相对值,而非坐标。若误写为坐标,会导致圆心位置错误,系统报错“圆弧半径不匹配”。另外,当使用R编程时,R值必须大于起点到终点距离的一半,否则无法构成圆弧。

经验提醒:在LinuxCNC中,可通过halcmd getp motion.0.axis.0.joint-pos-cmd实时查看插补输出位置。调试圆弧插补时,建议先用低速(F50)空跑,观察实际轨迹与理论轨迹的偏差。若发现圆弧不圆,优先检查机械间隙补偿(backlash)和伺服增益是否匹配。

2.3 运动控制基本术语:轴、坐标、进给率、主轴

核心原理:术语的工程定义

在运动控制系统中,术语的精确理解直接影响参数配置和故障排查。以下是四个核心术语的工程定义:

  • 轴(Axis):一个独立的运动自由度。直线轴(X、Y、Z)沿笛卡尔坐标方向移动,旋转轴(A、B、C)绕相应直线轴旋转。在LinuxCNC中,轴(Axis)与关节(Joint)是两个概念:轴是逻辑坐标空间,关节是物理电机位置。对于非正交机床(如五轴摆头),需要运动学变换。
  • 坐标(Coordinate):描述刀具或工件位置的值。包括机床坐标系(Machine)、工件坐标系(G54-G59)、局部坐标系(G52)。坐标系的偏移量通过G10 L2 P1 X... Y...设置。
  • 进给率(Feed Rate):刀具相对于工件的移动速度。单位通常为mm/min(G94)或mm/rev(G95)。进给率直接影响表面质量和刀具寿命。
  • 主轴(Spindle):驱动刀具旋转的电机。主轴转速(S值)单位为rpm,方向由M03(正转)、M04(反转)控制。主轴倍率(Override)可在操作面板上实时调整。

操作流程:坐标系设置与验证

  1. 回零操作:执行G28或G30回到机床原点,建立机床坐标系。
  2. 设定工件坐标系:使用对刀仪或手动对刀,将刀具移动到工件原点,执行G10 L2 P1 X0 Y0 Z0将当前位置设为G54原点。
  3. 验证坐标:在MDI模式下输入G54 G00 X0 Y0 Z0,观察刀具是否移动到预期位置。
  4. 进给率验证:执行G01 X100 F100,用秒表测量实际移动时间,应约为60秒(100mm / 100mm/min = 1min)。

案例拆解:主轴与进给率的匹配优化

某铝合金零件铣削,初始参数为:主轴转速S=6000rpm,进给率F=300mm/min,使用2刃硬质合金铣刀(直径10mm)。加工后发现表面粗糙度Ra=3.2μm,超出要求(Ra≤1.6μm)。分析过程:

  • 计算每刃进给量:fz = F / (S × Z) = 300 / (6000 × 2) = 0.025 mm/刃
  • 参考推荐值:铝合金精铣推荐fz=0.05-0.10 mm/刃
  • 调整方案:将F提升至600mm/min,fz=0.05mm/刃,同时将S提升至8000rpm以保持切削线速度(Vc=π×D×S/1000=251m/min,在推荐范围150-300m/min内)
  • 结果:Ra降至1.2μm,且加工时间缩短50%
风险提示:盲目提高进给率可能导致刀具负载过大、断刀或工件移位。在调整F值前,务必确认主轴功率余量、夹具刚性以及冷却液供应。LinuxCNC中可通过motion.spindle-speed-in和motion.feed-hold信号实时监控状态。

2.4 常见误区与总结复盘

误区一:混淆轴与关节

在LinuxCNC中,joint是物理电机位置,axis是逻辑坐标。对于三轴龙门铣,X轴可能由两个电机同步驱动(双驱),此时两个关节映射到一个轴。若直接修改关节坐标,会破坏运动学模型,导致机械损坏。

误区二:忽略加减速对插补的影响

插补器输出的位置指令是理想轨迹,但伺服系统存在跟踪滞后。若加减速设置过大,实际轨迹会偏离理论轨迹,产生“过切”或“欠切”。建议使用LinuxCNC的halscope观察实际位置与指令位置的偏差。

误区三:主轴转速与进给率不匹配

许多初学者只关注F值,忽略S值。实际上,每刃进给量fz才是决定切削负载的关键参数。fz过小会导致刀具磨损集中在刃口局部,fz过大会导致崩刃。

总结复盘:本章核心知识结构

模块 关键知识点 工程应用要点
CNC工作原理 译码→速度规划→插补→伺服 实时与非实时任务分离
插补概念 直线/圆弧/样条的数学本质 I、J、K相对坐标,R值约束
轴与坐标 Axis vs Joint,G54-G59 运动学变换,坐标系验证
进给率与主轴 F值单位,S值转速,fz计算 切削参数匹配,表面质量优化

本章内容为后续的LinuxCNC配置、实时控制开发以及运动学算法设计奠定了术语和原理基础。在下一阶段,我们将深入探讨LinuxCNC的硬件抽象层(HAL)架构,理解如何将本章的插补输出映射到具体的电机驱动信号上。