時間:2021-10-26 10:16:25來æºï¼šæ·±åœ³å¸‚æ£é‹å‹•技術有é™å…¬å¸
  今天,æ£é‹å‹•å°åŠ©æ‰‹çµ¦å¤§å®¶åˆ†äº«ä¸€ä¸‹é‹å‹•控制å¡ä¹‹ECI3808如何使用C++編寫控制器回零é‹å‹•å¹¶å°æ‡‰é…ç½®IO。
  一ECI3808硬件介紹
  1.功能介紹
  ECI3808ç³»åˆ—æŽ§åˆ¶å¡æ”¯æŒæœ€å¤šé”12軸直線æ’補ã€ä»»æ„圓弧æ’補ã€ç©ºé–“圓弧ã€èžºæ—‹æ’補ã€é›»å凸輪ã€é›»å齒輪ã€åŒæ¥è·Ÿéš¨ã€è™›æ“¬è»¸ã€æ©Ÿæ¢°æ‰‹æŒ‡ä»¤ç‰;采用優化的網絡通訊å”è°å¯ä»¥å¯¦ç¾å¯¦æ™‚çš„é‹å‹•控制。
  ECI3808系列é‹å‹•æŽ§åˆ¶å¡æ”¯æŒä»¥å¤ªç¶²ï¼ŒRS232 通訊接å£å’Œé›»è…¦ç›¸é€£ï¼ŒæŽ¥æ”¶é›»è…¦çš„æŒ‡ä»¤é‹è¡Œï¼Œå¯ä»¥é€šéŽCAN總線去連接å„個擴展模塊,從而擴展輸入輸出點數或é‹å‹•軸。
  ECI3808系列é‹å‹•控制å¡çš„æ‡‰ç”¨ç¨‹åºå¯ä»¥ä½¿ç”¨ VC,VB,VS,C++,C#ç‰è»Ÿä»¶ä¾†é–‹ç™¼ï¼Œç¨‹åºé‹è¡Œæ™‚需è¦å‹•態庫 zmotion.dll。調試時å¯ä»¥æŠŠZDevelopè»Ÿä»¶åŒæ™‚連接到控制器,從而方便調試和觀察。
  2.硬件接å£
  通用輸入å£é›»è·¯
  通用輸入å£é›»è·¯
  AD/DA接å£èªªæ˜Ž
  本地脈沖軸說明
3.控制器基本信æ¯
  二ã€C++進行é‹å‹•控制開發
  1.新建MFCé …ç›®å¹¶æ·»åŠ å‡½æ•¸åº«
  (1)在VS2015èœå–®â€œæ–‡ä»¶â€â†’“新建â€â†’ â€œé …ç›®â€ï¼Œå•Ÿå‹•å‰µå»ºé …ç›®å‘導。
(2)鏿“‡é–‹ç™¼èªžè¨€ç‚ºâ€œVisual C++â€å’Œç¨‹åºé¡žåž‹â€œMFC應用程åºâ€ã€‚
  (3)點擊下一æ¥å³å¯ã€‚
  (4)鏿“‡é¡žåž‹ç‚ºâ€œåŸºäºŽå°è©±æ¡†â€ï¼Œä¸‹ä¸€æ¥æˆ–者完æˆã€‚
(5)æ‰¾åˆ°å» å®¶æä¾›çš„光盤資料,路徑如下(64ä½åº«ç‚ºä¾‹)。
  A.é€²å…¥å» å•†æä¾›çš„光盤資料找到“8.PCå‡½æ•¸â€æ–‡ä»¶å¤¾ï¼Œå¹¶é»žæ“Šé€²å…¥ã€‚
  B.鏿“‡â€œå‡½æ•¸åº«2.1â€æ–‡ä»¶å¤¾ã€‚
  C.鏿“‡â€œWindowså¹³è‡ºâ€æ–‡ä»¶å¤¾ã€‚
  D.æ ¹æ“šéœ€è¦é¸æ“‡å°æ‡‰çš„å‡½æ•¸åº«é€™é‡Œé¸æ“‡64ä½åº«ã€‚
  E.解壓C++的壓縮包,é‡Œé¢æœ‰C++å°æ‡‰çš„函數庫。
  F.函數庫具體路徑如下。
  (6)å°‡å» å•†æä¾›çš„C++çš„åº«æ–‡ä»¶å’Œç›¸é—œé æ–‡ä»¶å¾©åˆ¶åˆ°æ–°å»ºçš„é …ç›®é‡Œé¢ã€‚
