技術(shù)頻道

娓娓工業(yè)
您現(xiàn)在的位置: 中國(guó)傳動(dòng)網(wǎng) > 技術(shù)頻道 > 應(yīng)用方案 > 【正運(yùn)動(dòng)】簡(jiǎn)單易用的運(yùn)動(dòng)控制卡(四):函數(shù)庫(kù)的封裝

【正運(yùn)動(dòng)】簡(jiǎn)單易用的運(yùn)動(dòng)控制卡(四):函數(shù)庫(kù)的封裝

時(shí)間:2021-10-14 16:03:51來(lái)源:深圳市正運(yùn)動(dòng)技術(shù)有限公司

導(dǎo)語(yǔ):?今天,正運(yùn)動(dòng)小助手給大家分享一下運(yùn)動(dòng)控制卡之ECI3808如何進(jìn)行函數(shù)庫(kù)的封裝工作。

  今天,正運(yùn)動(dòng)小助手給大家分享一下運(yùn)動(dòng)控制卡之ECI3808如何進(jìn)行函數(shù)庫(kù)的封裝工作。

  一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)行,可以通過(guò)CAN總線去連接各個(gè)擴(kuò)展模塊,從而擴(kuò)展輸入輸出點(diǎn)數(shù)或運(yùn)動(dòng)軸。

  ECI3808系列運(yùn)動(dòng)控制卡的應(yīng)用程序可以使用 VC,VB,VS,C++,C#等軟件來(lái)開(kāi)發(fā),程序運(yùn)行時(shí)需要?jiǎng)討B(tài)庫(kù) zmotion.dll。調(diào)試時(shí)可以把ZDevelop軟件同時(shí)連接到控制器,從而方便調(diào)試和觀察。

運(yùn)動(dòng)控制

  2.硬件接口

運(yùn)動(dòng)控制

  通用輸入口電路

運(yùn)動(dòng)控制

  通用輸入口電路

運(yùn)動(dòng)控制

  AD/DA接口說(shuō)明

運(yùn)動(dòng)控制

  本地脈沖軸說(shuō)明

       3.控制器基本信息

運(yùn)動(dòng)控制

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

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

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

運(yùn)動(dòng)控制

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

運(yùn)動(dòng)控制

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

運(yùn)動(dòng)控制

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

運(yùn)動(dòng)控制

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

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

運(yùn)動(dòng)控制

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

運(yùn)動(dòng)控制

  C.選擇“Windows平臺(tái)”文件夾。

運(yùn)動(dòng)控制

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

運(yùn)動(dòng)控制

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

運(yùn)動(dòng)控制

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

運(yùn)動(dòng)控制

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

運(yùn)動(dòng)控制

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

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

運(yùn)動(dòng)控制

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

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

運(yùn)動(dòng)控制

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

  2.查看PC函數(shù)手冊(cè),熟悉相關(guān)函數(shù)接口。(1)PC函數(shù)手冊(cè)也在光盤資料里面,具體路徑如下:“光盤資料\8.PC函數(shù)\函數(shù)庫(kù)2.1\ZMotion函數(shù)庫(kù)編程手冊(cè) V2.1.pdf”

運(yùn)動(dòng)控制

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

  ZAux_OpenEth()接口說(shuō)明:

運(yùn)動(dòng)控制

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

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

運(yùn)動(dòng)控制

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

運(yùn)動(dòng)控制

  C.一次性讀取多個(gè)軸位置,從對(duì)應(yīng)的modbus寄存器讀出。

運(yùn)動(dòng)控制

運(yùn)動(dòng)控制

  D.一次性讀取多個(gè)IN狀態(tài)位置,從對(duì)應(yīng)的modbus寄存器讀出。

運(yùn)動(dòng)控制

運(yùn)動(dòng)控制

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

  (1)例程界面如下。

