時間:2021-10-14 16:03:51來源:深圳市正運動技術有限公司
今天,正運動小助手給大家分享一下運動控制卡之ECI3808如何進行函數庫的封裝工作。
一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)利用直接basic命令發送實現功能函數。
A.ZAux_DirectCommand函數直接下發命令執行basic功能塊,指令運行速度快,但是需要加載緩沖的指令不能成功執行,能夠成功執行的下發指令推薦使用,加快效率。
B.ZAux_Execute函數直接下發命令執行basic功能塊,執行指令速度會阻塞,執行速度慢一些,所有能夠執行的字符串命令都可以成功執行。
C.一次性讀取多個軸位置,從對應的modbus寄存器讀出。
D.一次性讀取多個IN狀態位置,從對應的modbus寄存器讀出。
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 (nIDEvent == 1) { uint8 pValueList[2] = ""; //讀取0-15in狀態 ZAux_GetModbusIn(g_handle,0,15, pValueList); //設置控件顯示 SetMutiIn(pValueList[0], 0); SetMutiIn(pValueList[1], 1); float dposvalue[4] ; CString dposStatus = ""; //位置獲取 ZAux_GetModbusDpos(g_handle, 4,dposvalue); //軸0位置設置 dposStatus.Format("軸0位置:%.2f", dposvalue[0]); GetDlgItem(IDC_DPOS0)->SetWindowText(dposStatus); //軸1位置設置 dposStatus.Format("軸1位置:%.2f", dposvalue[1]); GetDlgItem(IDC_DPOS1)->SetWindowText(dposStatus); //軸2位置設置 dposStatus.Format("軸2位置:%.2f", dposvalue[2]); GetDlgItem(IDC_DPOS2)->SetWindowText(dposStatus); //軸3位置設置 dposStatus.Format("軸3位置:%.2f", dposvalue[3]); GetDlgItem(IDC_DPOS3)->SetWindowText(dposStatus); //ad值獲取 uint16 advalue[2]; CString adStatus = ""; //獲取ad狀態 GetMutiAd(g_handle,2, advalue); //AD1設置 adStatus.Format("AIN0:%.3f mv", advalue[0] * 1.0 / 4096 * 10000); GetDlgItem(IDC_AIN0)->SetWindowText(adStatus); //AD1設置 adStatus.Format("AIN1:%.3f mv", advalue[1] * 1.0 / 4096 * 10000); GetDlgItem(IDC_AIN1)->SetWindowText(adStatus); } CDialogEx::OnTimer(nIDEvent);}
(4)利用對應modbus_reg寄存器內的值一次性獲取AD值內容的函數。
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)通過斷開按鈕的事件處理函數來斷開與控制卡的連接。
·
void CSingle_move_Dlg::OnClose() //斷開鏈接{ // TODO: Add your control notification handler code here if(NULL != g_handle) { KillTimer(1); //關定時器 KillTimer(2); ZAux_Close(g_handle); g_handle = NULL; SetWindowText("未鏈接"); }}
(6)通過單位時間運動按鈕的事件處理函數來設置對應軸的參數以及當前軸單位時間內的運動距離。
·
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); //調用單位時間相對運動 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); //調用單位時間相對運動 Zaux_MoveAbsPt(g_handle, m_AxisNum, nTicks, nDistance); }}
(7)利用ZAux_DirectCommand函數封裝MOVE_PT指令以及MOVE_PTABS指令進行對應運動。
·
//單位時間絕對運動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); //判斷是否超過一次性發送字節數 if (strlen(tempbuff) > 1000 || strlen(tempbuff) < 0) { return 1; } //調用命令執行函數 iresult = ZAux_DirectCommand(handle, tempbuff, cmdbuffAck, 2048); return iresult; }} //單位時間相對運動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); //判斷是否超過一次性發送字節數 if (strlen(tempbuff) > 1000 || strlen(tempbuff) < 0) { return 1; } //調用命令執行函數 iresult = ZAux_DirectCommand(handle, tempbuff, cmdbuffAck, 2048); return iresult; }}
完整代碼獲取地址
▼
三調試與監控
編譯運行例程,同時通過ZDevelop軟件連接控制器對控制器狀態進行監控。
1.通過ZDevelop軟件的ADDA視圖進行監控模擬量輸入輸出對應的值可以看到讀取出來的一致。
2.通過ZDevelop軟件的示波器進行單位時間的運動距離。
(1)單位時間相對位置變化。
(2)單位時間絕對位置變化。
3.ZDevelop軟件調試視頻。
本次,正運動技術簡單易用的運動控制卡(四):函數庫的封裝,就分享到這里。更多精彩內容請關注“正運動小助手”公眾號,需要相關開發環境與例程代碼,請咨詢正運動技術銷售工程師:400-089-8936。
本文由正運動技術原創,歡迎大家轉載,共同學習,一起提高中國智能制造水平。文章版權歸正運動技術所有,如有轉載請注明文章來源。
上一篇:【正運動】機器視覺運動控制...
下一篇:繼電器行業概況技術特點及現狀
中國傳動網版權與免責聲明:凡本網注明[來源:中國傳動網]的所有文字、圖片、音視和視頻文件,版權均為中國傳動網(www.hysjfh.com)獨家所有。如需轉載請與0755-82949061聯系。任何媒體、網站或個人轉載使用時須注明來源“中國傳動網”,違反者本網將追究其法律責任。
本網轉載并注明其他來源的稿件,均來自互聯網或業內投稿人士,版權屬于原版權人。轉載請保留稿件來源及作者,禁止擅自篡改,違者自負版權法律責任。
產品新聞
更多>2025-06-16
2025-06-09
2025-06-06
2025-05-19
2025-04-30
2025-04-11