4. 基于TwinCAT NC PTP的动子运动控制

XTS 的动子(Mover)在系统里并不是一个“自带轨迹”的智能体,它最终要落到 TwinCAT 的运动控制轴上。TwinCAT 提供两套典型的轴模型:一套是 NC PTP(Point-To-Point,点到点)轴,另一套是 NC I(插补)轴。本节聚焦 NC PTP:把每个动子映射为一个独立的 NC 轴,用最基础的点到点指令让它动起来,并测量单动子的运动时间。这是理解 XTS 动态路径与节拍优化的起点——只有先掌握单动子的时间构成,后续多动子协同、路径优化才有可比较的基准。

一、NC PTP 轴与 XTS 动子的映射关系

在 XTS 中,动子沿轨道运动,其位置通常以“轨道位置”表达,单位可以是毫米或编码器增量。TwinCAT NC PTP 轴则是一个带位置环、速度环、加减速斜坡的伺服轴模型。把两者对接,需要明确几个关键量:

  • 轴类型:NC PTP 轴,位置单位与 XTS 轨道位置单位一致(示例中取 mm)。
  • 编码器/反馈:XTS 的动子位置由系统反馈,NC 轴通过驱动接口读取实际位置。
  • 软限位:按轨道有效行程设置,防止动子撞到端部或进入不可用区。
  • 动态参数:最大速度、加速度、减速度、加加速度(Jerk),这些直接决定单动子运动时间。

一个常见的做法是:每个动子对应一个 NC 轴,轴号与动子编号一一对应。例如动子 1 → Axis 1,动子 2 → Axis 2。这样在 PLC 里就可以用标准的 MC_Power、MC_MoveAbsolute、MC_MoveRelative、MC_Reset 等库来操作动子,而不必为每个动子写一套专用逻辑。

如果 XTS 系统已经通过 TwinCAT 的 XTS 功能库或 Tc3 XTS 组件接管了动子,那么 NC 轴可能由系统内部创建和管理。本节为了讲清原理,采用“手动映射为 NC PTP 轴”的简化模型,便于观察单动子的时间构成。

二、配置一个动子轴的关键步骤

在 TwinCAT 中新建一个 NC PTP 轴后,需要完成以下配置,动子才能被正确驱动:

  1. 轴类型与单位:在 Axis 配置中设定为“Continuous Axis”或“Finite Axis”,位置单位设为 mm,缩放因子按 XTS 反馈换算。
  2. 软限位:设置 Positive Limit 与 Negative Limit,例如轨道有效行程 0~2000 mm,则软限位可设为 10 mm 与 1990 mm,留出安全余量。
  3. 动态限制:设置 Maximum Velocity、Maximum Acceleration、Maximum Deceleration、Jerk。示例中取最大速度 2000 mm/s、加速度 5000 mm/s²、减速度 5000 mm/s²、Jerk 50000 mm/s³。
  4. 跟随误差监控:设置 Position Lag Monitoring,用于判断动子是否被卡住或反馈异常。
  5. 使能与参考:调用 MC_Power 使能轴,必要时执行 MC_Home 或直接以当前位置为参考。

这些参数不是随便填的。最大速度决定了动子能跑多快,加速度和 Jerk 决定了它从静止到最大速度需要多长时间。单动子运动时间,本质上就是“加速段 + 匀速段 + 减速段”的积分结果。

三、点到点运动程序的基本结构

下面给出一个简化的 PLC 程序片段,用于让动子从当前位置运动到目标位置。这里使用结构化文本(ST)表达,假设轴已使能并处于可运动状态。

// 动子轴点到点运动示例
// Axis1 对应动子 1,目标位置 800 mm
MoveAbs(
    Axis        := Axis1,
    Execute     := bStartMove,
    Position    := 800.0,
    Velocity    := 1500.0,
    Acceleration:= 5000.0,
    Deceleration:= 5000.0,
    Jerk        := 50000.0,
    Direction   := MC_DIRECTION.shortest,
    Options     := [MC_OPTION.absolute],
    Done        => bMoveDone,
    Busy        => bMoveBusy,
    Error       => bMoveError,
    ErrorID     => nMoveErrorID
);

