MOTION CONTROL

TwinCAT 3 电子凸轮完全指南:凸轮表设计 · 五种插补方式 · MC_CamIn 工程实战

MC_CamIn 电子凸轮 五种插补 运动控制 2026-01-18 · 尚工

一、什么是电子凸轮

机械凸轮通过固定的物理形状将主轴旋转转换为从轴位移,一旦加工成型就无法更改。电子凸轮(Electronic Cam)则将这种映射关系存入凸轮表(Cam Table),在 TwinCAT 3 的 NC 系统中由软件实时计算从轴位置,可随时在线修改,无需停机换型。

核心公式很简单:SlavePosition = f(MasterPosition),凸轮表就是这个函数 f 的离散采样点集合。

应用场景:印刷套准、横封切断、PVD 设备基板往复运动、卷绕张力控制、包装机出料同步。

二、凸轮表数据结构

TwinCAT 3 的凸轮表由一系列 (主轴位置, 从轴位置, 插补类型) 三元组构成:

// 凸轮表条目结构(简化)
TYPE ST_CamPoint :
STRUCT
    fMasterPos  : LREAL;   // 主轴位置(单位:mm 或 deg)
    fSlavePos   : LREAL;   // 对应从轴位置
    nInterpType : INT;     // 插补类型 0-4
END_STRUCT
END_TYPE

三、五种插补方式深度对比

1. Linear(线性,类型 0)

相邻两点之间直线连接。速度曲线为阶跃,加速度在节点处不连续,会产生冲击。适用于:对平滑性要求不高的慢速场合。

2. Cubic(三次多项式,类型 1)

每段用三次多项式拟合,保证速度连续但加速度在节点处可能不连续。适用于:中速场合,比线性平滑但计算量小。

3. BSpline(B 样条,类型 2)

全局平滑,位移/速度/加速度均连续,是多数工业场合的首选。不经过控制点(逼近而非插值),对抗扰动能力强。PVD 往复运动推荐使用此方式。

4. Akima(Akima 样条,类型 3)

局部插值方法,经过所有控制点且对个别异常点不敏感。适用于凸轮表由实测数据(传感器采样)生成的场合。

5. Hermite(Hermite 样条,类型 4)

需要同时指定每点的导数值(斜率),控制自由度最高,可精确控制每点处的速度。适用于需要严格匹配端点速度的场合(如与其他轴的速度对接)。

选型建议:默认选 BSpline(类型2);若凸轮表来自实测数据选 Akima(类型3);需要控制端点速度选 Hermite(类型4)。

四、MC_CamIn 完整状态机实现

// 完整凸轮控制状态机
VAR
    fbCamTableSel : MC_CamTableSelect;
    fbCamIn       : MC_CamIn;
    fbCamOut      : MC_CamOut;
    eMasterAxis   : AXIS_REF;
    eSlaveAxis    : AXIS_REF;
    nState        : INT := 0;
    bStartCam     : BOOL;
    bStopCam      : BOOL;
END_VAR

CASE nState OF
0: // Idle - 等待启动命令
    IF bStartCam THEN
        bStartCam := FALSE;
        nState := 10;
    END_IF

10: // 加载凸轮表
    fbCamTableSel(
        Master    := eMasterAxis,
        Slave     := eSlaveAxis,
        CamTable  := CamTable_PVD,  // 预定义凸轮表
        Periodic  := TRUE,
        Execute   := TRUE
    );
    IF fbCamTableSel.Done     THEN nState := 20; END_IF
    IF fbCamTableSel.Error    THEN nState := 99; END_IF

20: // 激活凸轮跟随
    fbCamTableSel.Execute := FALSE;
    fbCamIn(
        Master        := eMasterAxis,
        Slave         := eSlaveAxis,
        MasterOffset  := 0,
        SlaveOffset   := 0,
        StartMode     := AXIS_START_MODE.ABSOLUTE,
        Execute       := TRUE
    );
    IF fbCamIn.InSync THEN nState := 30; END_IF
    IF fbCamIn.Error  THEN nState := 99; END_IF

30: // 凸轮运行中 - 等待停止命令
    fbCamIn.Execute := FALSE;
    IF bStopCam THEN
        bStopCam := FALSE;
        nState := 40;
    END_IF

40: // 脱离凸轮
    fbCamOut(Slave := eSlaveAxis, Execute := TRUE);
    IF fbCamOut.Done  THEN nState := 0;  END_IF
    IF fbCamOut.Error THEN nState := 99; END_IF

99: // Error Stop
    fbCamTableSel.Execute := FALSE;
    fbCamIn.Execute       := FALSE;
END_CASE

五、CSV 凸轮表生成工具

TwinCAT 3 支持从 CSV 文件动态加载凸轮表,格式为 主轴位置,从轴位置,插补类型。可用 Python 或 Excel 自动生成,尤其适合将机械设计数据直接转换为控制参数:

# Python 生成正弦凸轮表示例
import numpy as np
master = np.linspace(0, 360, 180)
slave  = 50 * np.sin(np.radians(master))
with open('cam_pvd.csv', 'w') as f:
    for m, s in zip(master, slave):
        f.write(f"{m:.3f},{s:.3f},2\n")  # 类型2=BSpline

完整源码已上传至 github.com/tc3-engineer,含 TwinCAT 3 工程 + CSV 生成脚本 + PVD 设备案例。