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路通用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 等您評測!”查看。
1、Qt進行MotionRT750項目的創建與開發
本案例開發環境是Visual Studio 2022 QT,Qt6.8.2,若使用Qtcreator開發,可跳過第一點。
在Visual Studio 2022上配置Qt的開發環境
1.點擊Visual Studio上方工具欄的擴展→管理擴展。

2.如圖,在瀏覽中搜索Qt,點擊安裝開始下載Qt Visual Studio Tools插件。

3.再次打開Visual Studio,進入Qt Versions。

4.點擊Add添加Qt版本。

5.選中條目之后點擊...去找到qmake.exe文件的位置。

6.下圖標識了6.8.2版本的qmake文件在Qt安裝目錄中的相對位置,不同版本的qmake文件的相對位置規律是一樣的,可以參考這個來確定。

7.隨后使用同樣的方法添加你下載的所有(MSVC)版本即可,添加完之后點擊確定完成插件的設置。

開始新建VS Qt項目運行
1.新建項目。

2.在搜索框輸入Qt可以查看插件為我們提供的所有VS Qt項目模板,一般我們選擇Qt Widgets Application模板即可,選擇后點擊下一步。

3.輸入項目的名稱、位置、解決方案名稱等信息后點擊創建,上述信息一定不要包含中文、空格、特殊字符等,否則后續會報錯。

4.點擊next。

5.將庫文件放入x64/debug中。

6.右鍵Header Files→添加→現有項,把zauxdll.h和zmotion.h添加進Header Files目錄。

7.進入界面設計的代碼編輯界面,添加頭文件#include"../x64/Debug/zauxdll2.h"。

8.在界面設計的頭文件里聲明控制器句柄g_handle。

新項目建立完成,可以進行Qt界面開發。
2、相關函數介紹
1.PC函數手冊可在光盤資料查看,具體路徑如下。










3、相關測試代碼介紹
本次指令交互速度測試使用三種型號的控制器對比測試,以下測試為正運動實驗室測試數據,與配置的電腦與程序代碼等有關系,以下測試數據僅供客戶參考。客戶具體項目以客戶實際測試環境為準。
以下正運動實驗室測試為:XPCIE1032H(需搭配MotionRT750使用)、PCIE464、ZMC432-V2,MotionRT750可以通過LOCAL和網口方式連接,故本次MotionRT750測試使用LOCAL和網口兩種方式進行測試。
1.XPCIE1032H型號運動控制卡使用MotionRT750的LOCAL、網口連接方式測試。

2.ZMC432-V2型號運動控制器使用網口連接方式測試。

3.PCIE464型號運動控制卡使用PCI的連接方式測試。