// 记录运动开始与结束时间
IF bStartMove AND NOT bStartMoveOld THEN
    tStart := F_GetSystemTime();
END_IF

IF bMoveDone THEN
    tEnd := F_GetSystemTime();
    tMove := tEnd - tStart;
END_IF

这段程序的关键点有三个:第一,Execute 上升沿触发一次运动;第二,Done 为 TRUE 表示轴已到达目标位置并稳定;第三,用系统时间戳记录从触发到 Done 的间隔,就是单动子的运动时间。注意,Done 的判定通常包含“位置到达 + 速度接近零”的条件,因此它比“位置刚到达”更严格,也更接近实际节拍中可用的时间点。

四、单动子运动时间的构成与测量

单动子运动时间并不是一个固定值,它由运动距离、速度、加速度、Jerk 共同决定。以梯形速度曲线为例,若距离足够长,时间由三段组成:加速段、匀速段、减速段。若距离较短,可能没有匀速段,甚至只有加速和减速两段,形成三角形速度曲线。

下面这张图展示了 NC PTP 轴从触发到完成的时间链,以及各段与参数的关系。图中同时标出了测量点:tStart 在 Execute 上升沿,tEnd 在 Done 为 TRUE 时。

NC PTP 单动子点到点运动时间链 t Execute 上升沿 tStart 加速段 a = 5000 mm/s² 匀速段 v = 1500 mm/s 减速段 d = 5000 mm/s² Done = TRUE tEnd 单动子运动时间 tMove = tEnd − tStart 影响时间的参数 • 目标位置(距离) • 最大速度 v_max • 加速度 / 减速度 测量与判断 • tStart:Execute 上升沿 • tEnd:Done = TRUE • 多次测量取平均

从图中可以看出,运动时间由加速段、匀速段、减速段拼接而成。如果目标距离很短,匀速段会消失,时间主要由加速和减速决定;如果目标距离很长,匀速段占主导,时间近似等于“距离 / 最大速度 + 加速时间 + 减速时间”。

五、一个可复现的测量示例

为了便于教学,下面给出一个示例场景。假设动子从 0 mm 运动到 800 mm,参数为:最大速度 1500 mm/s,加速度 5000 mm/s²,减速度 5000 mm/s²,Jerk 足够大(近似梯形曲线)。

先计算加速时间:t_acc = v_max / a = 1500 / 5000 = 0.3 s。加速段位移:s_acc = 0.5 × a × t_acc² = 0.5 × 5000 × 0.09 = 225 mm。减速段对称,位移也是 225 mm,时间 0.3 s。剩余匀速段位移:800 − 225 − 225 = 350 mm,匀速时间 t_const = 350 / 1500 ≈ 0.233 s。因此理论运动时间约为 0.3 + 0.233 + 0.3 ≈ 0.833 s。

实际测量时,由于 Jerk 限制、位置环稳定时间、Done 判定条件等因素,测得时间通常会略大于理论值。例如可能得到 0.86~0.90 s。这个差值本身很有价值:它反映了轴的实际动态响应和稳定时间,是后续节拍优化需要压缩的对象。

上述数值为教学示例,并非在真实设备上实测得到。实际项目中应以现场测量为准,并注意不同 XTS 配置、负载、轨道摩擦和驱动参数都会影响结果。

六、测量时的注意事项

  • 多次测量取平均:单次测量可能受系统抖动影响,建议连续触发 10 次,去掉异常值后取平均。
  • 区分“到达”与“稳定”:如果只看位置到达,时间会偏短;用 Done 或“位置误差进入窗口并保持”作为终点更贴近实际节拍。
  • 记录参数:每次测量都应记录速度、加速度、Jerk、目标位置,否则数据无法比较。
  • 避免同时触发多个动子:本节测的是单动子时间,多动子同时运动会引入资源竞争和轨道耦合,应分开测量。