運(yùn)動(dòng)控制

  (2)鏈接按鈕的事件處理函數(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)鏈接,則先斷開(kāi)鏈接 if(NULL != g_handle) { ZAux_Close(g_handle); g_handle = NULL; } //從IP下拉框中選擇獲取IP地址 GetDlgItemText(IDC_IPLIST,buffer,255); buffer[255] = '\0'; //開(kāi)始鏈接控制器 iresult = ZAux_OpenEth(buffer, &g_handle); if(ERR_SUCCESS != iresult) { g_handle = NULL; MessageBox(_T("鏈接失敗")); SetWindowText("未鏈接"); return; } //鏈接成功開(kāi)啟定時(shí)器1 SetWindowText("已鏈接"); SetTimer( 1, 100, NULL ); }

  (3)通過(guò)定時(shí)器監(jiān)控控制器狀態(tài)。

  ·

  void CFuncWrapperDlg::OnTimer(UINT_PTR nIDEvent){ // TODO: 在此添加消息處理程序代碼和/或調(diào)用默認(rèn)值 if (NULL == g_handle) { MessageBox(_T("鏈接斷開(kāi)")); return; } if (nIDEvent == 1) { uint8 pValueList[2] = ""; //讀取0-15in狀態(tài) ZAux_GetModbusIn(g_handle,0,15, pValueList); //設(shè)置控件顯示 SetMutiIn(pValueList[0], 0); SetMutiIn(pValueList[1], 1); float dposvalue[4] ; CString dposStatus = ""; //位置獲取 ZAux_GetModbusDpos(g_handle, 4,dposvalue); //軸0位置設(shè)置 dposStatus.Format("軸0位置:%.2f", dposvalue[0]); GetDlgItem(IDC_DPOS0)->SetWindowText(dposStatus); //軸1位置設(shè)置 dposStatus.Format("軸1位置:%.2f", dposvalue[1]); GetDlgItem(IDC_DPOS1)->SetWindowText(dposStatus); //軸2位置設(shè)置 dposStatus.Format("軸2位置:%.2f", dposvalue[2]); GetDlgItem(IDC_DPOS2)->SetWindowText(dposStatus); //軸3位置設(shè)置 dposStatus.Format("軸3位置:%.2f", dposvalue[3]); GetDlgItem(IDC_DPOS3)->SetWindowText(dposStatus); //ad值獲取 uint16 advalue[2]; CString adStatus = ""; //獲取ad狀態(tài) GetMutiAd(g_handle,2, advalue); //AD1設(shè)置 adStatus.Format("AIN0:%.3f mv", advalue[0] * 1.0 / 4096 * 10000); GetDlgItem(IDC_AIN0)->SetWindowText(adStatus); //AD1設(shè)置 adStatus.Format("AIN1:%.3f mv", advalue[1] * 1.0 / 4096 * 10000); GetDlgItem(IDC_AIN1)->SetWindowText(adStatus); } CDialogEx::OnTimer(nIDEvent);}

  (4)利用對(duì)應(yīng)modbus_reg寄存器內(nèi)的值一次性獲取AD值內(nèi)容的函數(shù)。

運(yùn)動(dòng)控制

  int CFuncWrapperDlg::GetMutiAd(ZMC_HANDLE handle, int inum, uint16 * pValueList){ int iresult = 0; //獲取reg寄存器中的值,獲取到ad的大小 iresult = ZAux_Modbus_Get4x(handle, 14000, inum, pValueList); return iresult;}

  (5)通過(guò)斷開(kāi)按鈕的事件處理函數(shù)來(lái)斷開(kāi)與控制卡的連接。

  ·

  void CSingle_move_Dlg::OnClose() //斷開(kāi)鏈接{ // 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("未鏈接"); }}

  (6)通過(guò)單位時(shí)間運(yùn)動(dòng)按鈕的事件處理函數(shù)來(lái)設(shè)置對(duì)應(yīng)軸的參數(shù)以及當(dāng)前軸單位時(shí)間內(nèi)的運(yùn)動(dòng)距離。

  ·

  void CFuncWrapperDlg::OnBnClickedButtonpt(){ // TODO: 在此添加控件通知處理程序代碼 ZAux_Direct_SetUnits(g_handle,m_AxisNum, (float)GetDlgItemInt(IDC_UNITS)); ZAux_Direct_SetAtype(g_handle,m_AxisNum, (float)GetDlgItemInt(IDC_ATYPE)); ZAux_Direct_SetSpeed(g_handle,m_AxisNum, (float)GetDlgItemInt(IDC_SPEED)); ZAux_Direct_SetAccel(g_handle,m_AxisNum, (float)GetDlgItemInt(IDC_ACCEL)); ZAux_Direct_SetDecel(g_handle,m_AxisNum, (float)GetDlgItemInt(IDC_DECEL)); ZAux_Direct_SetSramp(g_handle,m_AxisNum, (float)GetDlgItemInt(IDC_SRAMP)); if (m_MoveType == 1) { int nTicks = 0; float nDistance = 0; nTicks = GetDlgItemInt(IDC_EDITTICK); nDistance = GetDlgItemInt(IDC_EDITUNITS); //調(diào)用單位時(shí)間相對(duì)運(yùn)動(dòng) Zaux_MovePt(g_handle, m_AxisNum, nTicks, nDistance); } else if (m_MoveType == 0) { int nTicks = 0; float nDistance = 0; nTicks = GetDlgItemInt(IDC_EDITTICK); nDistance = GetDlgItemInt(IDC_EDITUNITS); //調(diào)用單位時(shí)間相對(duì)運(yùn)動(dòng) Zaux_MoveAbsPt(g_handle, m_AxisNum, nTicks, nDistance); }}

  (7)利用ZAux_DirectCommand函數(shù)封裝MOVE_PT指令以及MOVE_PTABS指令進(jìn)行對(duì)應(yīng)運(yùn)動(dòng)。

  ·

  //單位時(shí)間絕對(duì)運(yùn)動(dòng)int CFuncWrapperDlg::Zaux_MoveAbsPt(ZMC_HANDLE handle, int nAxis, int nTicks, float nDistance){ int iresult = 0; char cmdbuff[2048]; char cmdbuffAck[2048]; char tempbuff[2048]; CString str = ""; float ainValue[1] = { 0 }; sprintf(tempbuff, "base(%d)\n", nAxis); //生成命令 sprintf(cmdbuff, "move_ptabs(%d,%f)", nTicks,nDistance); strcat(tempbuff, cmdbuff); //判斷是否超過(guò)一次性發(fā)送字節(jié)數(shù) if (strlen(tempbuff) > 1000 || strlen(tempbuff) < 0) { return 1; } //調(diào)用命令執(zhí)行函數(shù) iresult = ZAux_DirectCommand(handle, tempbuff, cmdbuffAck, 2048); return iresult; }} //單位時(shí)間相對(duì)運(yùn)動(dòng)int CFuncWrapperDlg::Zaux_MovePt(ZMC_HANDLE handle, int nAxis, int nTicks, float nDistance){ int iresult = 0; char cmdbuff[2048]; char cmdbuffAck[2048]; char tempbuff[2048]; CString str = ""; float ainValue[1] = { 0 }; sprintf(tempbuff, "base(%d)\n", nAxis); //生成命令 sprintf(cmdbuff, "move_pt(%d,%f)", nTicks, nDistance); strcat(tempbuff, cmdbuff); //判斷是否超過(guò)一次性發(fā)送字節(jié)數(shù) if (strlen(tempbuff) > 1000 || strlen(tempbuff) < 0) { return 1; } //調(diào)用命令執(zhí)行函數(shù) iresult = ZAux_DirectCommand(handle, tempbuff, cmdbuffAck, 2048); return iresult; }}

完整代碼獲取地址

運(yùn)動(dòng)控制

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

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

  1.通過(guò)ZDevelop軟件的ADDA視圖進(jìn)行監(jiān)控模擬量輸入輸出對(duì)應(yīng)的值可以看到讀取出來(lái)的一致。

運(yùn)動(dòng)控制

  2.通過(guò)ZDevelop軟件的示波器進(jìn)行單位時(shí)間的運(yùn)動(dòng)距離。

  (1)單位時(shí)間相對(duì)位置變化。

運(yùn)動(dòng)控制

  (2)單位時(shí)間絕對(duì)位置變化。

運(yùn)動(dòng)控制

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

運(yùn)動(dòng)控制

  本次,正運(yùn)動(dòng)技術(shù)簡(jiǎn)單易用的運(yùn)動(dòng)控制卡(四):函數(shù)庫(kù)的封裝,就分享到這里。更多精彩內(nèi)容請(qǐng)關(guān)注“正運(yùn)動(dòng)小助手”公眾號(hào),需要相關(guān)開(kāi)發(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)注明文章來(lái)源。


標(biāo)簽: 運(yùn)動(dòng)控制

點(diǎn)贊

分享到:

上一篇:【正運(yùn)動(dòng)】機(jī)器視覺(jué)運(yùn)動(dòng)控制...

下一篇:繼電器行業(yè)概況技術(shù)特點(diǎn)及現(xiàn)狀

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

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

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

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

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

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