The value of Zmotion is to bring customers more success!
MotionRT750是正运动技术首家自主自研的x86架构Windows系统或Linux系统下独占确定CPU的强实时运动控制内核。
该方案采用独占确定CPU内核技术实现超强性能的强实时运动控制。它将核心的运动控制、机器人算法、数控(CNC)及机器视觉等强实时的任务,集中运行在1-2个专用CPU核上。与此同时,其余CPU核则专注于处理Windows/Linux相关的非实时任务。
此外集成MotionRT750 Runtime实时层与操作系统非实时层,并利用高速共享内存进行数据交互,显著提升了运动控制与上层应用间的通信效率及函数执行速度,最终实现更稳定、更高效的智能装备控制,确保了运动控制任务的绝对实时性与系统稳定性,特别适用于半导体、电子装备等高速高精的应用场合。
1.跨平台兼容性:支持Windows/Linux系统,适配不同等级CPU。
2.开发灵活性:提供多语言编程接口,便于二次开发与功能定制。
3.实时性提升:通过CPU内核独占机制与高效LOCAL接口,实现2-3μs指令交互周期,较传统PCI/PCIe方案提速近20倍。
4.扩展能力强化:多卡多EtherCAT通道架构支持254轴运动控制及500μsEtherCAT周期。
5.系统稳定性:32轴125μsEtherCAT冗余架构消除单点故障风险,保障连续生产。
6.安全可靠性:不惧Windows系统崩溃影响,蓝屏时仍可维持急停与安全停机功能有效,确保产线安全运行。
7.功能扩展性:实时内核支持C语言程序开发,方便功能拓展与实时代码提升效率。
更多关于MotionRT750的详情介绍与使用点击→强实时运动控制内核MotionRT750(一):驱动安装、内核配置与使用。
XPCIE6032H运动控制卡集成6路独立EtherCAT主站接口。整卡最高可支持254轴运动控制;125usEtherCAT通讯周期时,两个端口配置冗余最高可支持32轴运动控制。6个EtherCAT主站各通道独立工作,多EtherCAT主站互不影响。
此外,对于EtherCAT接口数量需求不高的客户,我们也有衍生型号XPCIE2032H可选。同系列产品XPCIE2032H集成2路独立EtherCAT接口。整卡最高可支持至254轴运动控制;125usEtherCAT通讯周期时,单接口最高可支持32轴运动控制。2个EtherCAT主站各通道独立工作,多EtherCAT主站互不影响。
XPCIE6032H运动控制卡面向半导体设备、精密3C电子、生物医疗仪器、新能源装备、人形机器人及激光加工等高速高精场景,为固晶机、贴片机、分选机、锂电切叠一体机、高速异形插件设备等自动化装备提供核心运动控制支持。
1.EtherCAT通讯周期可到125us(需要主机性能与实时性足够)。
2.板卡集成6路独立的EtherCAT主站接口,最多可支持254轴运动控制。
3.搭载运动控制实时内核MotionRT750。
4.相较于传统的PCI/PCIe、网口等通讯方式,速度可提升了10-100倍以上。
5.板载16路高速输入,16路高速输出。
6.板载4路高速锁存、4路硬件位置比较输出、4路通用PWM输出。
更多关于XPCIE6032H的详情介绍与使用点击→全球首创!PCIe超实时6通道EtherCAT运动控制卡上市!。
XPCIE1032H是一款基于PCI Express的EtherCAT总线运动控制卡,可选6-64轴运动控制,支持多路高速数字输入输出,可轻松实现多轴同步控制和高速数据传输。
XPCIE1032H运动控制卡集成了强大的运动控制功能,结合MotionRT7运动控制实时软核,解决了高速高精应用中,PC Windows开发的非实时痛点,指令交互速度比传统的PCI/PCIe快10倍。
1.6-64轴EtherCAT总线+脉冲可选,其中4路单端500KHz脉冲输出。
2.16轴EtherCAT同步周期500us,支持多卡联动。
3.板载16点通用输入,16点通用输出,其中8路高速输入和16路高速输出。
4.通过EtherCAT总线,可扩展到512个隔离输入或输出口。
5.支持PWM输出、精准输出、PSO硬件位置比较输出、视觉飞拍等。
6.支持直线插补、圆弧插补、连续轨迹加工(速度前瞻)。
7.支持电子凸轮、电子齿轮、位置锁存、同步跟随、虚拟轴、螺距补偿等功能。
8.支持30+机械手模型正逆解模型算法,比如SCARA、Delta、UVW、4轴/5轴 RTCP...
什么是总线冗余功能?我们都知道,EtherCAT现场总线具有灵活的拓扑结构,设备间支持线型、星型、树型的连接方式,其中线型结构简单、传输效率高,大多数的现场应用中也是使用这种连接方式,如下图所示。
线型的连接方式确实简单,走线灵活,便于现场设备布局与维护。在自动化的工业生产中,设备通常在不同的环境中长时间运行,线缆的老化、安装连接不够严谨等因素导致线缆断连。
假如有一天第一个伺服和第二个伺服之间的线缆断了,那么第1个伺服后面的设备是不是将无法正常运行呢?
不管是哪种接线方式,线缆断线将会影响设备的正常运转,哪怕是传统的CAN、RS485等通信的设备控制也都无法正常运转。
问题还得要解决,那有没有标准的、又不需要添加太多额外的设计成本,就能解决上述的问题呢?一起来看EtherCAT总线给出的解决方案,以及EtherCAT冗余技术的实现原理。我们先看它的连接方式,如下图所示。
从EtherCAT的线缆冗余接线图中可以看出,复用了最后一个从站设备的OUT端接回主站,是不是有点巧妙呢?减少了硬件成本,还能解决问题,确实受大家喜欢。再来细看它的数据流向,假设还是第一个伺服和第二个伺服之间断开了,它的工作原理如下图所示。
伺服1和伺服2的线缆断开后仍与从站设备连接着,但通信线路变成两条支线,设备仍然可以正常通信,设备依然还能够继续控制运行。上述就是EtherCAT冗余的解决方案,将线型结构变成了环形结构,实现了链路冗余功能。
(1)安装MotionRT750强实时运动控制内核的工控机一台。
(2)XPCIE6032H运动控制卡,该卡自带槽位0到槽位5总共6个EtherCAT总线主站接口。也可以采用XPCIE2032H运动控制卡,该卡自带槽位0到槽位1总共2个EtherCAT总线主站接口。
(3)8个总线伺服驱动器和1个ZMIO310的EtherCAT总线扩展模块。
1.打开Qt Creator参考如下步骤创建新的Qt项目。
2.把厂商提供的zmotion.dll、zmotion.lib、zmotion.h、zmcaux.cpp、zmcaux.h库文件拷贝到新建的QT项目下(Linux系统的使用libzmotion.so的动态库)。
3.如果想实现纯上位机的总线初始化,可以找厂商提供一下以下2个文件,进行总线初始化。
4.添加外部库【选择项目后右键】→【添加库】→【外部库】。
5.引入头文件并定义控制器的句柄。
6.至此Qt项目新建完成,可以进行MotionRT750的项目开发了。
1.上位机连接MotionRT750的接口。
2.总线冗余相关的指令上位机暂时还没封装成现成的指令,我们可以通过在线命令直接封装实现。
总线冗余功能相关Basic指令介绍:
万能上位机接口在线命令介绍:
通过在线命令封装Basic的轴速度设置指令得到上位机的轴速度设置指令例程如下:
/************************************************************* Description: //设置轴速度,单位为units/s,当多轴运动时,作为插补运动的速度 Input: //卡链接handle iaxis 轴号 fValue 设置的速度值 Output: // Return: //错误码 *************************************************************/ int32 __stdcall ZAux_Direct_SetSpeed(ZMC_HANDLE handle, int iaxis, float fValue) { char cmdbuff[2048]; char cmdbuffAck[2048]; if( iaxis > MAX_AXIS_AUX) { return ERR_AUX_PARAERR; } //生成Basic命令 sprintf(cmdbuff, "SPEED(%d)=%f", iaxis, fValue); //调用命令执行函数 return ZAux_DirectCommand(handle, cmdbuff, cmdbuffAck, 2048); }
1.上位机如何链接上MotionRT750。
//通过LOCAL接口连接RT750, LOCAL接口的指令交互速度快至3us以内 int rint = ZAux_FastOpen(5,"LOCAL",1000,&g_handle); if(0 == rint) { //控制器连接成功,初始化程序变量 ConnectNum=0; ContrStatus=1; //控制器连接成功,启动定时器 startTimer(200); //控制器连接成功,开始正常初始化 MainWindow::ZmcEcatInit(SlotId,BeiYongSlotId); //初始化线程和 Worker thread = new QThread(this); worker = new Worker(); // 注意:不指定父对象 //将 Worker 移至子线程 worker->moveToThread(thread); //连接信号与槽 connect(thread, &QThread::started, worker, &Worker::doWork); connect(worker, &Worker::workFinished, thread, &QThread::quit); connect(worker, &Worker::workFinished, worker, &QObject::deleteLater); connect(thread, &QThread::finished, thread, &QObject::deleteLater); //可选:根据子线程的总线扫描情况,弹出对应弹窗 connect(worker, &Worker::EcatInitStatus, this,&MainWindow::EcatScanInfo); connect(worker, &Worker::UpdateLog, this,&MainWindow::UpdateLog); //启动状态监控线程 thread->start(); }
2.如何实现纯上位机的总线初始化。
//Qt的总线初始化子函数 int MainWindow::ZmcEcatInit(int ScanSlotId ,int BackSlotId) { //定义总线初始化的信息结构体 struct EcatInitInfoSet MyEcatInitInfo; //是否自定义初始化参数,设置1的话使用默认的总线初始化参数,设置成0则需要自定义总线初始化相关参数; MyEcatInitInfo.InitStructFlag = 0; if (MyEcatInitInfo.InitStructFlag != 1) { //【1. 本地轴参数,用于指定本地轴的起始 ID 和使用的轴数量】 MyEcatInitInfo.LocalAxisId = 0; MyEcatInitInfo.LocalAxisNum = 0; //【2. 驱动轴相关参数,用于指定驱动轴的起始 ID 和数量】 MyEcatInitInfo.DriveAxisStart = 0; MyEcatInitInfo.DriveAxisNum = -1; // 驱动轴数量,-1 表示总线初始化的时候不判断驱动的轴数量是否对上 MyEcatInitInfo.EcatNodeNum = -1; // 总线节点数目,-1 表示总线初始化的时候不判断节点个数是否对上 for (int i = 0; i < 128; i++) { MyEcatInitInfo.DrivePdoMode[i] = 12; // PDO 模式数组 } // 总线初始化时是否自动使能,1 驱动器自动使能,0 不使能驱动器 MyEcatInitInfo.DriveEnable = 1; //【3、冗余设置】 MyEcatInitInfo.BusRedSwitch=1; //总线冗余开关(1=开启,0=关闭) MyEcatInitInfo.RedSpareSlot=1; //冗余备用槽编号 } //开始总线初始化 int Err = ZAux_BusCmd_EcatScan(g_handle,ScanSlotId, MyEcatInitInfo,10000,BackSlotId); MainWindow::EcatScanInfo(Err); return Err; }
3.指定哪个总线接口为主槽位号,哪个总线接口为从槽位号。
//停止总线 sprintf(cmdbuff, "SLOT_STOP(%d)", SlotId); ZAux_Execute(handle, cmdbuff, ReceBuff, 256); //设置总线冗余的从总线槽位号,总线扫描前设置 if((BusRedSwitch==1)&&( SlotId!=RedSpareSlot)) { //等待200ms MyDelayMs(200, pOutTime); //设置总线槽位号SlotId为主总线槽,设置RedSpareSlot为从总线槽 sprintf(cmdbuff, " SLOT_SLAVE(%d)=%d", SlotId,RedSpareSlot); ZAux_Execute(handle, cmdbuff, ReceBuff, 256); } //等待200ms MyDelayMs(200, pOutTime); //扫描总线 sprintf(cmdbuff, "SLOT_SCAN(%d) ?return", SlotId); Iresult += ZAux_Execute(handle, cmdbuff, ReceBuff, 256);
通过RTSys软件的在线命令功能,输入?*slot指令查询XPCIE6032H的槽位号分布情况如下:
通过RTSys软件的在线命令功能,输入?*slot指令查询XPCIE2032H的槽位号分布情况如下:
4.通过Qt的定时器实时获取总线In口和Out口的通讯状态。
//3、更新ECAT In口与Out口状态 sprintf(Cmdbuff, "?NODE_INFO(%d,%d,6)",SlotId,CurNodeId); Err = ZAux_Execute(g_handle, Cmdbuff, AckBuff, 256); if( 0== Err) { Tempint =std::atoi(AckBuff); //如果bit0为1,则总线IN口通讯正常,设置为绿色 if((Tempint==1)||(Tempint==3)) { EcatInList[i]->setStyleSheet( "QPushButton {"//背景色 " background-color: rgb(50, 205, 50);" "}" "QPushButton:hover {" //鼠标悬停时的背景色 " background-color: rgb(50, 205, 50);" "}" "QPushButton:pressed {"//鼠标按下时的背景色 " background-color: rgb(50, 205, 50);" "}"); } //否则总线IN口通讯异常,设置为红色 else { EcatInList[i]->setStyleSheet( "QPushButton {"//背景色 " background-color: rgb(205, 50, 50);" "}" "QPushButton:hover {" //鼠标悬停时的背景色 " background-color: rgb(205, 50, 50);" "}" "QPushButton:pressed {"//鼠标按下时的背景色 " background-color: rgb(205, 50, 50);" "}"); } //如果bit1为1,则总线Out口通讯正常,设置为绿色 if((Tempint==2)||(Tempint==3)) { EcatOpList[i]->setStyleSheet( "QPushButton {"//背景色 " background-color: rgb(50, 205, 50);" "}" "QPushButton:hover {" //鼠标悬停时的背景色 " background-color: rgb(50, 205, 50);" "}" "QPushButton:pressed {"//鼠标按下时的背景色 " background-color: rgb(50, 205, 50);" "}"); } //否则总线Out口通讯异常,设置为红色 else { EcatOpList[i]->setStyleSheet( "QPushButton {"//背景色 " background-color: rgb(205, 50, 50);" "}" "QPushButton:hover {" //鼠标悬停时的背景色 " background-color: rgb(205, 50, 50);" "}" "QPushButton:pressed {"//鼠标按下时的背景色 " background-color: rgb(205, 50, 50);" "}"); } }
5.总线冗余演示视频可点击→“正运动强实时运动控制内核MotionRT750”查看。
完整代码获取地址
本次,正运动技术强实时运动控制内核MotionRT750(五):EtherCAT总线冗余让生产制造更可靠,就分享到这里。
更多精彩内容请关注“正运动小助手”公众号,需要相关开发环境与例程代码,请咨询正运动技术销售工程师:400-089-8936。
正运动技术专注于运动控制技术研究和通用运动控制软硬件产品的研发,是国家级高新技术企业。正运动技术汇集了来自华为、中兴等公司的优秀人才,在坚持自主创新的同时,积极联合各大高校协同运动控制基础技术的研究,是国内工控领域发展最快的企业之一,也是国内少有、完整掌握运动控制核心技术和实时工控软件平台技术的企业。主要业务有:运动控制卡_运动控制器_EtherCAT运动控制卡_EtherCAT控制器_运动控制系统_视觉控制器__运动控制PLC_运动控制_机器人控制器_视觉定位_XPCIe/XPCI系列运动控制卡等等。