中国自动化学会专家咨询工作委员会指定宣传媒体
文摘详情
gkongbbs

强实时运动控制内核MotionRT750(六):us级高速交互之C++,为智能装备提速

http://www.gkong.com 2025-09-04 14:56 深圳市正运动技术有限公司

强实时运动控制内核MotionRT750

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

MotionRT750.png

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

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

MotionRT750支持产品.png

MotionRT750应用优势:

1.跨平台兼容性:支持Windows/Linux系统,适配不同等级CPU。

2.开发灵活性:提供多语言编程接口,便于二次开发与功能定制。

3.实时性提升:通过CPU内核独占机制与高效LOCAL接口,实现2-3us指令交互周期,较传统PCI/PCIe方案提速近20倍。

4.扩展能力强化:多卡多EtherCAT通道架构支持254轴运动控制及500usEtherCAT周期。

5.系统稳定性:32轴125usEtherCAT冗余架构消除单点故障风险,保障连续生产。

6.安全可靠性:不惧Windows系统崩溃影响,蓝屏时仍可维持急停与安全停机功能有效,确保产线安全运行。

7.功能扩展性:实时内核支持C语言程序开发,方便功能拓展与实时代码提升效率。

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

超实时EtherCAT运动控制卡XPCIE6032H

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

超实时EtherCAT运动控制卡XPCIE6032H.png

超实时EtherCAT运动控制卡XPCIE6032H接线.png

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运动控制卡上市!

超实时EtherCAT运动控制卡XPCIE2032H

XPCIE2032H集成2路独立EtherCAT接口。整卡最高可支持至254轴运动控制;125usEtherCAT通讯周期时,单接口最高可支持32轴运动控制。2个EtherCAT主站各通道独立工作,多EtherCAT主站互不影响。

超实时EtherCAT运动控制卡XPCIE2032H.png

双EtherCAT主站端口可任意设置为以下通道,且两个端口也设置为不同类型通道:

● 高速通道 - EtherCAT通讯周期125us

● 常规通道 - EtherCAT通讯周期250us-8ms

双EtherCAT通道-超实时EtherCAT运动控制卡XPCIE2032H.png

超实时EtherCAT运动控制卡XPCIE2032H接线.png

XPCIE2032H硬件特性:

1.EtherCAT通讯周期可到125us(需要主机性能与实时性足够)。

2.板卡集成2路独立的EtherCAT主站接口,最多可支持254轴运动控制。

3.搭载运动控制实时内核MotionRT750。

4.相较于传统的PCI/PCIe、网口等通讯方式,速度可提升了10-100倍以上。

5.板载8路高速输入,16路高速输出。

6.板载4路高速锁存,4路通用PWM输出。

更多关于XPCIE2032H的详情介绍与使用点击→高速高精运动控制!PCIe超实时2通道EtherCAT运动控制卡上市!

超实时EtherCAT运动控制卡XPCIE1032H

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

超实时EtherCAT运动控制卡XPCIE1032H.png

超实时EtherCAT运动控制卡XPCIE1032H接线.png

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

MotionRT7.png

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详情点击“不止10倍提速!PCIe EtherCAT实时运动控制卡XPCIE1032H 等您评测!”查看。

01 C++进行MotionRT750项目的创建与开发

1.打开Visual Studio 2022软件选择创建新项目。

1.png

2.选择开发语言为“C++”和“MFC应用”。

2.png

3.选择项目名称、文件目录位置及框架。

3.png

4.选择类型为“基于对话框”,下一步或者完成。

4.png

5.将厂商提供的C++的库文件和相关头文件复制到新建的项目里面。

5.png

6.在项目中添加静态库和相关头文件。

静态库:zauxdll.lib, zmotion.lib

相关头文件:zauxdll2.h, zmotion.h

1)先右击头文件,接着依次选择:“添加”→“现有项”。

6.png

2)在弹出的窗口中依次添加静态库和相关头文件。

7.png

3)声明用到的头文件和定义控制器连接句柄。

8.png

02 相关PC函数介绍

1.PC函数手册可在光盘资料查看,具体路径如下。

9.png

2.PC函数介绍。

指令11.png

指令197.png

指令204.png

指令5.png

指令281.png

指令282.png

指令284.png

指令286.png


 

03 相关测试代码介绍

1.MotionRT750通过LOCAL连接按钮的事件处理函数,调用函数ZAux_FastOpen(),选择连接类型5去连接控制卡(LOCAL连接方式)。

LOCAL连接方式.png

void CcRunSpdDlg::OnBnClickedButton3() 
{
// 连接类型,
     CString s;
     cb1.GetWindowText(s);
     if (!ZAux_FastOpen((ZMC_CONNECTION_TYPE)5, &s.GetBuffer()[0], 1000, &handle))
     {
         MessageBox("MotionRT750链接成功!");
     }
     else
     {
         MessageBox("MotionRT750链接失败!");
     }
}

