MotionRT750是正運動技術首家自主自研的x86架構Windows系統或Linux系統下獨占確定CPU的強實時運動控制內核。

該方案采用獨占確定CPU內核技術實現超強性能的強實時運動控制。它將核心的運動控制、機器人算法、數控(CNC)及機器視覺等強實時的任務,集中運行在1-2個專用CPU核上。與此同時,其余CPU核則專注于處理Windows/Linux相關的非實時任務。
此外集成MotionRT750 Runtime實時層與操作系統非實時層,并利用高速共享內存進行數據交互,顯著提升了運動控制與上層應用間的通信效率及函數執行速度,最終實現更穩定、更高效的智能裝備控制,確保了運動控制任務的絕對實時性與系統穩定性,特別適用于半導體、電子裝備等高速高精的應用場合。

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(一):驅動安裝、內核配置與使用。
XPCIE6032H運動控制卡集成6路獨立EtherCAT主站接口。整卡最高可支持254軸運動控制;125usEtherCAT通訊周期時,兩個端口配置冗余最高可支持32軸運動控制。6個EtherCAT主站各通道獨立工作,多EtherCAT主站互不影響。


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運動控制卡上市!。
XPCIE2032H集成2路獨立EtherCAT接口。整卡最高可支持至254軸運動控制;125usEtherCAT通訊周期時,單接口最高可支持32軸運動控制。2個EtherCAT主站各通道獨立工作,多EtherCAT主站互不影響。

雙EtherCAT主站端口可任意設置為以下通道,且兩個端口也設置為不同類型通道:
● 高速通道 - EtherCAT通訊周期125us
● 常規通道 - EtherCAT通訊周期250us-8ms


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運動控制卡上市!。
XPCIE1032H是一款基于PCI Express的EtherCAT總線運動控制卡,可選6-64軸運動控制,支持多路高速數字輸入輸出,可輕松實現多軸同步控制和高速數據傳輸。


XPCIE1032H運動控制卡集成了強大的運動控制功能,結合MotionRT7運動控制實時軟核,解決了高速高精應用中,PC Windows開發的非實時痛點,指令交互速度比傳統的PCI/PCIe快10倍。

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軟件選擇創建新項目。

2.選擇開發語言為“C++”和“MFC應用”。

3.選擇項目名稱、文件目錄位置及框架。

4.選擇類型為“基于對話框”,下一步或者完成。

5.將廠商提供的C++的庫文件和相關頭文件復制到新建的項目里面。

6.在項目中添加靜態庫和相關頭文件。
靜態庫:zauxdll.lib, zmotion.lib
相關頭文件:zauxdll2.h, zmotion.h
1)先右擊頭文件,接著依次選擇:“添加”→“現有項”。

2)在彈出的窗口中依次添加靜態庫和相關頭文件。

3)聲明用到的頭文件和定義控制器連接句柄。

02 相關PC函數介紹
1.PC函數手冊可在光盤資料查看,具體路徑如下。

2.PC函數介紹。








03 相關測試代碼介紹
1.MotionRT750通過LOCAL連接按鈕的事件處理函數,調用函數ZAux_FastOpen(),選擇連接類型5去連接控制卡(LOCAL連接方式)。

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()去連接控制器(網口連接方式)。


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連接方式)。

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連接方式的單條指令和多條指令交互時間測試結果如下圖所示。

MotionRT750 LOCAL連接方式示意圖

MotionRT750 LOCAL連接方式測試(1k次)

MotionRT750 LOCAL連接方式測試(1w次)

MotionRT750 LOCAL連接方式測試(10w次)
2.MotionRT750通過網口連接方式的單條指令和多條指令交互時間測試結果如下圖所示。

MotionRT750 網口連接方式示意圖

MotionRT750 網口連接方式測試(1k次)

MotionRT750 網口連接方式測試(1w次)

MotionRT750 網口連接方式測試(10w次)
3.ZMC432-V2控制器通過網口連接方式的單條指令和多條指令交互時間測試結果如下圖所示。

ZMC432-V2 網口連接方式示意圖

ZMC432-V2 網口連接方式測試(1k次)

ZMC432-V2 網口連接方式測試(1w次)

ZMC432-V2 網口連接方式測試(10w次)
4.PCIE464控制卡通過PCI連接方式的單條指令和多條指令交互時間測試結果如下圖所示。

