db2 null轉0_運動控制卡應用開發教程之VC6.0
技術標籤:db2 null轉0db2v9/9.5高階應用開發vc6下usb程式設計wince 開發zlib.dll vc6動態呼叫
點選藍字關注伺服與運動控制
今天,我們來講解一下正運動技術運動控制卡應用開發教程之VC6.0。
在正式學習之前,我們先了解一下正運動技術的運動控制卡ECI2418和ECI2618。這兩款產品分別是4軸,6軸運動控制卡。
ECI2418支援4軸脈衝輸入與編碼器反饋,板載24點輸入,16點輸出,2AD,2DA,支援手輪介面,其中特定輸出支援高速PWM控制。 ECI2618支援6軸脈衝輸入與編碼器反饋,板載24點輸入,16點輸出,2AD,2DA,支援手輪介面,其中特定輸出支援高速PWM控制。ECI2418,ECI2618均使用同一套API函式,均支援C、C++、C#、LabView、Python、Delphi等開發語言,支援VC6.0、VB6.0、Qt、.Net等平臺,支援Windows、Linux、WinCE、iMac等作業系統。
一、運動控制卡VC6.0開發流程
1、開啟 VC++6.0,新建一個工程。 2、選擇“ MFC APPWizard(exe) ”,選擇 工程儲存路徑 ,設定 工程名 ,選擇 確定 。3、在應用程式型別選擇基本對話方塊,完成專案新建。
4、將產品配套光碟“..\函式庫\dll”資料夾中的動態連結庫“zmotion.dll、zauxdll.dll”、標頭檔案“zauxdll2.h”和lib檔案“zauxdll.lib”複製到工程資料夾中。
7、在應用程式檔案中加入函式庫標頭檔案的宣告,如:#include “zauxdll2.h”,並定義一個控制器的連結控制代碼。
8、至此,使用者就可以在VC6.0中呼叫函式庫中的任何函式,開始編寫應用程式,具體函式的用法的功能可以參考光碟資料裡面的:ZMotion PC函式庫程式設計手冊。
9、參考ZMotion PC函式庫程式設計手冊的連結控制器的函式說明,在ECIDlg:OnInitDialog()函式中新增連結控制器程式碼ZAux_OpenEth(“192.168.0.11”,&g_handle);即可連結控制器。
10、通過MOVE按鈕,控制控制器進行插補運動。
(1)右鍵MOVE按鈕,選擇屬性,設定按鈕ID。(2)右鍵MOVE按鈕選擇事件。
(3)新建相關事件。
(4)在事件處理函式中新增插補運動函式。
11、編譯執行就可以通過PC控制控制器了。
如果編譯報錯:無法開啟預編譯的標頭檔案:沒有這樣的檔案或目錄。
請選擇“Project”選單下的“Settings…”選單項,然後選擇c/c++進行如下設定。
二、VC6.0例程講解
1、在我們的光碟資料裡有很多VC6.0的例程,通過這些歷程可以更容易的上手我們的控制器。2、單軸運動例程
a、通過乙太網連結到指定IP的控制器;
b、設定運動軸引數;
c、選擇運動軸物件;
d、選擇運動方式,實現持續運動和寸動;
3、實現步驟
(1)搜尋IP,連結控制器。
A、先將相關控制元件拖拽到UI介面,並設定對應的事件處理函式。
B、下拉框事件處理函式,實現自動搜尋IP。 先根據ZMotion PC 程式設計手冊,在下拉框事件處理函式新增控制器IP搜尋函式“ZAux_SearchEthlist()”,然後將獲取到的IP字串進行解析,具體解析方法請參考例程。//自動搜尋IPvoid CECIDlg::OnDropdownIPList() { /*自動搜尋IP地址*/ char buffer[10240]; int32 iresult; /*搜尋當前網段下的 IP 地址 詳情請參考:zmotion pc 程式設計手冊*/ iresult = ZAux_SearchEthlist(buffer, 10230, 100); if(ERR_OK != iresult) { return; } CComboBox *m_pEthList; m_pEthList = (CComboBox *)GetDlgItem(IDC_IPList); if(NULL == m_pEthList) { return; } /*從字串轉換成IP*/ int ipos =0; const char * pstring; pstring = buffer; for(int j= 0; j< 20;j++) { char buffer2[256]; buffer2[0] = '\0'; /*跳過空格*/ while(' ' == pstring[0]) { pstring++; } ipos = sscanf(pstring , "%s", &buffer2); if(EOF == ipos) { break; } /*跳過字元*/ while((' ' != pstring[0]) && ('\t' != pstring[0]) && ('\0' != pstring[0])) { pstring++; } if(CB_ERR != m_pEthList->FindString(0, buffer2)) { continue; } if('\0' == buffer2) { return; } /*加入*/ m_pEthList->AddString(buffer2); } return; }
C、點選連結按鈕連結控制器。
根據ZMotion PC 程式設計手冊,在連結按鈕點選事件處理函式中新增網口連線控制器的函式“ZAux_OpenEth()”,即可實現連結控制器的功能。
//連結控制器void CECIDlg::OnLink() { char buffer[256]; int32 iresult; /*如果已經連結先關閉控制器連結*/ if(NULL != g_handle) { ZAux_Close(g_handle); g_handle = NULL; } /*獲取下拉框裡的IP地址*/ GetDlgItemText(IDC_IPList, buffer, 55); buffer[255] = '\0'; /*通過網口方式與控制器進行連線*/ iresult = ZAux_OpenEth(buffer, &g_handle); /*如果連結成功*/ if(ERR_SUCCESS == iresult) { SetWindowText("已連結"); /*開起定時器,用於資訊更新*/ SetTimer( 1, 100, NULL ); }}
D、點選斷開按鈕斷開連結控制器。
根據ZMotion PC 程式設計手冊,在斷開按鈕點選事件處理函式中新增斷開連結控制器的函式“ZAux_Close()”,即可實現斷開連結控制器的功能。
//關閉連結void CECIDlg::OnClose() { if(NULL != g_handle) { /*關定時器*/ KillTimer(1); /*關閉連結*/ ZAux_Close(g_handle); g_handle = NULL; SetWindowText("未連結"); } }
(2)選擇軸,並對所選擇的dpos和當前速度以及運動狀態進行監控。
A、先將相關控制元件拖拽到UI介面,並設定對應的事件處理函式。
B、通過X、Y、Z、R 4個單選按鈕的事件處理函式,實現對軸的選擇。
//選擇X軸void CECIDlg::OnRadioX() { UpdateData( true ); m_nAxis = 0; UpdateData( false );}//選擇Y軸void CECIDlg::OnRadioY() { UpdateData( true ); m_nAxis = 1; UpdateData( false );}//選擇Z軸void CECIDlg::OnRadioZ() { UpdateData( true ); m_nAxis = 2; UpdateData( false );}//選擇R軸void CECIDlg::OnRadioR() { UpdateData( true ); m_nAxis = 3; UpdateData( false ); }
C、通過定時器實現對軸狀態的實時更新。
//定時器void CECIDlg::OnTimer(UINT nIDEvent) { if(NULL == g_handle) { MessageBox(_T("連結斷開")); return ; } if(1 == nIDEvent) { /*獲取當前軸位置*/ CString string; float position = 0; ZAux_Direct_GetDpos( g_handle,m_nAxis,&position); string.Format("當前位置:%.2f", position ); GetDlgItem( IDC_CurDPOS )->SetWindowText( string ); /*獲取當前軸速度*/ float NowSp = 0; ZAux_Direct_GetVpSpeed( g_handle,m_nAxis,&NowSp); string.Format("當前速度:%.2f", NowSp ); GetDlgItem( IDC_CurSPEED)->SetWindowText( string ); /*判斷當前軸狀態*/ int status = 0; ZAux_Direct_GetIfIdle(g_handle, m_nAxis,&status); if (status == -1) { GetDlgItem( IDC_CurSTATE )->SetWindowText( "當前狀態:停 止" ); }else { GetDlgItem( IDC_CurSTATE )->SetWindowText( "當前狀態:運動中" ); } } CDialog::OnTimer(nIDEvent);}
(3)實現in0-in7,out0-out7狀態的讀取。
使用介面ZAux_GetModbusIn() 和ZAux_GetModbusOut(),對io狀態進獲取。並封裝成一個子函式將該函式新增到定時器超時處理函式中,用於io狀態的更新。//IO監控void CECIDlg::IOGet(){ uint8 in, out, i=0,j=0,k=0; char buff[128]={0}; /*獲取輸入口狀態*/ ZAux_GetModbusIn (g_handle, 0, 7, &in); //獲取in0-in7狀態 /*十進位制轉二進位制*/ itoa(in, buff, 2); j=0; for( i=0; i<8; i++) { if((48 == buff[i])||(49 == buff[i])) { j++; } } for(i=0 ; i { for(k=7; k>0; k--) { buff[k] = buff[k-1]; } buff[0]=48; } sprintf(buff, "輸入口IN0-7 狀態:%c %c %c %c %c %c %c %c", buff[7], buff[6],buff[5],buff[4],buff[3],buff[2],buff[1],buff[0]); GetDlgItem( IDC_IN )->SetWindowText( buff ); /*獲取輸出口狀態*/ ZAux_GetModbusOut (g_handle, 0, 7, &out);//獲取out0-out7狀態 /*十進位制轉二進位制*/ itoa(out, buff, 2); j=0; for( i=0; i<8; i++) { if((48 == buff[i])||(49 == buff[i])) { j++; } } for(i=0 ; i { for(k=7; k>0; k--) { buff[k] = buff[k-1]; } buff[0]=48; } sprintf(buff, "輸出口OUT0-7狀態:%c %c %c %c %c %c %c %c",buff[7], buff[6],buff[5],buff[4],buff[3],buff[2],buff[1],buff[0]); GetDlgItem( IDC_OUT )->SetWindowText( buff ); }
(4)對控制器引數進行設定。
A、先將相關控制元件拖拽到UI介面,並設定引數生效按鈕的事件處理函式。
B、設定各個編輯框的成員變數,先右鍵編輯框選擇建立類導向,再選擇成員變數進行設定。
C、然後在引數生效按鈕的事件處理函式中新增引數設定的相關函式介面,對控制器引數進行設定。
//控制器引數設定void CECIDlg::OnSetPara() { /*重新整理引數*/UpdateData(true); /*設定脈衝當量*/ 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); /*設定S曲線時間 設定為0表示梯形加減速*/ ZAux_Direct_SetSramp(g_handle, m_nAxis, m_sramp); }
(5)控制控制器運動。
A、在UI介面再新增兩組單選框、寸動距離編輯框,以及兩個按鈕。
B、兩組單選框用於運動方向和運動方式的設定,通過他們的事件處理函式對標誌位變數m_moveatype和m_movedir進行設定。
//設定為正方向void CECIDlg::OnRadioFwd() { UpdateData( true ); m_movedir = 1; UpdateData( false );}//設定為負方向void CECIDlg::OnRadioRev() { UpdateData( true ); m_movedir = -1; UpdateData( false );}//設定為寸動void CECIDlg::OnRadioMove() { UpdateData( true ); m_moveatype = 0; UpdateData( false );}//設定為持續運動void CECIDlg::OnRadioVmove() { UpdateData( true ); m_moveatype = 1; UpdateData( false );}
C、通過啟動按鈕的事件處理函式來啟動控制器進行運動。
//啟動void CECIDlg::OnRun() { if(NULL == g_handle) { MessageBox(_T("連結斷開狀態")); return ; } /*重新整理引數*/ UpdateData(true); int status = 0; ZAux_Direct_GetIfIdle(g_handle, m_nAxis,&status); //判斷當前軸狀態 /*已經在運動*/ if (status == 0) return; /*設定軸型別 1-脈衝軸型別*/ ZAux_Direct_SetAtype(g_handle, m_nAxis, 1); /*觸發示波器,方便通過ZDevelop軟體裡面的示波器對運動情況進行監控*/ ZAux_Trigger(g_handle); if( 1 == m_moveatype ) { /*持續運動*/ ZAux_Trigger(g_handle); ZAux_Direct_Single_Vmove(g_handle, m_nAxis, m_movedir); } else { /*寸動*/ ZAux_Direct_Single_Move(g_handle, m_nAxis, m_distance*(m_movedir)); } UpdateData(false); }
D、通過停止按鈕的事件處理函式來停止控制器運動。
//停止void CECIDlg::OnStop() { ZAux_Direct_Single_Cancel(g_handle,m_nAxis,2); }
(6)編譯執行演示。
A、編譯執行示教例程
B、同時通過ZDevelop軟體連線同一個控制器,對運動控制效果進行觀察。
以下是軸引數的顯示,IN/OP顯示,示波器中 DPOS MSPEED顯示。
今天,正運動技術運動控制卡應用開發教程之VC6.0就分享到這裡。更多精彩內容,請關注我們的公眾號。 本文由正運動小助手原創,歡迎大家轉載,共同學習,一起提高中國智慧製造水平。文章版權歸正運動技術所有,如有轉載請註明文章來源。往期精彩回顧
運動控制卡應用開發教程之使用Qt 正運動技術XPLC516E 的開放式Linux 平臺使用(上) 正運動技術XPLC516E 的開放式Linux 平臺使用(下) 快速入門|篇六:如何進行運動控制器資料與儲存的應用? 快速入門 | 篇五:如何進行運動控制器輸入/輸出IO的應用? 快速入門丨篇四:如何進行運動控制器與觸控式螢幕通訊? 快速入門 | 篇三:如何進行運動控制器ZPLC程式開發? 快速入門 | 篇二:如何進行運動控制器ZBasic程式開發? 快速入門 | 篇一:如何進行運動控制器韌體升級?關於正運動技術
正運動技術是一家專注於運動控制技術研發與應用的國家級高新技術企業,主要從事運動控制器、運動控制卡、IO擴充套件模組、運動顯控一體機等系列產品的研發、生產、銷售和服務。
公司彙集了來自華為、中興等公司的優秀人才,在堅持自主創新的同時,積極聯合各大高校致力於運動控制技術研究與應用,是國內工控領域發展最快的企業之一,也是國內完整掌握運動控制核心技術和實時工控軟體平臺技術的企業。
- END -熱門文章