2.MotionRT750和ZMC432-V2型号控制器通过网口连接按钮的事件处理函数,调用函数ZAux_OpenEth()去连接控制器(网口连接方式)。

网口连接方式.png

网口连接方式-ZMC432CL-V2.png

void CcRunSpdDlg::OnBnClickedButton1()
{
     CString s;
     ed1.GetWindowText(s);
     std::string ip = s.GetBuffer();
     if (!ZAux_OpenEth(&ip[0],&handle))
     {
         MessageBox("链接成功!");
     }
     else
     {
         MessageBox("链接失败!");
     }
}

3.PCIE464型号控制卡通过PCI连接按钮的事件处理函数,调用函数ZAux_FastOpen(),选择连接类型4去连接控制卡(PCI连接方式)。

PCI连接方式.png

void CcRunSpdDlg::OnBnClickedpciconct()
{
     // TODO: 在此添加控件通知处理程序代码
     CString t;
     cb3.GetWindowText(t);
     if (!ZAux_FastOpen((ZMC_CONNECTION_TYPE)4, &t.GetBuffer()[0], 1000, &handle))
     {
         MessageBox("链接成功!");
     }
     else
     {
         MessageBox("链接失败!");
     }
}

4.通过单条指令交互周期的测试按钮的事件处理函数来计算单条指令的交互平均耗时和总耗时。

void CcRunSpdDlg::OnBnClickedButton5()
{
     CString s;
     std::string S;
     float dpos =0;
     cb2.GetWindowText(s);
     S = s.GetBuffer();
     int i;
     LARGE_INTEGER fre, StartCount, StopCount;
     QueryPerformanceFrequency(&fre);
     //开始计数
     QueryPerformanceCounter(&StartCount);
     for (i= 1; i <= std::stoi(S); i++)
     {
         ZAux_Direct_GetDpos(handle, 0, &dpos);
     }
     //停止计数
     QueryPerformanceCounter(&StopCount);
     double  elapsed = (double)(StopCount.QuadPart - StartCount.QuadPart);
     double  exeTime, exeTime1;
     exeTime = elapsed * 1000 / fre.QuadPart;                           //ms 总耗时
     exeTime1 = elapsed * 1000 / fre.QuadPart/ (std::stoi(S)) * 1000;   //us 单条指令耗时
     //时间显示
     ed2.SetWindowText(std::to_string(exeTime1).data());			  //us
     ed3.SetWindowText(std::to_string((double)exeTime).data());        //ms
     ed6.SetWindowText(std::to_string(dpos).data());
}


 5.通过多条指令交互周期的测试按钮的事件处理函数来计算多条指令的交互平均耗时和总耗时。

void CcRunSpdDlg::OnBnClickedButton6()
{
     CString s;
     std::string S;
     float data[12] = { 0 };
     char get[255];
     cb2.GetWindowText(s);
     S = s.GetBuffer();
     std::string cmd = "?dpos(0),dpos(1),dpos(2),dpos(3),axisstatus(0),axisstatus(1),axisstatus(2),axisstatus(3),in(0),in(1),in(2),in(3)";
     LARGE_INTEGER fre, StartCount, StopCount;
     QueryPerformanceFrequency(&fre);
     //开始计数
     QueryPerformanceCounter(&StartCount);
     for (int i = 1; i <= std::stoi(S); i++)
     {
         ZAux_DirectCommand(handle, &cmd[0], get, 255);
     }
     //停止计数
     QueryPerformanceCounter(&StopCount);
     double  elapsed = (double)(StopCount.QuadPart - StartCount.QuadPart);
     double  exeTime, exeTime1;
     exeTime = elapsed * 1000 / fre.QuadPart;                           //ms 总耗时
     exeTime1 = elapsed * 1000 / fre.QuadPart / (std::stoi(S)) * 1000;  //us 单条指令耗时      //时间显示
     ed4.SetWindowText(std::to_string(exeTime1).data());               //单条指令耗时
     ed5.SetWindowText(std::to_string((double)exeTime).data());		  //总耗时
     ZAux_TransStringtoFloat(&get[0], 12, data);
     ed7.SetWindowText(std::to_string(data[0]).data());
     ed8.SetWindowText(std::to_string(data[1]).data());
     ed9.SetWindowText(std::to_string(data[2]).data());
     ed10.SetWindowText(std::to_string(data[3]).data());
     ed11.SetWindowText(std::to_string((int)data[4]).data());
     ed12.SetWindowText(std::to_string((int)data[5]).data());
     ed13.SetWindowText(std::to_string((int)data[6]).data());
     ed14.SetWindowText(std::to_string((int)data[7]).data());
     ed15.SetWindowText(std::to_string((int)data[8]).data());
     ed16.SetWindowText(std::to_string((int)data[9]).data());
     ed17.SetWindowText(std::to_string((int)data[10]).data());
     ed18.SetWindowText(std::to_string((int)data[11]).data());
}

