2. 数控系统基础
数控系统(CNC,Computer Numerical Control)是开放式运动控制开发的基石。无论你使用LinuxCNC、EtherCAT主站还是自研脉冲卡,都必须首先建立对CNC工作原理、插补机制以及轴、坐标、进给率、主轴等核心术语的准确理解。本章将从运动控制工程师的视角,拆解CNC从“零件程序”到“电机转动”的完整信号链,并重点辨析插补的数学本质与工程实现之间的差异。
2.1 CNC 工作原理:从代码到运动的完整信号链
核心原理:解释器与运动控制器的分层协作
CNC系统的本质是一个实时解释执行器。它读取符合ISO 6983(G代码)标准的文本程序,将其逐行翻译为内部数据结构,再经过刀具半径补偿、速度规划、插补计算,最终输出位置指令给伺服驱动器。在LinuxCNC中,这一过程被明确划分为两个任务层:非实时任务(用户界面、G代码解析、MDI命令)和实时任务(伺服周期内的插补与位置指令生成)。理解这一分层是进行开放式开发的前提——任何需要修改插补算法的操作都必须进入实时线程。
操作流程:CNC启动与执行的五个阶段
- 程序载入与语法检查:系统逐行读取G代码,检查非法指令、缺失参数、超范围坐标值。LinuxCNC中可通过
linuxcnc -v验证程序文件。 - 译码与预处理:将G代码转换为内部规范结构,包括模态代码(如G01/G02的切换)、非模态代码(如G04暂停)、辅助功能(M代码)。此阶段同时完成刀具长度补偿和半径补偿的预计算。
- 速度规划:根据进给率F值、加减速参数(加速度、加加速度)以及路径拐角,生成速度-时间曲线。LinuxCNC的
tp模块(轨迹规划器)负责此任务。 - 插补计算:在每个伺服周期(通常1ms)内,计算当前时刻各轴的目标位置增量。这是CNC最核心的实时计算。
- 伺服输出:将插补结果通过总线(如EtherCAT、Step/Dir)发送至驱动器,驱动器完成电流环、速度环、位置环的闭环控制。
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形速度曲线,插补器根据当前速度计算增量。
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值必须大于起点到终点距离的一半,否则无法构成圆弧。
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)可在操作面板上实时调整。
操作流程:坐标系设置与验证
- 回零操作:执行
G28或G30回到机床原点,建立机床坐标系。 - 设定工件坐标系:使用对刀仪或手动对刀,将刀具移动到工件原点,执行
G10 L2 P1 X0 Y0 Z0将当前位置设为G54原点。 - 验证坐标:在MDI模式下输入
G54 G00 X0 Y0 Z0,观察刀具是否移动到预期位置。 - 进给率验证:执行
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%
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)架构,理解如何将本章的插补输出映射到具体的电机驱动信号上。