机械凸轮通过固定的物理形状将主轴旋转转换为从轴位移,一旦加工成型就无法更改。电子凸轮(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
相邻两点之间直线连接。速度曲线为阶跃,加速度在节点处不连续,会产生冲击。适用于:对平滑性要求不高的慢速场合。
每段用三次多项式拟合,保证速度连续但加速度在节点处可能不连续。适用于:中速场合,比线性平滑但计算量小。
全局平滑,位移/速度/加速度均连续,是多数工业场合的首选。不经过控制点(逼近而非插值),对抗扰动能力强。PVD 往复运动推荐使用此方式。
局部插值方法,经过所有控制点且对个别异常点不敏感。适用于凸轮表由实测数据(传感器采样)生成的场合。
需要同时指定每点的导数值(斜率),控制自由度最高,可精确控制每点处的速度。适用于需要严格匹配端点速度的场合(如与其他轴的速度对接)。
⚡ 选型建议:默认选 BSpline(类型2);若凸轮表来自实测数据选 Akima(类型3);需要控制端点速度选 Hermite(类型4)。
// 完整凸轮控制状态机 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
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 设备案例。