(7)åœ¨é …ç›®ä¸æ·»åŠ éœæ…‹åº«å’Œç›¸é—œé 文件。
  A.å…ˆå³æ“Šé …ç›®æ–‡ä»¶ï¼ŒæŽ¥è‘—ä¾æ¬¡é¸æ“‡:â€œæ·»åŠ â€â†’â€œç¾æœ‰é …â€ã€‚
  B.在彈出的窗å£ä¸ä¾æ¬¡æ·»åŠ éœæ…‹åº«å’Œç›¸é—œé 文件。
  (8)è²æ˜Žç”¨åˆ°çš„é æ–‡ä»¶å’Œå®šç¾©æŽ§åˆ¶å™¨é€£æŽ¥å¥æŸ„。
  至æ¤é …目新建完æˆï¼Œå¯é€²è¡ŒMFCé …ç›®é–‹ç™¼ã€‚
  2.查看PC函數手冊,熟悉相關函數接å£ã€‚
(1)PC函數手冊也在光盤資料里é¢ï¼Œå…·é«”路徑如下:“光盤資料\8.PC函數\函數庫2.1\ZMotion函數庫編程手冊 V2.1.pdfâ€
  (2)éˆæŽ¥æŽ§åˆ¶å™¨ï¼Œç²å–éˆæŽ¥å¥æŸ„。
  ZAux_OpenEth()接å£èªªæ˜Žï¼š
  (3) é…ç½®IOä¿¡è™Ÿé»žå°æ‡‰å‡½æ•¸æŽ¥å£å¦‚下。
ã€€ã€€å°æŽ¥å£çš„è©³ç´°èªªæ˜Žå¯æŸ¥çœ‹PC函數手冊。
  以下為回零é‹å‹•調用接å£ï¼Œä»¥åŠå°å›žé›¶æ¨¡å¼çš„è©³ç´°èªªæ˜Žï¼ŒåŠ 10表示碰到é™ä½åŽå找, 䏿œƒç¢°åˆ°é™ä½åœæ¢,例如13=模å¼3+é™ä½å找10,用于原點在æ£ä¸é–“的情æ³ã€‚
  3.MFC開發控制器硬件外è¨è®€å¯«ä¾‹ç¨‹ã€‚
  (1)例程界é¢å¦‚下。
