博派智能-运动控制技术-RTCP-五轴联动

1、原理

RTCP,在高档五轴数控系统里,认为RTCP即是Rotated Tool Center Point,也就是我们常说的刀尖点跟随功能。在五轴加工中,追求刀尖点轨迹及刀具与工件间的姿态时,由于回转运动,产生刀尖点的附加运动。数控系统控制点往往与刀尖点不重合,因此数控系统要自动修正控制点,以保证刀尖点按指令既定轨迹运动。业内也有将此技术称为TCPM、TCPC或者RPCP等功能。其实这些称呼的功能定义都与RTCP类似,严格意义上来说,RTCP功能是用在双摆头结构上,是应用摆头旋转中心点来进行补偿。而类似于RPCP功能主要是应用在双转台形式的机床上,补偿的是由于工件旋转所造成的的直线轴坐标的变化。其实这些功能殊途同归,都是为了保持刀具中心点和刀具与工件表面的实际接触点不变。所以为了表述方便,本文统一此类技术为RTCP技术。

如果运动控制卡没有该功能,旋转轴变化时,刀尖末端加工位置将跟随改变,整个上位机程序开发将变得异常困难。

本文已博派智能PMC系列以太网运动控制卡(具体型号位PMC_GAS_8)为例进行功能和代码说明。该控制卡支持RTCP功能,通过脉冲+方向接口控制机床电机运动,最高脉冲频率打2Mhz。该控制卡跟电脑上位机接口是以太网,普通网口即可,台式机,笔记本都可以。语言方面,支持VC++/C#/QT/Python/VC/Delphi/VB等等,支持Linux系统。

如果你的伺服/步进是EtherCAT总线接口,可以考虑PMC_ECAT_GA2_N, 这款是对应的总线型EtherCAT控制器,支持EtherCAT总线,并且支持RTCP功能。

2、5轴机床常见结构一览。

下图是双摆头

下图是双转台

下图是一转一摆

2、具体代码

这里以博派智能的ETH_GAS系列网口运动控制卡为例说明,该运动控制卡有2-16路步进/伺服控制接口,每路接口都有编码器/脉冲/方向/报警/使能等信号,支持自动回零/点位/直线/圆弧插补/PT运动等功能,支持高速硬件捕获、比较输出/飞拍、PSO。高端款PMC系列甚至支持RTCP五轴联动,Delta/Scara/6轴机器人算法。

RTCP五轴联动相关函数一览表

|--------------------|---------------|
| API | 说明 |
| MC_RobotSetPrm | 设置五轴机床参数 |
| MC_RobotSetForward | 设置五轴机床进入关节运动 |
| MC_RobotSetInverse | 设置五轴机床进入坐标系运动 |

参数详细说明:

|---------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| int MC_RobotSetPrm(unsigned short RobotID,unsigned long ulRobotType,short nJogAxisCount,short *pJogAxisList,short nVirAxisCount,short* pVirAxisList,void *RobotParm) ||
| RobotID | 机床ID,通常为1 |
| ulRobotType | 机床类型 50008为XYZ+AC双转台(双摇篮)结构(也适用于XYZ+单转台(单摇篮)) 50011为XYZ+AC双摆头结构(也适用于XYZ+单摆头) 50013为XYZ+A摆头C转台结构 |
| nJogAxisCount | 机床关节轴数量 |
| pJogAxisList | 机床关节轴轴号列表 |
| nVirAxisCount | 机床虚拟轴数量 |
| pVirAxisList | 机床虚拟轴轴号列表 |
| RobotParm | 机床参数,类型不同,参数结构体不同 //50008 //XYZAC双摇篮参数 typedef struct _XYZAC_PRRA{ double dCX; //C轴旋转中心X坐标,单位毫米 double dCY; //C轴旋转中心Y坐标,单位毫米 double dAY; //A轴旋转中心Y坐标,单位毫米 double dAZ; //A轴旋转中心Z坐标,单位毫米 long lPlusePerCircle5; //各轴每圈脉冲数量 double dPitch5; //各轴螺距,单位毫米 }XYZAC_PARM; //50011 //XYZTATC双摆头参数 typedef struct _XYZTATC_PRRA{ double dDX; //C在零度时,旋转关节中心相对Z轴的距离X,单位毫米 double dDY; //C在零度时,旋转关节中心相对Z轴的距离Y,单位毫米 double dR; //末端旋转半径,单位毫米 double dOrgAngleC; //回零完成后,C轴角度,单位度,范围0~360 long lPlusePerCircle5; //各轴每圈脉冲数量 double dPitch5; //各轴螺距,单位毫米 }XYZTATC_PARM; //50013 //XYZTAC一摆头一转台参数 typedef struct _XYZTAC_PRRA{ double dCX; //C轴旋转中心X坐标,单位mm double dCY; //C轴旋转中心Y坐标,单位mm double dR; //末端旋转半径,单位mm long lPlusePerCircle5; //各轴每圈脉冲数量 double dPitch5; //各轴螺距 }XYZTAC_PARM; |
| int MC_RobotSetForward(unsigned short nRobotID) ||
| nRobotID | 机床ID,通常为1,调用该函数后,可以进行关节运动 |
| int MC_RobotSetInverse(unsigned short nRobotID) ||
| nRobotID | 机床ID,通常为1,调用该函数后,可以进行坐标系XYZ运动 |

