技術(shù)頻道

娓娓工業(yè)
您現(xiàn)在的位置: 中國傳動網(wǎng) > 技術(shù)頻道 > 技術(shù)百科 > 簡單易用的運(yùn)動控制卡(七):一次性加載多條連續(xù)小線段數(shù)據(jù)

簡單易用的運(yùn)動控制卡(七):一次性加載多條連續(xù)小線段數(shù)據(jù)

時(shí)間:2021-11-11 16:05:56來源:深圳市正運(yùn)動技術(shù)有限公司

導(dǎo)語:?今天,正運(yùn)動小助手給大家分享一下運(yùn)動控制卡之ECI3808如何在大量小線段數(shù)據(jù)的情況下一次性加載多條連續(xù)小線段數(shù)據(jù)。

  今天,正運(yùn)動小助手給大家分享一下運(yùn)動控制卡之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)動控制。

  ECI3808系列運(yùn)動控制卡支持以太網(wǎng),RS232 通訊接口和電腦相連,接收電腦的指令運(yùn)行,可以通過CAN總線去連接各個(gè)擴(kuò)展模塊,從而擴(kuò)展輸入輸出點(diǎn)數(shù)或運(yùn)動軸。

  ECI3808系列運(yùn)動控制卡的應(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)試和觀察。

運(yùn)動控制

  2.硬件接口

運(yùn)動控制

通用輸入口電路

運(yùn)動控制

通用輸出口電路

運(yùn)動控制

AD/DA接口說明

運(yùn)動控制

本地脈沖軸說明

      3.控制器基本信息

運(yùn)動控制

  二、C++進(jìn)行運(yùn)動控制開發(fā)

  1.新建MFC項(xiàng)目并添加函數(shù)庫

  (1)在VS2015菜單“文件”→“新建”→ “項(xiàng)目”,啟動創(chuàng)建項(xiàng)目向?qū)А?/p>

運(yùn)動控制

       (2)選擇開發(fā)語言為“Visual C++”和程序類型“MFC應(yīng)用程序”。

運(yùn)動控制

  (3)點(diǎn)擊下一步即可。

運(yùn)動控制

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

運(yùn)動控制

       (5)找到廠家提供的光盤資料,路徑如下(64位庫為例)。

  A.進(jìn)入廠商提供的光盤資料找到“8.PC函數(shù)”文件夾,并點(diǎn)擊進(jìn)入。

運(yùn)動控制

  B.選擇“函數(shù)庫2.1”文件夾。

運(yùn)動控制

  C.選擇“Windows平臺”文件夾。

運(yùn)動控制

  D.根據(jù)需要選擇對應(yīng)的函數(shù)庫這里選擇64位庫。

運(yùn)動控制

  E.解壓C++的壓縮包,里面有C++對應(yīng)的函數(shù)庫。

運(yùn)動控制

  F.函數(shù)庫具體路徑如下。

運(yùn)動控制

  (6)將廠商提供的C++的庫文件和相關(guān)頭文件復(fù)制到新建的項(xiàng)目里面。

運(yùn)動控制

       (7)在項(xiàng)目中添加靜態(tài)庫和相關(guān)頭文件。

  A.先右擊項(xiàng)目文件,接著依次選擇:“添加”→“現(xiàn)有項(xiàng)”。

運(yùn)動控制

  B.在彈出的窗口中依次添加靜態(tài)庫和相關(guān)頭文件。

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

運(yùn)動控制

  至此項(xiàng)目新建完成,可進(jìn)行MFC項(xiàng)目開發(fā)。

  2.查看PC函數(shù)手冊,熟悉相關(guān)函數(shù)接口。

       (1)PC函數(shù)手冊也在光盤資料里面,具體路徑如下:“光盤資料\8.PC函數(shù)\函數(shù)庫2.1\ZMotion函數(shù)庫編程手冊 V2.1.pdf”

運(yùn)動控制

  (2)鏈接控制器,獲取鏈接句柄。

  ZAux_OpenEth()接口說明:

