强实时运动控制内核MotionRT750(五):EtherCAT总线冗余让生产制造更可靠

电子说

1.4w人已加入

描述

强实时运动控制内核MotionRT750

MotionRT750是正运动技术首家自主自研的x86架构Windows系统或Linux系统下独占确定CPU的强实时运动控制内核。

EtherCAT总线

该方案采用独占确定CPU内核技术实现超强性能的强实时运动控制。它将核心的运动控制、机器人算法、数控(CNC)及机器视觉等强实时的任务,集中运行在1-2个专用CPU核上。与此同时,其余CPU核则专注于处理Windows/Linux相关的非实时任务。

此外集成MotionRT750 Runtime实时层与操作系统非实时层,并利用高速共享内存进行数据交互,显著提升了运动控制与上层应用间的通信效率及函数执行速度,最终实现更稳定、更高效的智能装备控制,确保了运动控制任务的绝对实时性与系统稳定性,特别适用于半导体、电子装备等高速高精的应用场合。

EtherCAT总线

MotionRT750应用优势:

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”查看。

更多关于MotionRT750的详情介绍与使用点击→强实时运动控制内核MotionRT750(一):驱动安装、内核配置与使用。


 


 

超实时EtherCAT运动控制卡XPCIE6032H

XPCIE6032H运动控制卡集成6路独立EtherCAT主站接口。整卡最高可支持254轴运动控制;125usEtherCAT通讯周期时,两个端口配置冗余最高可支持32轴运动控制。6个EtherCAT主站各通道独立工作,多EtherCAT主站互不影响。

EtherCAT总线

此外,对于EtherCAT接口数量需求不高的客户,我们也有衍生型号XPCIE2032H可选。同系列产品XPCIE2032H集成2路独立EtherCAT接口。整卡最高可支持至254轴运动控制;125usEtherCAT通讯周期时,单接口最高可支持32轴运动控制。2个EtherCAT主站各通道独立工作,多EtherCAT主站互不影响。

EtherCAT总线

XPCIE2032H视频介绍可点击→“高速高精运动控制!PCIe超实时2通道EtherCAT运动控制卡上市!_哔哩哔哩_bilibili”查看。

XPCIE6032H运动控制卡面向半导体设备、精密3C电子、生物医疗仪器、新能源装备、人形机器人及激光加工等高速高精场景,为固晶机、贴片机、分选机、锂电切叠一体机、高速异形插件设备等自动化装备提供核心运动控制支持。

XPCIE6032H硬件特性:

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运动控制卡XPCIE6032H_哔哩哔哩_bilibili”查看。

更多关于XPCIE6032H的详情介绍与使用点击→全球首创!PCIe超实时6通道EtherCAT运动控制卡上市!。


 


 

PCIe EtherCAT实时运动控制卡XPCIE1032H

XPCIE1032H是一款基于PCI Express的EtherCAT总线运动控制卡,可选6-64轴运动控制,支持多路高速数字输入输出,可轻松实现多轴同步控制和高速数据传输。

EtherCAT总线

XPCIE1032H运动控制卡集成了强大的运动控制功能,结合MotionRT7运动控制实时软核,解决了高速高精应用中,PC Windows开发的非实时痛点,指令交互速度比传统的PCI/PCIe快10倍。

EtherCAT总线

XPCIE1032H硬件特性:

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...
 

XPCIe1032H视频介绍可点击→“高性能PCIe EtherCAT运动控制卡 | XPCIE1032H_哔哩哔哩_bilibili”

更多关于XPCIE1032H详情点击“不止10倍提速!PCIe EtherCAT实时运动控制卡XPCIE1032H 等您评测!”查看。



 


 

冗余的概念

什么是总线冗余功能?我们都知道,EtherCAT现场总线具有灵活的拓扑结构,设备间支持线型、星型、树型的连接方式,其中线型结构简单、传输效率高,大多数的现场应用中也是使用这种连接方式,如下图所示。

EtherCAT总线

线型的连接方式确实简单,走线灵活,便于现场设备布局与维护。在自动化的工业生产中,设备通常在不同的环境中长时间运行,线缆的老化、安装连接不够严谨等因素导致线缆断连。

