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 等库来操作动子,而不必为每个动子写一套专用逻辑。
二、配置一个动子轴的关键步骤
在 TwinCAT 中新建一个 NC PTP 轴后,需要完成以下配置,动子才能被正确驱动:
- 轴类型与单位:在 Axis 配置中设定为“Continuous Axis”或“Finite Axis”,位置单位设为 mm,缩放因子按 XTS 反馈换算。
- 软限位:设置
Positive Limit与Negative Limit,例如轨道有效行程 0~2000 mm,则软限位可设为 10 mm 与 1990 mm,留出安全余量。 - 动态限制:设置
Maximum Velocity、Maximum Acceleration、Maximum Deceleration、Jerk。示例中取最大速度 2000 mm/s、加速度 5000 mm/s²、减速度 5000 mm/s²、Jerk 50000 mm/s³。 - 跟随误差监控:设置
Position Lag Monitoring,用于判断动子是否被卡住或反馈异常。 - 使能与参考:调用
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 时。
从图中可以看出,运动时间由加速段、匀速段、减速段拼接而成。如果目标距离很短,匀速段会消失,时间主要由加速和减速决定;如果目标距离很长,匀速段占主导,时间近似等于“距离 / 最大速度 + 加速时间 + 减速时间”。
五、一个可复现的测量示例
为了便于教学,下面给出一个示例场景。假设动子从 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。这个差值本身很有价值:它反映了轴的实际动态响应和稳定时间,是后续节拍优化需要压缩的对象。
六、测量时的注意事项
- 多次测量取平均:单次测量可能受系统抖动影响,建议连续触发 10 次,去掉异常值后取平均。
- 区分“到达”与“稳定”:如果只看位置到达,时间会偏短;用
Done或“位置误差进入窗口并保持”作为终点更贴近实际节拍。 - 记录参数:每次测量都应记录速度、加速度、Jerk、目标位置,否则数据无法比较。
- 避免同时触发多个动子:本节测的是单动子时间,多动子同时运动会引入资源竞争和轨道耦合,应分开测量。