運(yùn)動控制

  (3)利用直接basic命令發(fā)送實(shí)現(xiàn)功能函數(shù)。

  ZAux_DirectCommand函數(shù)直接下發(fā)命令執(zhí)行basic功能塊,指令運(yùn)行速度快,但是需要加載緩沖的指令不能成功執(zhí)行,能夠成功執(zhí)行的下發(fā)指令推薦使用,加快效率。

運(yùn)動控制

  ZAux_Execute函數(shù)直接下發(fā)命令執(zhí)行basic功能塊,執(zhí)行指令速度會阻塞,執(zhí)行速度慢一些,所有能夠執(zhí)行的字符串命令都可以成功執(zhí)行。

運(yùn)動控制

  3.MFC開發(fā)控制器硬件外設(shè)讀寫例程。

       (1)例程界面如下。

運(yùn)動控制

  (2)例程界面由三個(gè)部分組成。

  A.一是連接部分,用于連接當(dāng)前的控制器,獲取到控制器的句柄進(jìn)行之后的操作。

運(yùn)動控制

  B.二是狀態(tài)檢測部分,可以查看到當(dāng)前控制器的軸坐標(biāo),軸狀態(tài),運(yùn)動狀態(tài)以及緩沖區(qū)剩余大小。

運(yùn)動控制

  C.三是參數(shù)設(shè)置部分進(jìn)行設(shè)置控制器的運(yùn)動參數(shù),加減速以及速度等。