PCIE464 PCI連接方式示意圖

PCIE464 PCI連接方式測試(1k次)

PCIE464 PCI連接方式測試(1w次)

PCIE464 PCI連接方式測試(10w次)
接下來是對IO狀態獲取的耗時測試,通過不同的IO狀態獲取模式(周期上報,單指令獲取1個或多個輸入口狀態),對比各連接方式下的總耗時,旨在為實際應用場景提供性能參考,提升數據獲取效率,確保系統能更高效穩定運行。
(1)MotionRT750通過LOCAL連接方式時使用單條指令獲取1個輸入口狀態和單條指令獲取多個輸入口狀態,兩種方式獲取1000個輸入口狀態的總耗時如下。


(2)MotionRT750通過網口連接方式使用周期上報功能獲取輸入口狀態、使用單條指令獲取1個輸入口狀態和使用單條指令獲取多個輸入口狀態,三種方式獲取1000個輸入口狀態的總耗時如下。


(3)ZMC432-V2控制器通過網口連接方式使用周期上報功能獲取輸入口狀態、使用單條指令獲取1個輸入口狀態和使用單條指令獲取多個輸入口狀態,三種方式獲取1000個輸入口狀態的總耗時如下。


(4)PCIE464控制卡通過PCI連接方式使用單條指令獲取1個輸入口狀態和單條指令獲取多個輸入口狀態,兩種方式獲取1000個輸入口狀態的總耗時如下。


05 分析與結論
1.對于MotionRT750的LOCAL方式連接、網口方式連接以及PCI方式和控制器網口方式連接時的單條或多條指令交互時間測試,從上面的運行效果圖的數據顯示來看,可以看出:
當進行1k、1w次和10w次的單指令交互或多條指令交互的時候,MotionRT750的LOCAL連接方式進行單條指令交互所需要的時間(平均2.1us左右)和一次性讀取12個狀態的多條指令交互所需要的時間(平均3.8us左右),都是要比PCI連接和控制器網口連接的方式更快(PCI單條平均42us左右、多條平均105us左右;網口單條平均127us、多條平均177us左右)。

2.對于讀取輸入口狀態指令測試,從運行效果圖的顯示結果來看:
無論是MotionRT750還是控制器,在網口連接下周期上報功能效率最高,避免輪詢引發的多包數據傳輸耗時問題,提升帶寬利用率,總耗時大約僅需0.44ms;
而單指令批量讀取多個輸入口狀態因減少通信次數,耗時時間對比讀取單個輸入口降低約96%;
LOCAL和PCI連接時,雖不支持周期上報功能,但單指令對比下,批量讀取多個輸入口狀態的效率顯著高于讀取單個輸入口。
綜合來看,在實際應用中,選擇哪種數據獲取策略取決于具體的應用場景、數據特性和性能要求。
例如,如果程序需要快速響應單個事件,單條獲取可能更為合適。如果目標是最大化數據處理速度,多條獲取可能更有益。而對于需要定期維護數據新鮮度的應用,周期性獲取是必要的。
3.C++例程講解視頻可點擊→“強實時運動控制內核MotionRT750(六):us級高速交互之C++,為智能裝備提速”查看。
完整代碼獲取地址
▼

本次,正運動技術強實時運動控制內核MotionRT750(六):us級高速交互之C++,為智能裝備提速,就分享到這里。
更多精彩內容請關注“正運動小助手”公眾號,需要相關開發環境與例程代碼,請咨詢正運動技術銷售工程師:400-089-8936。
本文由正運動技術原創,歡迎大家轉載,共同學習,一起提高中國智能制造水平。文章版權歸正運動技術所有,如有轉載請注明文章來源。

正運動技術專注于運動控制技術研究和通用運動控制軟硬件產品的研發,是國家級高新技術企業。正運動技術匯集了來自華為、中興等公司的優秀人才,在堅持自主創新的同時,積極聯合各大高校協同運動控制基礎技術的研究,是國內工控領域發展最快的企業之一,也是國內少有、完整掌握運動控制核心技術和實時工控軟件平臺技術的企業。主要業務有:運動控制卡_運動控制器_EtherCAT運動控制卡_EtherCAT控制器_運動控制系統_視覺控制器__運動控制PLC_運動控制_機器人控制器_視覺定位_XPCIe/XPCI系列運動控制卡等等。
|