(2)éˆæŽ¥æŒ‰éˆ•çš„äº‹ä»¶è™•ç†å‡½æ•¸ä¸èª¿ç”¨éˆæŽ¥æŽ§åˆ¶å™¨çš„æŽ¥å£å‡½æ•¸ZAux_OpenEth()ï¼Œèˆ‡æŽ§åˆ¶å™¨é€²è¡ŒéˆæŽ¥,éˆæŽ¥æˆåŠŸåŽå•Ÿå‹•定時器1監控控制器狀態。
  //ç¶²å£éˆæŽ¥æŽ§åˆ¶å™¨void CSingle_move_Dlg::OnOpen(){ char buffer[256]; int32 iresult; //å¦‚æžœå·²ç¶“éˆæŽ¥ï¼Œå‰‡å…ˆæ–·é–‹éˆæŽ¥ 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; } //éˆæŽ¥æˆåŠŸé–‹å•Ÿå®šæ™‚å™¨1 SetWindowText("å·²éˆæŽ¥"); SetTimer( 1, 100, NULL ); }
  (3)通éŽå®šæ™‚器監控控制器狀態。
  void CFuncWrapperDlg::OnTimer(UINT_PTR nIDEvent){ // TODO: åœ¨æ¤æ·»åŠ æ¶ˆæ¯è™•ç†ç¨‹åºä»£ç¢¼å’Œ/或調用默èªå€¼ if(NULL == g_handle) { MessageBox(_T("éˆæŽ¥æ–·é–‹")); return ; } if(1 == nIDEvent) { CString string; float position[4] = {0}; int status[4] = {0}; int nAxisStatus[4] = {0}; for (int i = 0;i< 4; i++) { ZAux_Direct_GetDpos( g_handle,i,&position[i]); //ç²å–ç•¶å‰è»¸ä½ç½® ZAux_Direct_GetIfIdle(g_handle,i,&status[i]); //判斷當å‰è»¸ç‹€æ…‹ ZAux_Direct_GetAxisStatus(g_handle, i, &nAxisStatus[i]); } if (status[0] == -1) { if (nAxisStatus[0] == 0 || (nAxisStatus[0] & 0x000040) == 64) { string.Format("X åœ æ¢ %.2f 軸狀態æ£å¸¸", position[0]); GetDlgItem(IDC_STATE_X)->SetWindowText(string); } if ((nAxisStatus[0] & 0x000010) == 16) { string.Format("X åœ æ¢ %.2f 軸æ£å‘硬é™ä½å ±è¦", position[0]); GetDlgItem(IDC_STATE_X)->SetWindowText(string); } if ((nAxisStatus[0] & 0x000020) == 32) { string.Format("X åœ æ¢ %.2f 軸åå‘硬é™ä½å ±è¦", position[0]); GetDlgItem(IDC_STATE_X)->SetWindowText(string); } } else { if (nAxisStatus[0] == 0 || (nAxisStatus[0] & 0x000040) == 64) { string.Format("X é‹è¡Œä¸ %.2f 軸狀態æ£å¸¸", position[0]); GetDlgItem(IDC_STATE_X)->SetWindowText(string); } if ((nAxisStatus[0] & 0x000010) == 16) { string.Format("X é‹è¡Œä¸ %.2f 軸æ£å‘硬é™ä½å ±è¦", position[0]); GetDlgItem(IDC_STATE_X)->SetWindowText(string); } if ((nAxisStatus[0] & 0x000020) == 32) { string.Format("X é‹è¡Œä¸ %.2f 軸åå‘硬é™ä½å ±è¦", position[0]); GetDlgItem(IDC_STATE_X)->SetWindowText(string); } } if (status[1] == -1) { if (nAxisStatus[1] == 0 || (nAxisStatus[1] & 0x000040) == 64) { string.Format("Y åœ æ¢ %.2f 軸狀態æ£å¸¸", position[1]); GetDlgItem(IDC_STATE_Y)->SetWindowText(string); } if ((nAxisStatus[1] & 0x000010) == 16) { string.Format("Y åœ æ¢ %.2f 軸æ£å‘硬é™ä½å ±è¦", position[1]); GetDlgItem(IDC_STATE_Y)->SetWindowText(string); } if ((nAxisStatus[1] & 0x000020) == 32) { string.Format("Y åœ æ¢ %.2f 軸åå‘硬é™ä½å ±è¦", position[1]); GetDlgItem(IDC_STATE_Y)->SetWindowText(string); } } else { if (nAxisStatus[1] == 0 || (nAxisStatus[1] & 0x000040) == 64) { string.Format("Y é‹è¡Œä¸ %.2f 軸狀態æ£å¸¸", position[1]); GetDlgItem(IDC_STATE_Y)->SetWindowText(string); } if ((nAxisStatus[1] & 0x000010) == 16) { string.Format("Y é‹è¡Œä¸ %.2f 軸æ£å‘硬é™ä½å ±è¦", position[1]); GetDlgItem(IDC_STATE_Y)->SetWindowText(string); } if ((nAxisStatus[1] & 0x000020) == 32) { string.Format("Y é‹è¡Œä¸ %.2f 軸åå‘硬é™ä½å ±è¦", position[1]); GetDlgItem(IDC_STATE_Y)->SetWindowText(string); } } if (status[2] == -1) { if (nAxisStatus[2] == 0 || (nAxisStatus[2] & 0x000040) == 64) { string.Format("Z åœ æ¢ %.2f 軸狀態æ£å¸¸", position[2]); GetDlgItem(IDC_STATE_Z)->SetWindowText(string); } if ((nAxisStatus[2] & 0x000010) == 16) { string.Format("Z åœ æ¢ %.2f 軸æ£å‘硬é™ä½å ±è¦", position[2]); GetDlgItem(IDC_STATE_Z)->SetWindowText(string); } if ((nAxisStatus[2] & 0x000020) == 32) { string.Format("Z åœ æ¢ %.2f 軸åå‘硬é™ä½å ±è¦", position[2]); GetDlgItem(IDC_STATE_Z)->SetWindowText(string); } } else { if (nAxisStatus[2] == 0 || (nAxisStatus[2] & 0x000040) == 64) { string.Format("Z é‹è¡Œä¸ %.2f 軸狀態æ£å¸¸", position[2]); GetDlgItem(IDC_STATE_Z)->SetWindowText(string); } if ((nAxisStatus[2] & 0x000010) == 16) { string.Format("Z é‹è¡Œä¸ %.2f 軸æ£å‘硬é™ä½å ±è¦", position[2]); GetDlgItem(IDC_STATE_Z)->SetWindowText(string); } if ((nAxisStatus[2] & 0x000020) == 32) { string.Format("Z é‹è¡Œä¸ %.2f 軸åå‘硬é™ä½å ±è¦", position[2]); GetDlgItem(IDC_STATE_Z)->SetWindowText(string); } } if (status[3] == -1) { if (nAxisStatus[3] == 0 || (nAxisStatus[3] & 0x000040) == 64) { string.Format("R åœ æ¢ %.2f 軸狀態æ£å¸¸", position[3]); GetDlgItem(IDC_STATE_R)->SetWindowText(string); } if ((nAxisStatus[3] & 0x000010) == 16) { string.Format("R åœ æ¢ %.2f 軸æ£å‘硬é™ä½å ±è¦", position[3]); GetDlgItem(IDC_STATE_R)->SetWindowText(string); } if ((nAxisStatus[3] & 0x000020) == 32) { string.Format("R åœ æ¢ %.2f 軸åå‘硬é™ä½å ±è¦", position[3]); GetDlgItem(IDC_STATE_R)->SetWindowText(string); } } else { if (nAxisStatus[3] == 0 || (nAxisStatus[3] & 0x000040) == 64) { string.Format("R é‹è¡Œä¸ %.2f 軸狀態æ£å¸¸", position[3]); GetDlgItem(IDC_STATE_R)->SetWindowText(string); } if ((nAxisStatus[3] & 0x000010) == 16) { string.Format("R é‹è¡Œä¸ %.2f 軸æ£å‘硬é™ä½å ±è¦", position[3]); GetDlgItem(IDC_STATE_R)->SetWindowText(string); } if ((nAxisStatus[3] & 0x000020) == 32) { string.Format("R é‹è¡Œä¸ %.2f 軸åå‘硬é™ä½å ±è¦", position[3]); GetDlgItem(IDC_STATE_R)->SetWindowText(string); } } } CDialog::OnTimer(nIDEvent);}
  (4)使用回零按鈕的事件處ç†å‡½æ•¸å°å›žé›¶é‹å‹•å‰çš„åƒæ•¸é€²è¡Œåˆå§‹åŒ–以åŠèª¿ç”¨å°æ‡‰çš„å›žé›¶æ¨¡å¼æ“作回零é‹å‹•。
  void CSingle_homeDlg::OnHome() //回零é‹å‹•{ // TODO: Add your control notification handler code here UpdateData(true);//åˆ·æ–°åƒæ•¸ int status = 0; ZAux_Direct_GetIfIdle(g_handle, m_nAxis,&status); //判斷當å‰è»¸ç‹€æ…‹ if (status == 0) //已經在é‹å‹•ä¸ { return; } //è¨å®šè»¸é¡žåž‹ 7- 脈沖軸類型 + 編碼器Z信號 ä¸ç”¨EZ回零也å¯ä»¥è¨ç½®ç‚º1 ZAux_Direct_SetAtype(g_handle, m_nAxis, 7); //è¨å®šè„ˆæ²–模å¼åŠé‚輯方å‘(脈沖+æ–¹å‘) ZAux_Direct_SetInvertStep(g_handle, m_nAxis, 0); //è¨ç½®è„ˆæ²–ç•¶é‡ 1è¡¨ç¤ºä»¥ä¸€å€‹è„ˆæ²–ç‚ºå–®ä½ ï¼Œè¨ç½®ç‚º1MM的脈沖個數,這度é‡å–®ä½ç‚ºMM ZAux_Direct_SetUnits(g_handle, m_nAxis, m_units); //è¨å®šé€Ÿåº¦ï¼ŒåŠ æ¸›é€Ÿ ZAux_Direct_SetLspeed(g_handle, m_nAxis, m_lspeed); ZAux_Direct_SetSpeed(g_handle, m_nAxis, m_speed); ZAux_Direct_SetAccel(g_handle, m_nAxis, m_acc); ZAux_Direct_SetDecel(g_handle, m_nAxis, m_dec); ZAux_Direct_SetCreep(g_handle, m_nAxis, m_creep); //è¨å®šå°æ‡‰è»¸çš„原點輸入å£ä¿¡è™Ÿ ZAux_Direct_SetDatumIn(g_handle, m_nAxis, m_datumin); //ZMC系列èªç‚ºOFF時碰到了原點信號(常閉) ,如果是常開傳感器則需è¦å轉輸入å£ï¼ŒECI系列的ä¸éœ€è¦å轉 ZAux_Direct_SetInvertIn(g_handle, m_datumin, 1); //è¨å®šå°æ‡‰è»¸çš„原點輸入å£ä¿¡è™Ÿ ZAux_Direct_SetFwdIn(g_handle, m_nAxis, m_FwdIn); //ZMC系列èªç‚ºOFF時碰到了原點信號(常閉) ,如果是常開傳感器則需è¦å轉輸入å£ï¼ŒECI系列的ä¸éœ€è¦å轉 ZAux_Direct_SetInvertIn(g_handle, m_FwdIn, 1); //è¨å®šå°æ‡‰è»¸çš„原點輸入å£ä¿¡è™Ÿ ZAux_Direct_SetRevIn(g_handle, m_nAxis, m_RevIn); //ZMC系列èªç‚ºOFF時碰到了原點信號(常閉) ,如果是常開傳感器則需è¦å轉輸入å£ï¼ŒECI系列的ä¸éœ€è¦å轉 ZAux_Direct_SetInvertIn(g_handle, m_RevIn, 1); //回零 if( m_datummode < 4) { ZAux_Direct_Single_Datum(g_handle, m_nAxis, m_datummode + 1); //模å¼1-4 } else { ZAux_Direct_Single_Datum(g_handle, m_nAxis, m_datummode + 4 ); //模å¼8,9 } UpdateData(false); }
  (5)通éŽåœæ¢é‹å‹•按鈕的事件處ç†å‡½æ•¸ä¾†åœæ¢ç•¶å‰çš„é‹å‹•。
  void CSingle_homeDlg::OnStop() //åœæ¢é‹å‹•{ // TODO: Add your control notification handler code here if(NULL == g_handle) { MessageBox(_T("éˆæŽ¥æ–·é–‹ç‹€æ…‹")); return ; } ZAux_Direct_Single_Cancel(g_handle,m_nAxis,2); //}
  (6)通éŽå標清零按鈕的事件處ç†å‡½æ•¸ä¾†å°ç•¶å‰è»¸çš„忍™é€²è¡Œå°æ‡‰æ¸…零。
  void CSingle_homeDlg::OnZero() //忍™æ¸…é›¶{ if(NULL == g_handle) { MessageBox(_T("éˆæŽ¥æ–·é–‹ç‹€æ…‹")); return ; } // TODO: Add your control notification handler code here for (int i=0;i<4;i++) { ZAux_Direct_SetDpos(g_handle,i,0); //è¨ç½®é›¶é»ž }}
完整代碼ç²å–地å€
â–¼
  三調試與監控
  編è¯é‹è¡Œä¾‹ç¨‹ï¼ŒåŒæ™‚通éŽZDevelopè»Ÿä»¶é€£æŽ¥æŽ§åˆ¶å™¨å°æŽ§åˆ¶å™¨ç‹€æ…‹é€²è¡Œç›£æŽ§ã€‚
  1.連接ZDevelop軟件,并點擊“視圖â€â†’â€œç¤ºæ³¢å™¨â€æ‰“開示波器å°è»¸é‹å‹•情æ³é€²è¡Œç›£æŽ§ã€‚
  2.ZDevelopè»Ÿä»¶èª¿è©¦è¦–é »ã€‚
  本次,æ£é‹å‹•技術簡單易用的é‹å‹•控制å¡(五):IOé…置與回零é‹å‹•,就分享到這里。更多精彩內容請關注“æ£é‹å‹•å°åŠ©æ‰‹â€å…¬çœ¾è™Ÿï¼Œéœ€è¦ç›¸é—œé–‹ç™¼ç’°å¢ƒèˆ‡ä¾‹ç¨‹ä»£ç¢¼ï¼Œè«‹å’¨è©¢æ£é‹å‹•技術銷售工程師:400-089-8936。
  本文由æ£é‹å‹•技術原創,æ¡è¿Žå¤§å®¶è½‰è¼‰ï¼Œå…±åŒå¸ç¿’,一起æé«˜ä¸åœ‹æ™ºèƒ½åˆ¶é€ æ°´å¹³ã€‚æ–‡ç« ç‰ˆæ¬Šæ¸æ£é‹å‹•æŠ€è¡“æ‰€æœ‰ï¼Œå¦‚æœ‰è½‰è¼‰è«‹æ³¨æ˜Žæ–‡ç« ä¾†æºã€‚
上一篇:é 精焊機組生產å°é‹¼ç®¡åŠƒå‚·çš„...
下一篇:供應éˆå¾žç‰©è¯ç¶²ä¸å—益的6種çª...
ä¸åœ‹å‚³å‹•網版權與å…è²¬è²æ˜Žï¼šå‡¡æœ¬ç¶²æ³¨æ˜Ž[來æºï¼šä¸åœ‹å‚³å‹•ç¶²]的所有文å—ã€åœ–片ã€éŸ³è¦–å’Œè¦–é »æ–‡ä»¶ï¼Œç‰ˆæ¬Šå‡ç‚ºä¸åœ‹å‚³å‹•ç¶²(www.siyutn.com)ç¨å®¶æ‰€æœ‰ã€‚如需轉載請與0755-82949061è¯ç³»ã€‚任何媒體ã€ç¶²ç«™æˆ–å€‹äººè½‰è¼‰ä½¿ç”¨æ™‚é ˆæ³¨æ˜Žä¾†æºâ€œä¸åœ‹å‚³å‹•ç¶²â€ï¼Œé•å者本網將追究其法律責任。
本網轉載并注明其他來æºçš„稿件,å‡ä¾†è‡ªäº’è¯ç¶²æˆ–æ¥å…§æŠ•稿人士,版權屬于原版權人。轉載請ä¿ç•™ç¨¿ä»¶ä¾†æºåŠä½œè€…ï¼Œç¦æ¢æ“…自篡改,é•è€…è‡ªè² ç‰ˆæ¬Šæ³•å¾‹è²¬ä»»ã€‚
相關資訊