運(yùn)動控制

  (3)鏈接按鈕的事件處理函數(shù)中調(diào)用鏈接控制器的接口函數(shù)ZAux_OpenEth(),與控制器進(jìn)行鏈接,鏈接成功后啟動定時(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)動數(shù)據(jù)并進(jìn)行對應(yīng)運(yùn)動,每次運(yùn)動加載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)動狀態(tài) X: %s Y: %s Z: %s U: %s",showidle[0]?"停止":"運(yùn)動中",showidle[1]?"停止":"運(yùn)動中",showidle[2]?"停止":"運(yùn)動中",showidle[3]?"停止":"運(yùn)動中"); 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)動BASE軸列表 int iresult = 0; int iLen = 10; //單次發(fā)送運(yùn)動長度 if (LEGS_MAX < g_curseges) //超過長度范圍 { 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]);相對 if (ERR_OK != iresult) { //運(yùn)動發(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)動。

  /*************************************************************Description: //多條相對多軸直線插補(bǔ) Input: //卡鏈接handle iMoveLen 填寫的運(yùn)動長度 imaxaxises 參與運(yùn)動總軸數(shù) piAxislist 軸號列表 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)動命令 for(j=0;j<imovelen;j++) if(ilen="" 獲取命令長度="" 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ù),以及對應(yīng)的數(shù)據(jù)內(nèi)容,利用獲取到的數(shù)據(jù)內(nèi)容組成多條小線段運(yùn)動的move指令直接下發(fā),不通過每條指令重新處理的方式進(jìn)行運(yùn)動下發(fā),以達(dá)到加快效率的目的.

  防止出現(xiàn)上位機(jī)下發(fā)指令速度不夠?qū)е逻\(yùn)行過程中間出現(xiàn)運(yùn)動執(zhí)行完成速度直接降到0的情況,在運(yùn)行過程中會進(jìn)行判斷下發(fā)的字符是否超過能夠下發(fā)的最大字符,若超過則會返回對應(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)通過啟動按鈕的事件處理函數(shù)進(jìn)行設(shè)置參數(shù),并開啟定時(shí)器2進(jìn)行運(yùn)動指令的下發(fā)。

  void CTest_multiMoveDlg::OnStart() //啟動{ if(NULL == g_handle) { MessageBox(_T("鏈接斷開")); return ; } UpdateData(true);//刷新參數(shù) int corner_mode = 0; int axislist[4] = {0,1,2,3}; //運(yùn)動BASE軸列表 //選擇參與運(yùn)動的軸,第一個(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)動速度-起始速度 線性減速的 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)動 通過檢查是否還有剩余緩沖來確定是否發(fā)運(yùn)動 g_curseges = 0; SetTimer(2, 50, NULL); //新建一個(gè)定時(shí)器,發(fā)運(yùn)動 }

完整代碼獲取地址

運(yùn)動控制

  三、調(diào)試與監(jiān)控

  編譯運(yùn)行例程,同時(shí)通過ZDevelop軟件連接控制器對控制器狀態(tài)進(jìn)行監(jiān)控。

  1.通過ZDevelop軟件的軸參數(shù)可以對比當(dāng)前demo和ZDevelop上面參數(shù)的對比,軸坐標(biāo),軸狀態(tài)等。

運(yùn)動控制

  2.通過ZDevelop軟件的示波器抓取多條小線段數(shù)據(jù)打包下發(fā)運(yùn)動軌跡以及對應(yīng)速度曲線。

  A.小線段運(yùn)動軌跡:

運(yùn)動控制

  B.小線段打包下發(fā)主軸的規(guī)劃速度一直能夠保持,不會存在由于上位機(jī)下發(fā)速度不夠快而導(dǎo)致中間速度為0情況:

運(yùn)動控制

  3.ZDevelop軟件調(diào)試視頻。

運(yùn)動控制

  本次,正運(yùn)動技術(shù)簡單易用的運(yùn)動控制卡(七):一次性加載多條連續(xù)小線段數(shù)據(jù),就分享到這里。

  更多精彩內(nèi)容請關(guān)注“正運(yùn)動小助手”公眾號,需要相關(guān)開發(fā)環(huán)境與例程代碼,請咨詢正運(yùn)動技術(shù)銷售工程師:400-089-8936。

  本文由正運(yùn)動技術(shù)原創(chuàng),歡迎大家轉(zhuǎn)載,共同學(xué)習(xí),一起提高中國智能制造水平。文章版權(quán)歸正運(yùn)動技術(shù)所有,如有轉(zhuǎn)載請注明文章來源。


標(biāo)簽: 控制器運(yùn)動控制

點(diǎn)贊

分享到:

上一篇:新型鋰離子電池負(fù)極材料 可讓...

下一篇:節(jié)能30% 英威騰全新塑料片材...

中國傳動網(wǎng)版權(quán)與免責(zé)聲明:凡本網(wǎng)注明[來源:中國傳動網(wǎng)]的所有文字、圖片、音視和視頻文件,版權(quán)均為中國傳動網(wǎng)(www.treenowplaneincome.com)獨(dú)家所有。如需轉(zhuǎn)載請與0755-82949061聯(lián)系。任何媒體、網(wǎng)站或個(gè)人轉(zhuǎn)載使用時(shí)須注明來源“中國傳動網(wǎng)”,違反者本網(wǎng)將追究其法律責(zé)任。

本網(wǎng)轉(zhuǎn)載并注明其他來源的稿件,均來自互聯(lián)網(wǎng)或業(yè)內(nèi)投稿人士,版權(quán)屬于原版權(quán)人。轉(zhuǎn)載請保留稿件來源及作者,禁止擅自篡改,違者自負(fù)版權(quán)法律責(zé)任。

網(wǎng)站簡介|會員服務(wù)|聯(lián)系方式|幫助信息|版權(quán)信息|網(wǎng)站地圖|友情鏈接|法律支持|意見反饋|sitemap

中國傳動網(wǎng)-工業(yè)自動化與智能制造的全媒體“互聯(lián)網(wǎng)+”創(chuàng)新服務(wù)平臺

網(wǎng)站客服服務(wù)咨詢采購咨詢媒體合作

Chuandong.com Copyright ?2005 - 2024 ,All Rights Reserved 版權(quán)所有 粵ICP備 14004826號 | 營業(yè)執(zhí)照證書 | 不良信息舉報(bào)中心 | 粵公網(wǎng)安備 44030402000946號