假如有一天第一个伺服和第二个伺服之间的线缆断了,那么第1个伺服后面的设备是不是将无法正常运行呢?

EtherCAT总线

不管是哪种接线方式,线缆断线将会影响设备的正常运转,哪怕是传统的CAN、RS485等通信的设备控制也都无法正常运转。

问题还得要解决,那有没有标准的、又不需要添加太多额外的设计成本,就能解决上述的问题呢?一起来看EtherCAT总线给出的解决方案,以及EtherCAT冗余技术的实现原理。我们先看它的连接方式,如下图所示。

EtherCAT总线

从EtherCAT的线缆冗余接线图中可以看出,复用了最后一个从站设备的OUT端接回主站,是不是有点巧妙呢?减少了硬件成本,还能解决问题,确实受大家喜欢。再来细看它的数据流向,假设还是第一个伺服和第二个伺服之间断开了,它的工作原理如下图所示。

EtherCAT总线

伺服1和伺服2的线缆断开后仍与从站设备连接着,但通信线路变成两条支线,设备仍然可以正常通信,设备依然还能够继续控制运行。上述就是EtherCAT冗余的解决方案,将线型结构变成了环形结构,实现了链路冗余功能。


 

冗余功能的优势

01 冗余功能标准化

双网口的EtherCAT主站与线缆冗余,使用了最后一个从站设备的OUT端口,使得EtherCAT冗余功能标准化。

02 增强系统可靠性和稳定性

工业自动化行业中通常要求总线上的设备不间断运转,不允许停止生产,冗余技术可以实现应用系统的可靠性和稳定性。

03 故障诊断与处理

当出现线缆断线时,变成两条之链路控制继续工作,同时EtherCAT可以自动检测到总线系统中的故障点,可大大简化系统的维护工作,提高了设备的维护性。


 

总线冗余的软硬件配置

(1)安装MotionRT750强实时运动控制内核的工控机一台。

(2)XPCIE6032H运动控制卡,该卡自带槽位0到槽位5总共6个EtherCAT总线主站接口。也可以采用XPCIE2032H运动控制卡,该卡自带槽位0到槽位1总共2个EtherCAT总线主站接口。

EtherCAT总线

EtherCAT总线

(3)8个总线伺服驱动器和1个ZMIO310的EtherCAT总线扩展模块。

EtherCAT总线

Qt开发MotionRT750强实时运动控制内核

Qt项目的创建

1.打开Qt Creator参考如下步骤创建新的Qt项目。

EtherCAT总线

EtherCAT总线

EtherCAT总线

EtherCAT总线

EtherCAT总线

2.把厂商提供的zmotion.dll、zmotion.lib、zmotion.h、zmcaux.cpp、zmcaux.h库文件拷贝到新建的QT项目下(Linux系统的使用libzmotion.so的动态库)。

EtherCAT总线

3.如果想实现纯上位机的总线初始化,可以找厂商提供一下以下2个文件,进行总线初始化。

EtherCAT总线

4.添加外部库【选择项目后右键】→【添加库】→【外部库】。

EtherCAT总线

5.引入头文件并定义控制器的句柄。

EtherCAT总线

6.至此Qt项目新建完成,可以进行MotionRT750的项目开发了。


 

相关PC函数介绍

1.上位机连接MotionRT750的接口。

EtherCAT总线

2.总线冗余相关的指令上位机暂时还没封装成现成的指令,我们可以通过在线命令直接封装实现。

总线冗余功能相关Basic指令介绍:

EtherCAT总线

EtherCAT总线


 

万能上位机接口在线命令介绍:

EtherCAT总线

EtherCAT总线


 

通过在线命令封装Basic的轴速度设置指令得到上位机的轴速度设置指令例程如下:

EtherCAT总线

/************************************************************* 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的槽位号分布情况如下:

EtherCAT总线

通过RTSys软件的在线命令功能,输入?*slot指令查询XPCIE2032H的槽位号分布情况如下:

EtherCAT总线

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总线冗余让生产制造更可靠,就分享到这里。

本文由正运动技术原创,欢迎大家转载,共同学习,一起提高中国智能制造水平。文章版权归正运动技术所有,如有转载请注明文章来源。


审核编辑 黄宇

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分