今天,正運(yùn)動(dòng)小助手給大家分享一下EtherCAT運(yùn)動(dòng)控制卡開(kāi)發(fā)教程之Qt,主要介紹一下如何通過(guò)Qt編程實(shí)現(xiàn)小線(xiàn)段軌跡連續(xù)加工,暫停與繼續(xù)。
ECI2828運(yùn)動(dòng)控制卡的硬件介紹
ECI2828系列控制卡支持最多達(dá)16軸直線(xiàn)插補(bǔ)、任意圓弧插補(bǔ)、空間圓弧、螺旋插補(bǔ)、電子凸輪、電子齒輪、同步跟隨、虛擬軸、機(jī)械手指令等;采用優(yōu)化的網(wǎng)絡(luò)通訊協(xié)議可以實(shí)現(xiàn)實(shí)時(shí)的運(yùn)動(dòng)控制。
ECI2828系列運(yùn)動(dòng)控制卡支持以太網(wǎng),232通訊接口和電腦相連,接收電腦的指令運(yùn)行,可以通過(guò)EtherCAT總線(xiàn)和CAN總線(xiàn)去連接各個(gè)擴(kuò)展模塊,從而擴(kuò)展輸入輸出點(diǎn)數(shù)或運(yùn)動(dòng)軸。
ECI2828系列運(yùn)動(dòng)控制卡的應(yīng)用程序可以使用VC、VB、VS、C++、C#等多種高級(jí)語(yǔ)言編程來(lái)開(kāi)發(fā),程序運(yùn)行時(shí)需要?jiǎng)討B(tài)庫(kù)zmotion.dll。調(diào)試時(shí)可以把ZDevelop軟件同時(shí)連接到控制器,從而方便調(diào)試、方便觀察。
![1.png](https://file.elecfans.com//web2/M00/43/8B/pYYBAGJ-JQ-AHQuAAAJc9gIkfRg260.png)
一、Qt進(jìn)行運(yùn)動(dòng)控制卡開(kāi)發(fā)的流程
1.新建Qt項(xiàng)目。
![2.png](https://file.elecfans.com//web2/M00/43/88/poYBAGJ-JQ-APwK_AACv3Tg7a2A792.png)
圖1:新建Qt項(xiàng)目
![3.png](https://file.elecfans.com//web2/M00/43/8B/pYYBAGJ-JQ-ATmmYAABWGzzwdRM062.png)
圖2:選擇項(xiàng)目路徑
![4.png](https://file.elecfans.com//web2/M00/43/88/poYBAGJ-JQ-AGu0OAABs3XV62SM900.png)
圖3:選擇Qt編譯套件(kits)
![5.png](https://file.elecfans.com//web2/M00/43/8B/pYYBAGJ-JQ-AfwmfAABZZdjlnd8630.png)
圖4:選擇基類(lèi)
2.將函數(shù)庫(kù)相關(guān)的文件復(fù)制到新建的項(xiàng)目中。
![6.png](https://file.elecfans.com//web2/M00/43/88/poYBAGJ-JQ-AVNvPAAFWt83kenE078.png)
3.向新建的項(xiàng)目里面添加函數(shù)庫(kù)的靜態(tài)庫(kù)。(zmotion.lib)
![7.png](https://file.elecfans.com//web2/M00/43/8B/pYYBAGJ-JQ-AUZ0-AAGOIPQDt5U333.png)
第一步:添加函數(shù)庫(kù)1
![8.png](https://file.elecfans.com//web2/M00/43/88/poYBAGJ-JRCACmZLAAC3hlAPBRM406.png)
第二步:添加函數(shù)庫(kù)2
![9.png](https://file.elecfans.com//web2/M00/43/8B/pYYBAGJ-JRCADTCEAADJwkYXy_M221.png)
第三步:添加函數(shù)庫(kù)3
4.添加函數(shù)庫(kù)相關(guān)的頭文件到項(xiàng)目中。
![10.png](https://file.elecfans.com//web2/M00/43/88/poYBAGJ-JRCARsDIAACjcOaA7Fc359.png)
5.聲明相關(guān)頭文件,并定義連接句柄。
![11.png](https://file.elecfans.com//web2/M00/43/8B/pYYBAGJ-JRCAYNrMAADH5EfeV7M042.png)
二、PC函數(shù)介紹
1.PC函數(shù)手冊(cè)也在光盤(pán)資料里面,具體路徑如下:“光盤(pán)資料\8.PC函數(shù)\函數(shù)庫(kù)2.1\ZMotion函數(shù)庫(kù)編程手冊(cè) V2.1.pdf”。
![12.png](https://file.elecfans.com//web2/M00/43/88/poYBAGJ-JRCAaiOqAABTpvwhw2U599.png)
2.PC編程,一般如果網(wǎng)口對(duì)控制器和工控機(jī)進(jìn)行鏈接。網(wǎng)口鏈接函數(shù)接口是ZAux_OpenEth();如果鏈接成功,該接口會(huì)返回一個(gè)鏈接句柄。通過(guò)操作這個(gè)鏈接句柄可以實(shí)現(xiàn)對(duì)控制器的控制。
ZAux_OpenEth()接口說(shuō)明:
![13.png](https://file.elecfans.com//web2/M00/43/8B/pYYBAGJ-JRCAScUMAAArC7dCY1o731.png)
3.連續(xù)插補(bǔ)和S曲線(xiàn)設(shè)置相關(guān)指令介紹。
![14.png](https://file.elecfans.com//web2/M00/43/88/poYBAGJ-JRCAdE-KAABKmwSg2vw412.png)
4.拐角模式設(shè)置相關(guān)指令介紹。
![15.png](https://file.elecfans.com//web2/M00/43/8B/pYYBAGJ-JRGAP6DhAABU2NosChU860.png)
![16.png](https://file.elecfans.com//web2/M00/43/88/poYBAGJ-JRGASvtkAABPWLIHeK8320.png)
![17.png](https://file.elecfans.com//web2/M00/43/88/poYBAGJ-JRGAbZatAAAkrObS7S4221.png)
三、Qt開(kāi)發(fā)實(shí)現(xiàn)小線(xiàn)段軌跡連續(xù)加工、暫停與繼續(xù)
1.Qt例程界面如下。
![18.png](https://file.elecfans.com//web2/M00/43/8B/pYYBAGJ-JRGAcB-bAAD1PrhEtmw527.png)
2.在構(gòu)造函數(shù)里面調(diào)用鏈接控制器的接口ZAux_OpenEth(),與控制器進(jìn)行鏈接,鏈接成功后啟動(dòng)定時(shí)器監(jiān)控控制器的軸信息。
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
int rint=0;
ui->setupUi(this);
//系統(tǒng)啟動(dòng)自動(dòng)連接控制器
rint = ZAux_OpenEth("192.168.0.223", &g_handle);
//如果鏈接成功則啟動(dòng)定時(shí)器
if(rint==0)
{
startTimer(50);
}
}
3.通過(guò)定時(shí)器更新控制器各個(gè)軸的位置和速度信息。
//定時(shí)器事件
void MainWindow::timerEvent(QTimerEvent *event)
{
QString StrText;
float AxisDpos[3]={0};
float AxisMspeed[3]={0};
if(NULL != g_handle)
{
for(int i=0;i<3;i++)
{
//獲取軸0的位置信息
ZAux_Direct_GetDpos(g_handle,i,&AxisDpos[i]);
//獲取軸0的速度信息
ZAux_Direct_GetMspeed(g_handle,i,&AxisMspeed[i]);
}
StrText = QString("#軸0位置:(%1) #軸1位置:(%2) #軸2位置:(%3)").arg(AxisDpos[0]).arg(AxisDpos[1]).arg(AxisDpos[2]);
ui->AxisDpos->setText(StrText);
StrText = QString("#軸0速度:(%1) #軸1速度:(%2) #軸2速度:(%3)").arg(AxisMspeed[0]).arg(AxisMspeed[1]).arg(AxisMspeed[2]);
ui->AxisMspeed->setText(StrText);
}
}
4.連續(xù)小線(xiàn)段的加工。(1)通過(guò)ZCADToMore2.0導(dǎo)圖工具將“dxf”格式的CAD圖紙導(dǎo)成“Z3P”文件的格式并下載到控制器里面。
(點(diǎn)擊控制器→發(fā)送到控制器按鈕,即可把代碼顯示窗口中的代碼發(fā)送到控制器中,在控制器中的文件名為:ZCAD.z3p)
![19.png](https://file.elecfans.com//web2/M00/43/88/poYBAGJ-JRGAfh7pAAFIoz-PLNA291.png)
(2)搜索控制器里面的Z3P文件。
//搜索Z3P文件
void MainWindow::on_Search_clicked()
{
char Buff[1024]={"123"};
//搜索Z3P文件,結(jié)果放到VR(0) 開(kāi)始的寄存器存儲(chǔ)
ZAux_Execute(g_handle, "FILE "FLASH_FIRST", ".z3p",0", NULL, 0);
//獲取VR寄存器里面的文件名
ZAux_Execute(g_handle, "?vrstring(0,128)", Buff, 1024);
//去除文件名的\n
int Len = strlen(Buff);
Buff[Len-1]=0;
QString Str = QString(QLatin1String(Buff));
//更新到UI界面上
ui->lineEdit->setText(Str);
qDebug()<<
}
(3)通過(guò)啟動(dòng)按鈕啟動(dòng)Z3P文件。
//啟動(dòng)按鈕槽函數(shù):設(shè)置拐角模式,開(kāi)始運(yùn)行Z3P文件
void MainWindow::on_RunButton_clicked()
{
QString Text;
int AxisList[3] = {0,1,2};
float DisList[3]={0};
//設(shè)置軸參數(shù)
for(int i=0; i<3; i++)
{
//軸類(lèi)型設(shè)置為脈沖軸
ZAux_Direct_SetAtype(g_handle,i,1);
//設(shè)置脈沖當(dāng)量,一般設(shè)置成機(jī)臺(tái)運(yùn)動(dòng)1mm需要的脈沖數(shù)
ZAux_Direct_SetUnits(g_handle,i,1000);
//設(shè)置軸運(yùn)動(dòng)速度
ZAux_Direct_SetSpeed(g_handle,i,200);
//設(shè)置軸的加速度
ZAux_Direct_SetAccel(g_handle,i,2000);
//設(shè)置軸的減速度
ZAux_Direct_SetDecel(g_handle,i,2000);
//打開(kāi)連續(xù)插補(bǔ)
ZAux_Direct_SetMerge(g_handle,i,1);
//設(shè)置S曲線(xiàn)參數(shù)
ZAux_Direct_SetSramp(g_handle,i,250);
}
//設(shè)置拐角模式
int CornerMode=0;
//是否打開(kāi)自動(dòng)倒角
if(ui->IsChamfer->checkState())
{
CornerMode = 32+CornerMode;
}
//是否打開(kāi)拐角減速
if(ui->IsSlowDown->checkState())
{
CornerMode = 2+CornerMode;
//設(shè)置開(kāi)始減速角度
Text = ui->StartAngle->toPlainText();
ZAux_Direct_SetDecelAngle(g_handle,AxisList[0],Text.toFloat()*3.14/180);
//設(shè)置停止減速角度
Text = ui->StopAngle->toPlainText();
ZAux_Direct_SetStopAngle(g_handle,AxisList[0],Text.toFloat()*3.14/180);
//設(shè)置參數(shù)速度
Text = ui->SpSpeed->toPlainText();
ZAux_Direct_SetForceSpeed(g_handle,AxisList[0],Text.toFloat());
}
//是否打開(kāi)小圓限速
if(ui->IsMinCir->checkState())
{
CornerMode = 8+CornerMode;
//設(shè)置限速半徑
Text = ui->CirRadius->toPlainText();
ZAux_Direct_SetFullSpRadius(g_handle,AxisList[0],Text.toFloat());
//設(shè)置參數(shù)速度
Text = ui->SpSpeed->toPlainText();
ZAux_Direct_SetForceSpeed(g_handle,AxisList[0],Text.toFloat());
}
ZAux_Direct_SetCornerMode(g_handle,AxisList[0],CornerMode);
//停止線(xiàn)程1
ZAux_Execute(g_handle, "STOPTASK 1", NULL, 0);
//啟動(dòng)Z3P文件
char CmdBuff[64];
char *str = ui->lineEdit->text().toLatin1().data();
sprintf(CmdBuff, "FILE3_RUN "%s",1",str);
ZAux_Execute(g_handle, CmdBuff, NULL, 0);
}
5.通過(guò)停止按鈕的槽函數(shù)調(diào)用軸運(yùn)動(dòng)停止指令停止軸運(yùn)動(dòng)
//停止軸運(yùn)動(dòng)
void MainWindow::on_StopButton_clicked()
{
//停止線(xiàn)程1
ZAux_Execute(g_handle, "STOPTASK 1", NULL, 0);
//停止軸運(yùn)動(dòng)
ZAux_Direct_Rapidstop(g_handle,2);
}
6.小線(xiàn)段連續(xù)軌跡加工的暫停與繼續(xù)。
//暫停運(yùn)動(dòng)
void MainWindow::on_Suspended_clicked()
{
//暫停軸運(yùn)動(dòng)
ZAux_Direct_MovePause(g_handle,0,0);
//暫停線(xiàn)程1
ZAux_Execute(g_handle, "PAUSETASK 1", NULL, 0);
}
//恢復(fù)運(yùn)動(dòng)
void MainWindow::on_Restore_clicked()
{
//恢復(fù)軸運(yùn)動(dòng)
ZAux_Direct_MoveResume(g_handle,0);
//恢復(fù)線(xiàn)程1
ZAux_Execute(g_handle, "RESUMETASK 1", NULL, 0);
}
四、例程移植到Linux設(shè)備上
1.Linux對(duì)應(yīng)架構(gòu)的庫(kù)復(fù)制到項(xiàng)目文件夾里面。
![20.png](https://file.elecfans.com//web2/M00/43/8B/pYYBAGJ-JRGAcQJkAAFKT8sW95k183.png)
2.向新建的項(xiàng)目里面添加函數(shù)庫(kù)的靜態(tài)庫(kù)。(libzmotion.so)
![21.png](https://file.elecfans.com//web2/M00/43/88/poYBAGJ-JRGALWCRAACqwSNcQcM161.png)
添加函數(shù)庫(kù)1
![22.png](https://file.elecfans.com//web2/M00/43/8B/pYYBAGJ-JRKARR9VAADCCqhzB-A879.png)
添加函數(shù)庫(kù)2
![23.png](https://file.elecfans.com//web2/M00/43/88/poYBAGJ-JRKAFIjTAACrtZNDd78285.png)
添加函數(shù)庫(kù)3
→至此,重新編譯即可運(yùn)行。
3.調(diào)試與監(jiān)控。
編譯運(yùn)行例程,同時(shí)連接ZDevelop軟件進(jìn)行調(diào)試,對(duì)運(yùn)動(dòng)控制的軸參數(shù)和運(yùn)動(dòng)情況進(jìn)行監(jiān)控。
(1)小線(xiàn)段軌跡加工的X-Y位置波形圖。
![24.png](https://file.elecfans.com//web2/M00/43/8B/pYYBAGJ-JRKAEGgfAACK9cKkkLo565.png)
(2)小線(xiàn)段軌跡加工的速度波形圖。(連續(xù)插補(bǔ)未打開(kāi)拐角減速)
![25.png](https://file.elecfans.com//web2/M00/43/88/poYBAGJ-JRKAKgX3AADpg5s4YEY779.png)
(3)小線(xiàn)段軌跡加工的速度波形圖。
(連續(xù)插補(bǔ)設(shè)置拐角減速)
![26.png](https://file.elecfans.com//web2/M00/43/8B/pYYBAGJ-JRKATh6zAAENHmClrGc104.png)
本次,正運(yùn)動(dòng)技術(shù)EtherCAT運(yùn)動(dòng)控制卡開(kāi)發(fā)教程之Qt(中):小線(xiàn)段連續(xù)軌跡加工、暫停與繼續(xù),就分享到這里。
-
運(yùn)動(dòng)控制
+關(guān)注
關(guān)注
4文章
592瀏覽量
32996 -
ethercat
+關(guān)注
關(guān)注
19文章
751瀏覽量
38922 -
qt編程
+關(guān)注
關(guān)注
0文章
4瀏覽量
6284
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
激光自身空間維度加工系統(tǒng)綜述
![激光自身空間維度<b class='flag-5'>加工</b>系統(tǒng)綜述](https://file1.elecfans.com/web3/M00/06/2B/wKgZPGeIdeiAVfYuAAAgolOrS1s706.png)
AN-1310:通過(guò)MDIO實(shí)現(xiàn)閃存編程—協(xié)議類(lèi)型8
![AN-1310:<b class='flag-5'>通過(guò)</b>MDIO<b class='flag-5'>實(shí)現(xiàn)</b>閃存<b class='flag-5'>編程</b>—協(xié)議類(lèi)型8](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
運(yùn)動(dòng)控制中如何實(shí)現(xiàn)路徑軌跡預(yù)測(cè)
![運(yùn)動(dòng)控制中如何<b class='flag-5'>實(shí)現(xiàn)</b>路徑<b class='flag-5'>軌跡</b>預(yù)測(cè)](https://file1.elecfans.com/web3/M00/04/E1/wKgZPGd5952AHqU1AAAi9A0emyM898.png)
數(shù)控車(chē)削中的粗加工的編程方法
![數(shù)控車(chē)削中的粗<b class='flag-5'>加工</b>的<b class='flag-5'>編程</b>方法](https://file1.elecfans.com/web3/M00/00/D8/wKgZO2dOdfiAKT8DAAAUy4ygMdQ874.jpg)
一種創(chuàng)新的動(dòng)態(tài)軌跡預(yù)測(cè)方法
![一種創(chuàng)新的動(dòng)態(tài)<b class='flag-5'>軌跡</b>預(yù)測(cè)方法](https://file1.elecfans.com/web2/M00/0B/46/wKgaomcfMJmAXFYrAAEzgGcXUbU308.jpg)
園區(qū)封閉化管理之人員和車(chē)輛定位及軌跡追蹤
![園區(qū)封閉化管理之人員和車(chē)輛定位及<b class='flag-5'>軌跡</b>追蹤](https://file1.elecfans.com/web2/M00/00/16/wKgZomasUXOAYAfSAB27RdPRsQk070.png)
人員軌跡分析算法有哪些?
EtherCAT運(yùn)動(dòng)控制器上位機(jī)開(kāi)發(fā)之Python+Qt(三):PDO配置與SDO讀寫(xiě)
![EtherCAT運(yùn)動(dòng)控制器上位機(jī)開(kāi)發(fā)之Python+<b class='flag-5'>Qt</b>(三):PDO配置與SDO讀寫(xiě)](https://file1.elecfans.com/web2/M00/04/96/wKgaombFm8WALm3mAAGPukKpE2k266.png)
人員定位及軌跡管理技術(shù)原理及應(yīng)用領(lǐng)域
![人員定位及<b class='flag-5'>軌跡</b>管理技術(shù)原理及應(yīng)用領(lǐng)域](https://file1.elecfans.com/web2/M00/01/6F/wKgZoma1gfWAZ3kPAAIa9YzK4hA744.png)
評(píng)論