例程代码:

//关节轴轴号

short nJogAxisList5;

nJogAxisList0 = 1;

nJogAxisList1 = 2;

nJogAxisList2 = 3;

nJogAxisList3 = 4;

nJogAxisList4 = 5;

//坐标系轴号

short nVirAxisList5;

nVirAxisList0 = 11;

nVirAxisList1 = 12;

nVirAxisList2 = 13;

nVirAxisList3 = 14;

nVirAxisList4 = 15;

//声明五轴机床参数结构体变量,设置机床参数

XYZTATC_PARM m_XYZTATC_PARM;

m_XYZTATC_PARM.dDX = 0;

m_XYZTATC_PARM.dDY = 0;

m_XYZTATC_PARM.dOrgAngleC = 0;

m_XYZTATC_PARM.dPitch0 = 10;

m_XYZTATC_PARM.dPitch1 = 10;

m_XYZTATC_PARM.dPitch2 = 10;

m_XYZTATC_PARM.dPitch3 = 10;

m_XYZTATC_PARM.dPitch4 = 10;

//刀长

m_XYZTATC_PARM.dR = 100;

m_XYZTATC_PARM.lPlusePerCircle0 = 10000;

m_XYZTATC_PARM.lPlusePerCircle1 = 10000;

m_XYZTATC_PARM.lPlusePerCircle2 = 10000;

m_XYZTATC_PARM.lPlusePerCircle3 = 10000;

m_XYZTATC_PARM.lPlusePerCircle4 = 10000;

//下发机床参数

iRes = g_MultiCard.MC_RobotSetPrm(1,50011,5,&nJogAxisList0,5,&nVirAxisList0,&m_XYZTATC_PARM);

博派智能ETH_GAS系列8轴运动控制卡接线示意图(4轴和16轴篇幅限制没有放上来)

博派智能ETH_GAS系列4轴运动控制卡应用示意图(8轴和16轴篇幅限制没有放上来)

相关推荐
朝朝辞暮i9 分钟前
C++ 第 31C 课:Subscriber 到底是什么
开发语言·c++·算法
扶尔魔ocy20 分钟前
【qt openGL入门笔记】基础光照
qt·opengl
殷色玫瑰33 分钟前
C++ string类详解:常用接口、字符串操作与模拟实现
java·linux·c语言·开发语言·数据结构·c++
李游Leo36 分钟前
HarmonyOS 7 + Spatial Recon Kit-C++:3DGS 高斯参数的非有限值隔离与可渲染性门禁【鸿蒙心迹】
开发语言·c++·3d·harmonyos
Evand J42 分钟前
【MATLAB例程】三维RRT+APF路径规划与AOA-TDOA融合定位算法。附代码的下载链接
算法·matlab·路径规划·rrt·tdoa·apf·aoa
时间的拾荒人1 小时前
Qt 文件操作详解:从基础类到读写实战
开发语言·qt·面试
海绵宝宝转agent1 小时前
leetCode100算法开源笔记分享
笔记·算法
jimy12 小时前
基类没有虚析构函数,基类指针删除派生类对象,行为是未定义的
开发语言·c++
海盗12342 小时前
微软技术日报 2026-10-04:26H2 三个已知问题确认,Blazor 补上智能体 UI
人工智能·microsoft·ui·机器人·aigc
写后端的胖头鱼2 小时前
时间复杂度 & 空间复杂度
java·数据结构·算法·时间复杂度·空间复杂度