時(shí)間:2021-11-11 16:05:56來源:深圳市正運(yùn)動(dòng)技術(shù)有限公司
今天,正運(yùn)動(dòng)小助手給大家分享一下運(yùn)動(dòng)控制卡之ECI3808如何在大量小線段數(shù)據(jù)的情況下一次性加載多條連續(xù)小線段數(shù)據(jù)。
一ECI3808硬件介紹
1.功能介紹
ECI3808系列控制卡支持最多達(dá)12軸直線插補(bǔ)、任意圓弧插補(bǔ)、空間圓弧、螺旋插補(bǔ)、電子凸輪、電子齒輪、同步跟隨、虛擬軸、機(jī)械手指令等;采用優(yōu)化的網(wǎng)絡(luò)通訊協(xié)議可以實(shí)現(xiàn)實(shí)時(shí)的運(yùn)動(dòng)控制。
ECI3808系列運(yùn)動(dòng)控制卡支持以太網(wǎng),RS232 通訊接口和電腦相連,接收電腦的指令運(yùn)行,可以通過CAN總線去連接各個(gè)擴(kuò)展模塊,從而擴(kuò)展輸入輸出點(diǎn)數(shù)或運(yùn)動(dòng)軸。
ECI3808系列運(yùn)動(dòng)控制卡的應(yīng)用程序可以使用 VC,VB,VS,C++,C#等軟件來開發(fā),程序運(yùn)行時(shí)需要?jiǎng)討B(tài)庫 zmotion.dll。調(diào)試時(shí)可以把ZDevelop軟件同時(shí)連接到控制器,從而方便調(diào)試和觀察。
2.硬件接口
通用輸入口電路
通用輸出口電路
AD/DA接口說明
本地脈沖軸說明
3.控制器基本信息
二、C++進(jìn)行運(yùn)動(dòng)控制開發(fā)
1.新建MFC項(xiàng)目并添加函數(shù)庫
(1)在VS2015菜單“文件”→“新建”→ “項(xiàng)目”,啟動(dòng)創(chuàng)建項(xiàng)目向?qū)А?/p>
(2)選擇開發(fā)語言為“Visual C++”和程序類型“MFC應(yīng)用程序”。
(3)點(diǎn)擊下一步即可。
(4)選擇類型為“基于對(duì)話框”,下一步或者完成。
(5)找到廠家提供的光盤資料,路徑如下(64位庫為例)。
A.進(jìn)入廠商提供的光盤資料找到“8.PC函數(shù)”文件夾,并點(diǎn)擊進(jìn)入。
B.選擇“函數(shù)庫2.1”文件夾。
C.選擇“Windows平臺(tái)”文件夾。
D.根據(jù)需要選擇對(duì)應(yīng)的函數(shù)庫這里選擇64位庫。
E.解壓C++的壓縮包,里面有C++對(duì)應(yīng)的函數(shù)庫。
F.函數(shù)庫具體路徑如下。
(6)將廠商提供的C++的庫文件和相關(guān)頭文件復(fù)制到新建的項(xiàng)目里面。
(7)在項(xiàng)目中添加靜態(tài)庫和相關(guān)頭文件。
A.先右擊項(xiàng)目文件,接著依次選擇:“添加”→“現(xiàn)有項(xiàng)”。
B.在彈出的窗口中依次添加靜態(tài)庫和相關(guān)頭文件。
(8)聲明用到的頭文件和定義控制器連接句柄。
至此項(xiàng)目新建完成,可進(jìn)行MFC項(xiàng)目開發(fā)。
2.查看PC函數(shù)手冊(cè),熟悉相關(guān)函數(shù)接口。
(1)PC函數(shù)手冊(cè)也在光盤資料里面,具體路徑如下:“光盤資料\8.PC函數(shù)\函數(shù)庫2.1\ZMotion函數(shù)庫編程手冊(cè) V2.1.pdf”
(2)鏈接控制器,獲取鏈接句柄。
ZAux_OpenEth()接口說明:
(3)利用直接basic命令發(fā)送實(shí)現(xiàn)功能函數(shù)。
ZAux_DirectCommand函數(shù)直接下發(fā)命令執(zhí)行basic功能塊,指令運(yùn)行速度快,但是需要加載緩沖的指令不能成功執(zhí)行,能夠成功執(zhí)行的下發(fā)指令推薦使用,加快效率。
ZAux_Execute函數(shù)直接下發(fā)命令執(zhí)行basic功能塊,執(zhí)行指令速度會(huì)阻塞,執(zhí)行速度慢一些,所有能夠執(zhí)行的字符串命令都可以成功執(zhí)行。
3.MFC開發(fā)控制器硬件外設(shè)讀寫例程。
(1)例程界面如下。
(2)例程界面由三個(gè)部分組成。
A.一是連接部分,用于連接當(dāng)前的控制器,獲取到控制器的句柄進(jìn)行之后的操作。
B.二是狀態(tài)檢測(cè)部分,可以查看到當(dāng)前控制器的軸坐標(biāo),軸狀態(tài),運(yùn)動(dòng)狀態(tài)以及緩沖區(qū)剩余大小。
C.三是參數(shù)設(shè)置部分進(jìn)行設(shè)置控制器的運(yùn)動(dòng)參數(shù),加減速以及速度等。
(3)鏈接按鈕的事件處理函數(shù)中調(diào)用鏈接控制器的接口函數(shù)ZAux_OpenEth(),與控制器進(jìn)行鏈接,鏈接成功后啟動(dòng)定時(shí)器1監(jiān)控控制器狀態(tài)。
//網(wǎng)口鏈接控制器void CSingle_move_Dlg::OnOpen(){ char buffer[256]; int32 iresult; //如果已經(jīng)鏈接,則先斷開鏈接 if(NULL != g_handle) { ZAux_Close(g_handle); g_handle = NULL; } //從IP下拉框中選擇獲取IP地址 GetDlgItemText(IDC_IPLIST,buffer,255); buffer[255] = '\0'; //開始鏈接控制器 iresult = ZAux_OpenEth(buffer, &g_handle); if(ERR_SUCCESS != iresult) { g_handle = NULL; MessageBox(_T("鏈接失敗")); SetWindowText("未鏈接"); return; } //鏈接成功開啟定時(shí)器1 SetWindowText("已鏈接"); SetTimer( 1, 100, NULL ); }
(4)通過定時(shí)器監(jiān)控控制器狀態(tài),定時(shí)器1讀取各軸當(dāng)前的狀態(tài),定時(shí)器2進(jìn)行加載當(dāng)前的運(yùn)動(dòng)數(shù)據(jù)并進(jìn)行對(duì)應(yīng)運(yùn)動(dòng),每次運(yùn)動(dòng)加載1000條小線段數(shù)據(jù)。
void CTest_multiMoveDlg::OnTimer(UINT_PTR nIDEvent){ if(NULL == g_handle) { MessageBox(_T("鏈接斷開")); return ; } uint32 iret = 0 ; if(1 == nIDEvent) { CString AxisPos; CString AxisStatus; CString AxisIdle; CString AxisBuffer; float showpos[4] ={0}; float showstatus[4] ={0}; float showidle[4] ={0}; int showbuff[4] ={0}; iret = ZAux_Direct_GetAllAxisPara( g_handle,"DPOS",4,showpos); //獲取當(dāng)前軸位置 iret = ZAux_Direct_GetAllAxisPara( g_handle,"AXISSTATUS",4,showstatus); //獲取當(dāng)前軸位置 iret = ZAux_Direct_GetAllAxisPara( g_handle,"IDLE",4,showidle); //獲取當(dāng)前軸位置 iret = ZAux_Direct_GetRemain_LineBuffer(g_handle,0,&showbuff[0]); iret = ZAux_Direct_GetRemain_LineBuffer(g_handle,1,&showbuff[1]); iret = ZAux_Direct_GetRemain_LineBuffer(g_handle,2,&showbuff[2]); iret = ZAux_Direct_GetRemain_LineBuffer(g_handle,3,&showbuff[3]); AxisPos.Format("軸坐標(biāo) X: %.2f Y: %.2f Z: %.2f U: %.2f",showpos[0],showpos[1],showpos[2],showpos[3]); AxisStatus.Format("軸狀態(tài) X: %.0f Y: %.0f Z: %.0f U: %.0f",showstatus[0],showstatus[1],showstatus[2],showstatus[3]); AxisIdle.Format("運(yùn)動(dòng)狀態(tài) X: %s Y: %s Z: %s U: %s",showidle[0]?"停止":"運(yùn)動(dòng)中",showidle[1]?"停止":"運(yùn)動(dòng)中",showidle[2]?"停止":"運(yùn)動(dòng)中",showidle[3]?"停止":"運(yùn)動(dòng)中"); AxisBuffer.Format("剩余直線緩沖 X: %d Y: %d Z: %d U: %.d",showbuff[0],showbuff[1],showbuff[2],showbuff[3]); GetDlgItem( IDC_AXISPOS )->SetWindowText( AxisPos ); GetDlgItem( IDC_AXISSTATUS )->SetWindowText( AxisStatus ); GetDlgItem( IDC_AXISIDLE )->SetWindowText( AxisIdle ); GetDlgItem( IDC_REMAINBUFF )->SetWindowText( AxisBuffer ); } if(2 == nIDEvent) { int axislist[4] = {0,1,2,3}; //運(yùn)動(dòng)BASE軸列表 int iresult = 0; int iLen = 10; //單次發(fā)送運(yùn)動(dòng)長(zhǎng)度 if (LEGS_MAX < g_curseges) //超過長(zhǎng)度范圍 { iLen = g_curseges - LEGS_MAX; } iresult = ZAux_Direct_MultiMoveAbs(g_handle, iLen, 4, axislist, destdis[g_curseges]); //iresult = ZAux_Direct_MultiMove(g_handle,iLen, 4,axislist, destdis[g_curseges]);相對(duì) if (ERR_OK != iresult) { //運(yùn)動(dòng)發(fā)送失敗, CString str; str.Format("%d", iresult); } else { g_curseges += iLen; if (g_curseges > LEGS_MAX) //是否填完 { KillTimer(2); return; } } } CDialog::OnTimer(nIDEvent); }
(5)一次性加載多條小線段,并在加載完成之后進(jìn)行運(yùn)動(dòng)。
/*************************************************************Description: //多條相對(duì)多軸直線插補(bǔ) Input: //卡鏈接handle iMoveLen 填寫的運(yùn)動(dòng)長(zhǎng)度 imaxaxises 參與運(yùn)動(dòng)總軸數(shù) piAxislist 軸號(hào)列表 pfDisancelist 距離列表Output: //Return: //錯(cuò)誤碼*************************************************************/int32 __stdcall ZAux_Direct_MultiMoveAbs(ZMC_HANDLE handle,int iMoveLen, int imaxaxises, int *piAxislist, float *pfDisancelist){ int i,j; int32 iresult; char cmdbuff[2048]; char tempbuff[2048]; char cmdbuffAck[2048]; if(0 > imaxaxises || imaxaxises > MAX_AXIS_AUX) { return ERR_AUX_PARAERR; } //先讀取剩余直線緩沖 int iBuffLen = 0; iresult = ZAux_Direct_GetRemain_LineBuffer(handle,piAxislist[0],&iBuffLen); if(iBuffLen <= iMoveLen) { return 1002; //緩沖不夠 } //生成命令BASE命令 strcpy(cmdbuff, "BASE("); for(i = 0; i< imaxaxises-1; i++) { sprintf(tempbuff, "%d,",piAxislist[i]); strcat(cmdbuff, tempbuff); } sprintf(tempbuff, "%d)",piAxislist[imaxaxises-1]); strcat(cmdbuff, tempbuff); //換行 strcat(cmdbuff, "\n"); //生成運(yùn)動(dòng)命令 for(j=0;j<imovelen;j++) if(ilen="" 獲取命令長(zhǎng)度="" ilen="strlen(cmdbuff);" int="" }="" tempbuff);="" strcat(cmdbuff,="" j*imaxaxises]);="" +="" ?%f)\n?,pfdisancelist[i="" sprintf(tempbuff,="" +j*imaxaxises]);="" ?%f,?,pfdisancelist[i="" {="" i++)="" imaxaxises-1;="" i<="" i="0;">1000) { return 20002; } //調(diào)用命令執(zhí)行函數(shù) return ZAux_DirectCommand(handle, cmdbuff, cmdbuffAck, 2048);}
注:如上面代碼表述,此函數(shù)需要傳入小線段條數(shù),以及對(duì)應(yīng)的數(shù)據(jù)內(nèi)容,利用獲取到的數(shù)據(jù)內(nèi)容組成多條小線段運(yùn)動(dòng)的move指令直接下發(fā),不通過每條指令重新處理的方式進(jìn)行運(yùn)動(dòng)下發(fā),以達(dá)到加快效率的目的.
防止出現(xiàn)上位機(jī)下發(fā)指令速度不夠?qū)е逻\(yùn)行過程中間出現(xiàn)運(yùn)動(dòng)執(zhí)行完成速度直接降到0的情況,在運(yùn)行過程中會(huì)進(jìn)行判斷下發(fā)的字符是否超過能夠下發(fā)的最大字符,若超過則會(huì)返回對(duì)應(yīng)的錯(cuò)誤碼。
(6)通過斷開按鈕的事件處理函數(shù)來斷開與控制卡的連接。
void CSingle_move_Dlg::OnClose() //斷開鏈接{ // TODO: Add your control notification handler code here if(NULL != g_handle) { KillTimer(1); //關(guān)定時(shí)器 KillTimer(2); ZAux_Close(g_handle); g_handle = NULL; SetWindowText("未鏈接"); }}
(7)通過啟動(dòng)按鈕的事件處理函數(shù)進(jìn)行設(shè)置參數(shù),并開啟定時(shí)器2進(jìn)行運(yùn)動(dòng)指令的下發(fā)。
void CTest_multiMoveDlg::OnStart() //啟動(dòng){ if(NULL == g_handle) { MessageBox(_T("鏈接斷開")); return ; } UpdateData(true);//刷新參數(shù) int corner_mode = 0; int axislist[4] = {0,1,2,3}; //運(yùn)動(dòng)BASE軸列表 //選擇參與運(yùn)動(dòng)的軸,第一個(gè)軸為主軸,插補(bǔ)參數(shù)全用主軸參數(shù) ZAux_Direct_SetUnits(g_handle, axislist[0], m_units); //脈沖當(dāng)量 ZAux_Direct_SetSpeed(g_handle,axislist[0],m_speed); //速度 UNITS / S ZAux_Direct_SetAccel(g_handle,axislist[0],m_accel); //加速度 ZAux_Direct_SetDecel(g_handle,axislist[0],m_decel); //減速度UpdateData(true);//刷新參數(shù) ZAux_Direct_SetMerge(g_handle,axislist[0],1); //連續(xù)插補(bǔ)開關(guān) ZAux_Direct_SetLspeed(g_handle,axislist[0],0); //起始速度 ,拐角減速由 運(yùn)動(dòng)速度-起始速度 線性減速的 ZAux_Direct_SetCornerMode(g_handle,axislist[0],0); //拐角模式 0-開啟 ZAux_Direct_SetDecelAngle(g_handle,axislist[0],60*3.14/180); //開始減速角度,轉(zhuǎn)換為弧度 ZAux_Direct_SetStopAngle(g_handle,axislist[0],120*3.14/180); ZAux_Direct_SetFullSpRadius(g_handle,axislist[0],5); ZAux_Direct_SetZsmooth(g_handle,axislist[0],5); //調(diào)用運(yùn)動(dòng) 通過檢查是否還有剩余緩沖來確定是否發(fā)運(yùn)動(dòng) g_curseges = 0; SetTimer(2, 50, NULL); //新建一個(gè)定時(shí)器,發(fā)運(yùn)動(dòng) }
完整代碼獲取地址
▼
三、調(diào)試與監(jiān)控
編譯運(yùn)行例程,同時(shí)通過ZDevelop軟件連接控制器對(duì)控制器狀態(tài)進(jìn)行監(jiān)控。
1.通過ZDevelop軟件的軸參數(shù)可以對(duì)比當(dāng)前demo和ZDevelop上面參數(shù)的對(duì)比,軸坐標(biāo),軸狀態(tài)等。
2.通過ZDevelop軟件的示波器抓取多條小線段數(shù)據(jù)打包下發(fā)運(yùn)動(dòng)軌跡以及對(duì)應(yīng)速度曲線。
A.小線段運(yùn)動(dòng)軌跡:
B.小線段打包下發(fā)主軸的規(guī)劃速度一直能夠保持,不會(huì)存在由于上位機(jī)下發(fā)速度不夠快而導(dǎo)致中間速度為0情況:
3.ZDevelop軟件調(diào)試視頻。
本次,正運(yùn)動(dòng)技術(shù)簡(jiǎn)單易用的運(yùn)動(dòng)控制卡(七):一次性加載多條連續(xù)小線段數(shù)據(jù),就分享到這里。
更多精彩內(nèi)容請(qǐng)關(guān)注“正運(yùn)動(dòng)小助手”公眾號(hào),需要相關(guān)開發(fā)環(huán)境與例程代碼,請(qǐng)咨詢正運(yùn)動(dòng)技術(shù)銷售工程師:400-089-8936。
本文由正運(yùn)動(dòng)技術(shù)原創(chuàng),歡迎大家轉(zhuǎn)載,共同學(xué)習(xí),一起提高中國(guó)智能制造水平。文章版權(quán)歸正運(yùn)動(dòng)技術(shù)所有,如有轉(zhuǎn)載請(qǐng)注明文章來源。
中國(guó)傳動(dòng)網(wǎng)版權(quán)與免責(zé)聲明:凡本網(wǎng)注明[來源:中國(guó)傳動(dòng)網(wǎng)]的所有文字、圖片、音視和視頻文件,版權(quán)均為中國(guó)傳動(dòng)網(wǎng)(www.wangxinlc.cn)獨(dú)家所有。如需轉(zhuǎn)載請(qǐng)與0755-82949061聯(lián)系。任何媒體、網(wǎng)站或個(gè)人轉(zhuǎn)載使用時(shí)須注明來源“中國(guó)傳動(dòng)網(wǎng)”,違反者本網(wǎng)將追究其法律責(zé)任。
本網(wǎng)轉(zhuǎn)載并注明其他來源的稿件,均來自互聯(lián)網(wǎng)或業(yè)內(nèi)投稿人士,版權(quán)屬于原版權(quán)人。轉(zhuǎn)載請(qǐng)保留稿件來源及作者,禁止擅自篡改,違者自負(fù)版權(quán)法律責(zé)任。
產(chǎn)品新聞
更多>2025-04-30
性能躍升20%!維宏NK300CX Plus數(shù)控系統(tǒng)...
2025-04-11
rpi-image-gen:樹莓派軟件鏡像構(gòu)建的終...
2025-04-08
【產(chǎn)品解讀】全面提升精密制造檢測(cè)節(jié)拍...
2025-03-31
激光閃耀 智慧引領(lǐng) | WISE MASER 黑武士...
2025-03-20