6.网口连接周期上报的方式获取输入口状态的总耗时测试函数如下。

void CcRunSpdDlg::OnBnClickedButton9()
{
     // TODO: 在此添加控件通知处理程序代码 0
     int32 singleValue = 0;
     int32 InState[1000];
     //打开使能周期上报
     ZAux_CycleUpEnable(handle, 0, 1000, "IN(0,1000)");
     //强制上报一次,0 为通道号
     ZAux_CycleUpForceOnce(handle, 0);
     LARGE_INTEGER fre, start, stopCount;
     QueryPerformanceFrequency(&fre);
     //开始计数
     QueryPerformanceCounter(&start);
     for (int i = 0; i < 1000; i++)
     {
         int ret = ZAux_CycleUpReadBuffInt(handle, 0, "IN", i, InState);
         if (ret != 0)		 //判断是否报错,有报错弹出错误码
  	 {
             CString str;
             str.Format(_T("错误码:%d"), ret);
	     MessageBox(str);
             break;
             }
     }
     QueryPerformanceCounter(&stopCount);
     double  elapsed = (double) (stopCount.QuadPart - start.QuadPart);
     double  exeTime;
     exeTime = elapsed * 1000 / fre.QuadPart;				       //ms
     //显示
     ed19.SetWindowText(std::to_string(exeTime).data());          //ms
     //关闭周期上报的功能
     ZAux_CycleUpDisable(handle, 0);
}

7.单条指令读取1个输入口状态的总耗时测试函数如下。

void CcRunSpdDlg::OnBnClickedButton10()
{
     // TODO: 在此添加控件通知处理程序代码
     uint32 singleValue = 0;
     uint32 InState[1000];
     LARGE_INTEGER fre, StartCount, StopCount;
     QueryPerformanceFrequency(&fre);
     //开始计数
     QueryPerformanceCounter(&StartCount);
     for (int i = 0; i < 1000; i++)
     {
         ZAux_Direct_GetIn(handle, i, &singleValue);                    //单条指令读取单个输入口状态
         InState[i] = singleValue;
     }
     //停止计数
     QueryPerformanceCounter(&StopCount);
     double  elapsed = (double)(StopCount.QuadPart - StartCount.QuadPart);
     double  exeTime;
     exeTime = elapsed * 1000 / fre.QuadPart;                           //ms 总耗时
      //显示
      ed20.SetWindowText(std::to_string(exeTime).data());     //ms
}

8.单条指令读取多个输入口状态的总耗时测试函数如下。

void CcRunSpdDlg::OnBnClickedButton11()
{
     // TODO: 在此添加控件通知处理程序代码
     int32 singleValue[1000];
     LARGE_INTEGER fre, StartCount, StopCount;
     QueryPerformanceFrequency(&fre);
     //开始计数
     QueryPerformanceCounter(&StartCount);
     ZAux_Direct_GetInMulti(handle, 0, 999, singleValue);
     //停止计数
     QueryPerformanceCounter(&StopCount);
     double  elapsed = (double)(StopCount.QuadPart - StartCount.QuadPart);
     double  exeTime;
     exeTime = elapsed * 1000 / fre.QuadPart;                          //ms 总耗时
     //显示
     ed21.SetWindowText(std::to_string(exeTime).data());	  //ms
}


 

04 运行效果

1.MotionRT750通过LOCAL连接方式的单条指令和多条指令交互时间测试结果如下图所示。

LOCAL连接方式.png

MotionRT750 LOCAL连接方式示意图

MotionRT750 LOCAL连接方式测试(1k次).png

MotionRT750 LOCAL连接方式测试(1k次)

MotionRT750 LOCAL连接方式测试(1w次).png

MotionRT750 LOCAL连接方式测试(1w次)

MotionRT750 LOCAL连接方式测试(10w次).png

MotionRT750 LOCAL连接方式测试(10w次)

2.MotionRT750通过网口连接方式的单条指令和多条指令交互时间测试结果如下图所示。

网口连接方式.png

MotionRT750 网口连接方式示意图

MotionRT750 网口连接方式测试(1k次).png

MotionRT750 网口连接方式测试(1k次)

MotionRT750 网口连接方式测试(1w次).png

MotionRT750 网口连接方式测试(1w次)

MotionRT750 网口连接方式测试(10w次).png

MotionRT750 网口连接方式测试(10w次)

3.ZMC432-V2控制器通过网口连接方式的单条指令和多条指令交互时间测试结果如下图所示。

网口连接方式-ZMC432CL-V2.png

ZMC432-V2 网口连接方式示意图

ZMC432-V2 网口连接方式测试(1k次).png