4.相關測試代碼如下。
①MotionRT750通過LOCAL連接按鈕的事件處理函數,調用函數ZAux_FastOpen(),選擇連接類型5去連接控制卡(LOCAL連接方式)。
void MainWindow::fun2()
{
ctype = 5;
}
void MainWindow::on_btn_open_clicked()
{
int32 iresult;
char * tmp_buff = new char[16];
QString str;
QString str_title;
str = ui->comboBox->currentText();
QByteArray ba = str.toLatin1();
tmp_buff = ba.data();
if(0 != g_handle)
{
ZAux_Close(g_handle);
killTimer(m_nTimerId);
}
iresult = ZAux_FastOpen(ctype,tmp_buff,1000,&g_handle);
if( 0 != iresult)
{
QMessageBox::warning(this,"提示","連接失敗");
}
else
{
QMessageBox::warning(this,"提示","連接成功");
str_title = windowTitle() + tmp_buff;
setWindowTitle(str_title);
m_nTimerId = startTimer(10);
up_State();
}
}
②MotionRT750和ZMC432-V2型號控制器通過網口連接按鈕的事件處理函數,調用函數ZAux_OpenEth()去連接控制器,連接類型為2,且把掃描到的IP地址添加到comboBox條目(網口連接方式)。
void MainWindow::fun3()
{
ctype = 2;
ui->comboBox->clear();
ui->comboBox->addItem("127.0.0.1");
char* ip = new char[10240];
ZAux_SearchEthlist(ip, 10230, 200);
QString ips(ip);
QStringList iplist = ips.split(' ');
qDebug() << iplist;
ui->comboBox->addItems(iplist);
}
void MainWindow::on_btn_open_clicked()
{
int32 iresult;
char * tmp_buff = new char[16];
QString str;
QString str_title;
str = ui->comboBox->currentText();
QByteArray ba = str.toLatin1();
tmp_buff = ba.data();
qDebug()<<"current ip tmp_buff"<<tmp_buff;
if(0 != g_handle)
{
ZAux_Close(g_handle);
killTimer(m_nTimerId);
}
iresult = ZAux_FastOpen(ctype,tmp_buff,1000,&g_handle);
if( 0 != iresult)
{
QMessageBox::warning(this,"提示","連接失敗");
}
else
{
QMessageBox::warning(this,"提示","連接成功");
str_title = windowTitle() + tmp_buff;
setWindowTitle(str_title);
m_nTimerId = startTimer(10);
up_State();
}
}
③PCIE464型號控制卡通過PCI連接按鈕的事件處理函數,調用函數ZAux_FastOpen(),選擇連接類型4去連接控制卡(PCI連接方式)。
void MainWindow::fun1()
{
ctype = 4;
}
void MainWindow::on_btn_open_clicked()
{
int32 iresult;
char * tmp_buff = new char[16];
QString str;
QString str_title;
str = ui->comboBox->currentText();
QByteArray ba = str.toLatin1();
tmp_buff = ba.data();
if(0 != g_handle)
{
ZAux_Close(g_handle);
killTimer(m_nTimerId);
}
iresult = ZAux_FastOpen(ctype,tmp_buff,1000,&g_handle);
if( 0 != iresult)
{
QMessageBox::warning(this,"提示","連接失敗");
}
else
{
QMessageBox::warning(this,"提示","連接成功");
str_title = windowTitle() + tmp_buff;
setWindowTitle(str_title);
m_nTimerId = startTimer(10);
up_State();
}
}
④通過單條指令交互周期的測試按鈕的事件處理函數來計算單條指令的交互平均耗時和總耗時。
void MainWindow::handle_single_command_read_position()
{
float dpos = 0;
int testNum = ui->test_num->text().toInt(); // 從 QComboBox 獲取測試次數
// 使用 QElapsedTimer 測量時間
QElapsedTimer timer;
timer.start();
for (int i = 0; i < testNum; i++)
{
// 進行 n 次單指令交互
ZAux_Direct_GetDpos(g_handle, 0, &dpos);
}
// 獲取總耗時(納秒)
qint64 totalNanoseconds = timer.nsecsElapsed();
// 將納秒轉換為毫秒,并保留小數點后6位
double totalMilliseconds = static_cast<double>(totalNanoseconds) / 1000000.0;
QString totalTimeString = QString::number(totalMilliseconds, 'f', 6);
// 更新 UI
// 總耗時 (ms),保留小數點后六位
ui->single_totaltime->setText(totalTimeString);
// 計算平均耗時(微秒),保留小數點后六位
double averageMicroseconds = (totalMilliseconds * 1000.0) / testNum;
QString averageTimeString = QString::number(averageMicroseconds, 'f', 6);
ui->single_time->setText(averageTimeString);
}
⑤通過多條指令交互周期的測試按鈕的事件處理函數來計算多條指令的交互平均耗時和總耗時。
void MainWindow::handle_multiple_commands()
{
// 獲取測試次數
int testNum = ui->test_num->text().toInt();
QString 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)";
QString cmdBuff;
int star = 0;
QStringList arrS;
// 使用 QElapsedTimer 記錄時間
QElapsedTimer timer;
timer.start();
for (int i = 0; i < testNum; i++)
{
// 創建一個足夠大的緩沖區來存儲返回的命令結果
char buffer[2048];
const char* cmdCStr = cmd.toStdString().c_str();
int result = ZAux_DirectCommand(g_handle, cmdCStr, buffer, sizeof(buffer));
// 將返回的結果追加到 cmdBuff 中
cmdBuff += QString::fromUtf8(buffer);
}
// 獲取總耗時(納秒)
qint64 totalNanoseconds = timer.nsecsElapsed();
// 將納秒轉換為毫秒,并保留小數點后6位
double totalMilliseconds = static_cast<double>(totalNanoseconds) / 1000000.0;
QString totalTimeString = QString::number(totalMilliseconds, 'f', 6);
// 更新 UI
// 總耗時 (ms),保留小數點后六位
ui->Multiple_totaltime->setText(totalTimeString);
// 計算平均耗時(微秒),保留小數點后六位
double averageMicroseconds = (totalMilliseconds * 1000.0) / testNum;
QString averageTimeString = QString::number(averageMicroseconds, 'f', 6);
ui->Multiple_time->setText(averageTimeString);
// 處理返回的字符串
QStringList responseList = cmdBuff.split('\t');
for (const QString& item : responseList)
{
arrS.append(item.trimmed());
}
}
⑥網口連接周期上報的方式獲取輸入口狀態的總耗時測試函數如下。
void MainWindow::handle_periodic_report_input_status()
{
// 創建一個大小為1000的整數數組來存儲輸入狀態
QVector<int> InState(1000);
int singleValue = 0;
// 打開使能周期上報
ZAux_CycleUpEnable(g_handle, 0, 1000, "IN(0,1000)");
// 強制上報一次,0為通道號
int tep0 = ZAux_CycleUpForceOnce(g_handle, 0);
// beforeDT記錄交互指令前的時刻
QElapsedTimer timer; timer.start(); // 啟動計時器
for (uint i = 0; i < 1000; i++)
{
//// 從周期上報內容里面讀取輸入口狀態
int tep1 = ZAux_CycleUpReadBuffInt(g_handle, 0, "IN", i, &singleValue);
InState[i] = singleValue;
}
// 計算總耗時(納秒)
qint64 totalNanoseconds = timer.nsecsElapsed();
// 將納秒轉換為毫秒,并保留小數點后6位
double totalMilliseconds = static_cast<double>(totalNanoseconds) / 1000000.0;
QString timeString = QString::number(totalMilliseconds, 'f', 6);
// 顯示總耗時
ui->periodtime->setText(timeString);
// 關閉使能周期上報
ZAux_CycleUpDisable(g_handle, 0);
}
⑦單條指令讀取1個輸入口狀態的總耗時測試函數如下。
void MainWindow::handle_single_command_read_one_input()
{
// 創建一個大小為1000的無符號整數數組來存儲輸入狀態
QVector<uint> InState(1000);
uint singleValue = 0;
// beforeDT記錄交互指令前的時刻
QElapsedTimer timer;
timer.start();
for (int i = 0; i < 1000; i++)
{
// 單條指令讀取單個輸入口狀態
ZAux_Direct_GetIn(g_handle, i, &singleValue);
InState[i] = singleValue;
}
// 獲取總耗時(納秒)
qint64 totalNanoseconds = timer.nsecsElapsed();
// 將納秒轉換為毫秒,并保留小數點后6位
double totalMilliseconds = static_cast<double>(totalNanoseconds) / 1000000.0;
QString totalTimeString = QString::number(totalMilliseconds, 'f', 6);
// 將總耗時顯示在 single_IO 上,保留小數點后六位
ui->single_IO->setText(totalTimeString);
}
⑧單條指令讀取多個輸入口狀態的總耗時測試函數如下。
void MainWindow::handle_single_command_read_multiple_inputs()
{
// 創建一個大小為32的整數數組來存儲輸入狀態
QVector<int> InState(32);
// 使用 QElapsedTimer 記錄時間
QElapsedTimer timer; timer.start();
// 單條指令讀取多個輸入口狀態,輸入口狀態按位進行存儲
// 一個 INT 型數組可以存儲 32 個輸入口狀態,可讀取 32 個及以上
ZAux_Direct_GetInMulti(g_handle, 0, 999, InState.data());
// 獲取總耗時(納秒)
qint64 totalNanoseconds = timer.nsecsElapsed();
// 將納秒轉換為毫秒,并保留小數點后6位
double totalMilliseconds = static_cast<double>(totalNanoseconds) / 1000000.0;
QString totalTimeString = QString::number(totalMilliseconds, 'f', 6);
// 將總耗時顯示在 multiple_IO 上,保留小數點后六位
ui->multiple_IO->setText(totalTimeString);
}
4、運行效果
1.MotionRT750通過LOCAL連接方式的交互時間測試結果如下圖所示。


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

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

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


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

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

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


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

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

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


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

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

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

綜上所述,我們可以從測試結果看出,MotionRT750的LOCAL連接方式展現卓越的實時性能,指令交互的效率也非常的穩定。
當測試次數從1k增加到1w、10w次時,指令交互時間波動不大,在延遲、穩定性上全面優于PCI和控制器網口的連接,更加適合高精度、高實時性、高穩定性的工業運動控制場景應用。
Qt例程講解教學視頻可點擊→“強實時運動控制內核MotionRT750(七):us級高速交互之Qt,為智能裝備提速”查看。
完整代碼獲取地址
▼

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

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