時(shí)間:2020-11-27 16:03:12來(lái)源:正運(yùn)動(dòng)技術(shù)
今天,正運(yùn)動(dòng)技術(shù)為大家分享一下應(yīng)用C++開(kāi)發(fā)一個(gè)多段連續(xù)插補(bǔ)的運(yùn)動(dòng)控制應(yīng)用。
我們主要從新建MFC項(xiàng)目,添加函數(shù)庫(kù)講起,再了解PC函數(shù)用法,最后通過(guò)項(xiàng)目實(shí)戰(zhàn)——連續(xù)插補(bǔ)運(yùn)動(dòng)例程講解,來(lái)讓大家熟悉C++的項(xiàng)目開(kāi)發(fā)。
在正式學(xué)習(xí)之前,我們先了解一下正運(yùn)動(dòng)技術(shù)的運(yùn)動(dòng)控制卡ECI2418和ECI2618。這兩款產(chǎn)品分別是4軸,6軸運(yùn)動(dòng)控制卡。
ECI2418支持4軸脈沖輸入與編碼器反饋,板載24點(diǎn)輸入,16點(diǎn)輸出,2AD,2DA,支持手輪接口,其中特定輸出口支持高速PWM控制。
ECI2618支持6軸脈沖輸入與編碼器反饋,板載24點(diǎn)輸入,16點(diǎn)輸出,2AD,2DA,支持手輪接口,其中特定輸出口支持高速PWM控制。
ECI2418,ECI2618均使用同一套API函數(shù),均支持C、C++、C#、LabVIEW、Python、Delphi等開(kāi)發(fā)語(yǔ)言,支持VC6.0、VB6.0、Qt、.Net等平臺(tái),支持Windows、Linux、WinCE、iMac等操作系統(tǒng)。
以下是C++
開(kāi)發(fā)流程
01 新建MFC項(xiàng)目,添加函數(shù)庫(kù)。
1、在VS2015菜單“文件”→“新建”→ “項(xiàng)目”,啟動(dòng)創(chuàng)建項(xiàng)目向?qū)А?/strong>
2、選擇開(kāi)發(fā)語(yǔ)言為“Visual C++”和程序類型“MFC應(yīng)用程序”。
3、下一步即可。
4、選擇類型為“基于對(duì)話框”,下一步或者完成。
下一步則往后繼續(xù)配置,完成就直接完成即可。這里就不需要再配置了,無(wú)關(guān)緊要的,只要這個(gè)類型選好就行,其他的可以在項(xiàng)目中編輯。
5、找到廠家提供的光盤資料,路徑如下(64位庫(kù)為例)。
1)進(jìn)入光盤資料找到PC函數(shù)文件夾。
2)選擇函數(shù)庫(kù)2.1。
3)Windows平臺(tái)。
4)根據(jù)需要選擇對(duì)應(yīng)的函數(shù)庫(kù)這里選擇64位庫(kù)。
5)解壓C++的壓縮包,里面有C++對(duì)應(yīng)的函數(shù)庫(kù)。
6)函數(shù)庫(kù)具體路徑如下。
6、將廠商提供的C++的庫(kù)文件和相關(guān)頭文件復(fù)制到新建的項(xiàng)目里面。
7、在項(xiàng)目中添加靜態(tài)庫(kù)和相關(guān)頭文件。
靜態(tài)庫(kù):zauxdll.lib, zmotion.lib
相關(guān)頭文件:zauxdll2.h, zmotion.h
1)先右擊頭文件,接著依次選擇:“添加”→“現(xiàn)有項(xiàng)”。
2)在彈出的窗口中依次添加靜態(tài)庫(kù)和相關(guān)頭文件。
3)聲明用到的頭文件和定義控制器連接句柄。
至此項(xiàng)目新建完成。
02 查看PC函數(shù)手冊(cè),了解其用法。
1、PC函數(shù)手冊(cè)也在光盤資料里面。
具體路徑如下:
2、PC編程
先根據(jù)控制器連接方式選擇對(duì)應(yīng)的連接函數(shù)連接控制器,返回控制器句柄。接著用返回的控制器句柄,實(shí)現(xiàn)對(duì)控制器的控制。
比如通過(guò)網(wǎng)口連接控制器,先使用ZAux_OpenEth()鏈接控制器,獲取控制器句柄handle。
通過(guò)獲取到的控制器句柄handle,對(duì)控制器進(jìn)行單軸運(yùn)動(dòng)控制。
通過(guò)獲取到的控制器句柄handle,對(duì)控制器進(jìn)行多軸運(yùn)動(dòng)控制。
//多軸運(yùn)動(dòng)
intaxislist[ 4] = { 0, 1, 2, 3 }; //運(yùn)動(dòng)BASE軸列表
floatdislist[ 4] = { 100,100,100,100}; //運(yùn)動(dòng)距離列表
ZAux_Direct_Move(g_handle, 4, axislist, dislist); //多軸運(yùn)動(dòng)
03 項(xiàng)目實(shí)戰(zhàn)之連續(xù)插補(bǔ)運(yùn)動(dòng)例程講解
1、例程以建立板卡的連接,執(zhí)行3段連續(xù)軌跡的加工為目標(biāo)。
2、例程簡(jiǎn)易流程圖。
// 相關(guān)函數(shù)
ZAux_OpenEth(IP_buffer, &g_handle); //連接控制器
ZAux_Direct_GetAllAxisPara(g_handle, " DPOS", 4, showpos); //獲取當(dāng)前軸位
ZAux_Direct_GetAllAxisPara(g_handle, " MSPEED", 4, mspeed); //更新軸速度
ZAux_Direct_Single_Cancel(g_handle, 0, 2); //停止主軸運(yùn)動(dòng)
ZAux_Direct_Move(g_handle, 4, axislist, dislist1); //第1段多軸插補(bǔ)指令
ZAux_Direct_Move(g_handle, 4, axislist, dislist2); //第2段多軸插補(bǔ)指令
ZAux_Direct_Move(g_handle, 4, axislist, dislist3); //第3段多軸插補(bǔ)指令
ZAux_Close(g_handle);//斷開(kāi)連接
3、通過(guò)網(wǎng)口連接控制器,獲取控制器連接句柄。
//Link按鈕事件處理函數(shù)
voidCMergeDlg::OnBnClickedButtonLink()
{
charbuffer[256];
int32 iresult;
//如果之前有連接控制器著先斷開(kāi)連接
if(NULL != g_handle)
{
ZAux_Close(g_handle);
g_handle = NULL;
}
//從IP下拉框中獲取IP
GetDlgItemText(IDC_COMBOX_IP, buffer, 255);
buffer[255] = '\0';
//通過(guò)PC函數(shù)庫(kù)提供的連接控制器的函數(shù)接口(API),連接控制器
iresult = ZAux_OpenEth(buffer, &g_handle);
if(ERR_SUCCESS != iresult)
{
g_handle = NULL;
MessageBox(_T(" 鏈接失敗"));
SetWindowText(" 未鏈接");
return;
}
SetWindowText(" 已鏈接");
//啟動(dòng)定時(shí)器
SetTimer(1, 100, NULL);
SetTimer(2, 100, NULL);
//初始化軸參數(shù)
for( inti = 0; i<4; i++)
{
ZAux_Direct_SetAtype(g_handle, i, 1); //軸類型
ZAux_Direct_SetUnits(g_handle, i, 1000); //脈沖當(dāng)量
ZAux_Direct_SetSpeed(g_handle, i, 100); //速度
ZAux_Direct_SetAccel(g_handle, i, 1000); //加速度
ZAux_Direct_SetDecel(g_handle, i, 1000); //減速度
ZAux_Direct_SetSramp(g_handle, i, 100); //S曲線時(shí)間
}
}
4、通過(guò)定時(shí)器1更新控制器軸0-3的位置信息和速度信息。
//定時(shí)器
void CMergeDlg::OnTimer(UINT_PTR nIDEvent)
{
if (NULL == g_handle)
{
MessageBox(_T(" 鏈接斷開(kāi)"));
return;
}
switch (nIDEvent)
{
case 1: //更新控制器軸0-3的位置信息和速度信息
CString Xpos, Xmspeed;
CString Ypos, Ymspeed;
CString Zpos, Zmspeed;
CString Upos, Umspeed;
float showpos[4] = { 0 };
float mspeed[4] = { 0 };
int status = 0;
//獲取當(dāng)前軸位置
ZAux_Direct_GetAllAxisPara(g_handle, " DPOS", 4, showpos);
Xpos.Format(" X: %.2f", showpos[0]);
Ypos.Format(" Y: %.2f", showpos[1]);
Zpos.Format(" Z: %.2f", showpos[2]);
Upos.Format(" U: %.2f", showpos[3]);
GetDlgItem(IDC_XPOS)->SetWindowText(Xpos);
GetDlgItem(IDC_YPOS)->SetWindowText(Ypos);
GetDlgItem(IDC_ZPOS)->SetWindowText(Zpos);
GetDlgItem(IDC_UPOS)->SetWindowText(Upos);
//判斷主軸狀態(tài)(即BASE的第一個(gè)軸)
ZAux_Direct_GetIfIdle(g_handle, 0, &status);
if (status == -1)
{
GetDlgItem(IDC_RUNSTATUS)->SetWindowText(" 運(yùn)動(dòng)狀態(tài):停止中");
}
else
{
GetDlgItem(IDC_RUNSTATUS)->SetWindowText(" 運(yùn)動(dòng)狀態(tài):運(yùn)動(dòng)中");
}
//更新軸速度
ZAux_Direct_GetAllAxisPara(g_handle, " MSPEED", 4, mspeed);
Xmspeed.Format(" X軸速度: %.2f", mspeed[0]);
Ymspeed.Format(" Y軸速度: %.2f", mspeed[1]);
Zmspeed.Format(" Z軸速度: %.2f", mspeed[2]);
Umspeed.Format(" U軸速度: %.2f", mspeed[3]);
GetDlgItem(IDC_SPEED_X)->SetWindowText(Xmspeed);
GetDlgItem(IDC_SPEED_Y)->SetWindowText(Ymspeed);
GetDlgItem(IDC_SPEED_Z)->SetWindowText(Zmspeed);
GetDlgItem(IDC_SPEED_U)->SetWindowText(Umspeed);
break;
}
CDialogEx::OnTimer(nIDEvent);
}
5、通過(guò)啟動(dòng)按鈕的事件處理函數(shù)來(lái)啟動(dòng)連續(xù)插補(bǔ)運(yùn)動(dòng)。
//啟動(dòng)按鈕
void CMergeDlg::OnBnClickedButtonRun()
{
if (NULL == g_handle)
{
MessageBox(_T( "鏈接斷開(kāi)"));
return;
}
UpdateData(true);//刷新參數(shù)
int corner_mode = 0;
int axislist[4] = { 0,1,2,3 }; //運(yùn)動(dòng)BASE軸列表
float dislist1[4] = { 0 }; //運(yùn)動(dòng)距離列表
float dislist2[4] = { 0 };
float dislist3[4] = { 0 };
//選擇參與運(yùn)動(dòng)的軸,第一個(gè)軸為主軸,插補(bǔ)參數(shù)全用主軸參數(shù)
ZAux_Direct_SetSpeed(g_handle, axislist[0], M_Speed); //速度
ZAux_Direct_SetAccel(g_handle, axislist[0], M_Accel); //加速度
ZAux_Direct_SetDecel(g_handle, axislist[0], M_Decel); //減速度
ZAux_Direct_SetSramp(g_handle, axislist[0], M_SRAMP); //S曲線時(shí)間
//設(shè)置拐角模式
if (m_mode1 == 1)
{
corner_mode = corner_mode + 2;
}
if (m_mode2 == 1)
{
corner_mode = corner_mode + 8;
}
if (m_mode3 == 1)
{
corner_mode = corner_mode + 32;
}
ZAux_Direct_SetCornerMode(g_handle, axislist[0], corner_mode);
//設(shè)置連續(xù)插補(bǔ)
ZAux_Direct_SetMerge(g_handle, axislist[0], m_mode);
//設(shè)置SP速度
ZAux_Direct_SetForceSpeed(g_handle, axislist[0], SP_Speed);
//設(shè)置開(kāi)始.結(jié)束減速角度,轉(zhuǎn)換為弧度
ZAux_Direct_SetDecelAngle(g_handle, axislist[0], StartAngle * 3.14 / 180);
ZAux_Direct_SetStopAngle(g_handle, axislist[0], StopAngle * 3.14 / 180);
//設(shè)置小圓限速半徑
ZAux_Direct_SetFullSpRadius(g_handle, axislist[0], SP_Radius);
//設(shè)置拐角半徑
ZAux_Direct_SetZsmooth(g_handle, axislist[0], CornerRadius);
//SP指令中自動(dòng)拐角模式中設(shè)置一個(gè)較大的startmovespeed與endmovespeed
ZAux_Direct_SetStartMoveSpeed(g_handle, axislist[0], 10000);
ZAux_Direct_SetEndMoveSpeed(g_handle, axislist[0], 10000);
//更新運(yùn)動(dòng)數(shù)據(jù)
dislist1[0] = DPOS_X_1; dislist1[1] = DPOS_Y_1;
dislist1[2] = DPOS_Z_1; dislist1[3] = DPOS_U_1;
dislist2[0] = DPOS_X_2; dislist2[1] = DPOS_Y_2;
dislist2[2] = DPOS_Z_2; dislist2[3] = DPOS_U_2;
dislist3[0] = DPOS_X_3; dislist3[1] = DPOS_Y_3;
dislist3[2] = DPOS_Z_3; dislist3[3] = DPOS_U_3;
//開(kāi)始運(yùn)動(dòng)
ZAux_Direct_Move(g_handle, 4, axislist, dislist1);
ZAux_Direct_Move(g_handle, 4, axislist, dislist2);
ZAux_Direct_Move(g_handle, 4, axislist, dislist3);
}
6、通過(guò)停止按鈕的事件處理函數(shù)來(lái)停止插補(bǔ)運(yùn)動(dòng)。
//停止按鈕
void CMergeDlg::OnBnClickedButtonStop()
{
if (NULL == g_handle)
{
MessageBox(_T("鏈接斷開(kāi)"));
return;
}
ZAux_Direct_Single_Cancel(g_handle, 0, 2); //停止主軸 BASE的一個(gè)軸
}
7、軸坐標(biāo)清零。
//坐標(biāo)清零
void CMergeDlg::OnBnClickedButtonClear()
{
if (NULL == g_handle)
{
MessageBox(_T("鏈接斷開(kāi)"));
return;
}
for (int i = 0; i<4; i++)
{
ZAux_Direct_SetDpos(g_handle, i, 0); //DPOS設(shè)為零
}
}
8、編譯運(yùn)行演示。
1)編譯運(yùn)行示教例程。
2)同時(shí)通過(guò)ZDevelop軟件連接同一個(gè)控制器,對(duì)運(yùn)動(dòng)控制的軸參數(shù)進(jìn)行監(jiān)控。
A、連續(xù)插補(bǔ)加自動(dòng)倒角的位置波形。
B、不開(kāi)啟連續(xù)插補(bǔ)的速度波形。
C、連續(xù)插補(bǔ)加合適的拐角減速的速度波形。
正運(yùn)動(dòng)技術(shù)C++開(kāi)發(fā)就講到這里。更多學(xué)習(xí)視頻及圖文請(qǐng)關(guān)注我們的公眾號(hào)“正運(yùn)動(dòng)小助手”。
本文由正運(yùn)動(dòng)小助手原創(chuàng),歡迎大家轉(zhuǎn)載,共同學(xué)習(xí),一起提高中國(guó)智能制造水平。文章版權(quán)歸正運(yùn)動(dòng)技術(shù)所有,如有轉(zhuǎn)載請(qǐng)注明文章來(lái)源。
中國(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.wangxinlc.cn)獨(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é)任。
相關(guān)資訊
產(chǎn)品新聞
更多>2025-04-30
性能躍升20%!維宏NK300CX Plus數(shù)控系統(tǒng)...
2025-04-11
rpi-image-gen:樹(shù)莓派軟件鏡像構(gòu)建的終...
2025-04-08
【產(chǎn)品解讀】全面提升精密制造檢測(cè)節(jié)拍...
2025-03-31
激光閃耀 智慧引領(lǐng) | WISE MASER 黑武士...
2025-03-20