ZMC432-V2 网口连接方式测试(1k次)

ZMC432-V2 网口连接方式测试(1w次).png

ZMC432-V2 网口连接方式测试(1w次)

ZMC432-V2 网口连接方式测试(10w次).png

ZMC432-V2 网口连接方式测试(10w次)

4.PCIE464控制卡通过PCI连接方式的单条指令和多条指令交互时间测试结果如下图所示。

PCI连接方式.png

PCIE464 PCI连接方式示意图

PCIE464 PCI连接方式测试(1k次).png

PCIE464 PCI连接方式测试(1k次)

PCIE464 PCI连接方式测试(1w次).png

PCIE464 PCI连接方式测试(1w次)

PCIE464 PCI连接方式测试(10w次).png

PCIE464 PCI连接方式测试(10w次)

接下来是对IO状态获取的耗时测试,通过不同的IO状态获取模式(周期上报,单指令获取1个或多个输入口状态),对比各连接方式下的总耗时,旨在为实际应用场景提供性能参考,提升数据获取效率,确保系统能更高效稳定运行。

(1)MotionRT750通过LOCAL连接方式时使用单条指令获取1个输入口状态和单条指令获取多个输入口状态,两种方式获取1000个输入口状态的总耗时如下。

LOCAL连接方式.png

10.png

(2)MotionRT750通过网口连接方式使用周期上报功能获取输入口状态、使用单条指令获取1个输入口状态和使用单条指令获取多个输入口状态,三种方式获取1000个输入口状态的总耗时如下。

网口连接方式.png

11.png

(3)ZMC432-V2控制器通过网口连接方式使用周期上报功能获取输入口状态、使用单条指令获取1个输入口状态和使用单条指令获取多个输入口状态,三种方式获取1000个输入口状态的总耗时如下。

网口连接方式-ZMC432CL-V2.png

12.png

(4)PCIE464控制卡通过PCI连接方式使用单条指令获取1个输入口状态和单条指令获取多个输入口状态,两种方式获取1000个输入口状态的总耗时如下。

PCI连接方式.png

13.png

05 分析与结论

1.对于MotionRT750的LOCAL方式连接、网口方式连接以及PCI方式和控制器网口方式连接时的单条或多条指令交互时间测试,从上面的运行效果图的数据显示来看,可以看出:

当进行1k、1w次和10w次的单指令交互或多条指令交互的时候,MotionRT750的LOCAL连接方式进行单条指令交互所需要的时间(平均2.1us左右)和一次性读取12个状态的多条指令交互所需要的时间(平均3.8us左右),都是要比PCI连接和控制器网口连接的方式更快(PCI单条平均42us左右、多条平均105us左右;网口单条平均127us、多条平均177us左右)。

分析与结论-测试对比数据表格.png

2.对于读取输入口状态指令测试,从运行效果图的显示结果来看:

无论是MotionRT750还是控制器,在网口连接下周期上报功能效率最高,避免轮询引发的多包数据传输耗时问题,提升带宽利用率,总耗时大约仅需0.44ms;

而单指令批量读取多个输入口状态因减少通信次数,耗时时间对比读取单个输入口降低约96%;

LOCAL和PCI连接时,虽不支持周期上报功能,但单指令对比下,批量读取多个输入口状态的效率显著高于读取单个输入口。

综合来看,在实际应用中,选择哪种数据获取策略取决于具体的应用场景、数据特性和性能要求。

例如,如果程序需要快速响应单个事件,单条获取可能更为合适。如果目标是最大化数据处理速度,多条获取可能更有益。而对于需要定期维护数据新鲜度的应用,周期性获取是必要的。

3.C++例程讲解视频可点击→“强实时运动控制内核MotionRT750(六):us级高速交互之C++,为智能装备提速”查看。

完整代码获取地址

完整代码.png

本次,正运动技术强实时运动控制内核MotionRT750(六):us级高速交互之C++,为智能装备提速,就分享到这里。

更多精彩内容请关注“正运动小助手”公众号,需要相关开发环境与例程代码,请咨询正运动技术销售工程师:400-089-8936。

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

二维码.png

正运动技术专注于运动控制技术研究和通用运动控制软硬件产品的研发,是国家级高新技术企业。正运动技术汇集了来自华为、中兴等公司的优秀人才,在坚持自主创新的同时,积极联合各大高校协同运动控制基础技术的研究,是国内工控领域发展最快的企业之一,也是国内少有、完整掌握运动控制核心技术和实时工控软件平台技术的企业。主要业务有:运动控制卡_运动控制器_EtherCAT运动控制卡_EtherCAT控制器_运动控制系统_视觉控制器__运动控制PLC_运动控制_机器人控制器_视觉定位_XPCIe/XPCI系列运动控制卡等等。

版权所有 工控网 Copyright©2025 Gkong.com, All Rights Reserved