時(shí)間:2020-12-17 17:37:26來(lái)源:正運(yùn)動(dòng)技術(shù)
今天,正運(yùn)動(dòng)技術(shù)為大家分享一下應(yīng)用C++開(kāi)發(fā)一個(gè)激光振鏡的運(yùn)動(dòng)控制例程。
我們主要從新建MFC項(xiàng)目,添加函數(shù)庫(kù)講起,最后通過(guò)項(xiàng)目實(shí)戰(zhàn)——激光振鏡打標(biāo)例程講解,來(lái)讓大家熟悉它的項(xiàng)目開(kāi)發(fā)。
在正式學(xué)習(xí)之前,我們先了解一下正運(yùn)動(dòng)技術(shù)的運(yùn)動(dòng)控制器ZMC420SCAN。這款產(chǎn)品是20軸運(yùn)動(dòng)控制器。
ZMC420SCAN 總線(xiàn)控制器支持 ECAT/RTEX 總線(xiàn)連接,支持多達(dá)20軸運(yùn)動(dòng)控制,支持直線(xiàn)插補(bǔ)、任意圓弧插補(bǔ)、空間圓弧、螺旋插補(bǔ)、電子凸輪、電子齒輪、同步跟隨、虛擬軸設(shè)置等;采用優(yōu)化的網(wǎng)絡(luò)通訊協(xié)議可以實(shí)現(xiàn)實(shí)時(shí)的運(yùn)動(dòng)控制。
ZMC420SCAN 總線(xiàn)控制器支持脈沖軸/總線(xiàn)軸/振鏡軸混合插補(bǔ)。
ZMC420SCAN 支持10路脈沖輸出與編碼器反饋且支持4路振鏡軸,板載24點(diǎn)輸入,12點(diǎn)輸出,2AD,2DA,所有輸出口都支持高速PWM控制。
接線(xiàn)方式如下圖1所示:
圖1
ZMC420SCAN使用一套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)。
圖2
ZMC420SCAN 的PWM 輸出受正常輸出功能的控制,輸出口“ON”狀態(tài)下才能進(jìn)行PWM輸出,便于控制激光能量。
ZMC420SCAN 的輸出0-7的具有精準(zhǔn)輸出的功能,每個(gè)輸出的精準(zhǔn)輸出功能相互獨(dú)立,通過(guò)MOVEOP_DELAY 與AXIS_ZSET ,來(lái)設(shè)置每個(gè)MOVE_OP 指令是否使用精準(zhǔn)輸出以及精準(zhǔn)輸出的延時(shí),從而實(shí)現(xiàn)激光的PSO 控制。
ZMC420SCAN 的輸出0-7支持精準(zhǔn)輸出且相互獨(dú)立,通過(guò)指令:MOVE_OP,AXIS_ZSET,MOVEOP_DELAY來(lái)分別控制激光的開(kāi)關(guān),精準(zhǔn)輸出開(kāi)關(guān)及延時(shí),從而實(shí)現(xiàn)激光PSO控制。
振鏡軸:
ZMC420SCAN支持XY2-100振鏡協(xié)議,支持運(yùn)動(dòng)控制與振鏡聯(lián)合插補(bǔ)運(yùn)動(dòng)。
上位機(jī)通過(guò)網(wǎng)口與控制器相連,獲取對(duì)應(yīng)控制器的句柄,通過(guò)XY2-100協(xié)議控制振鏡軸,通過(guò)總線(xiàn)協(xié)議或者脈沖模式控制伺服或步進(jìn)軸。
本地軸號(hào)4/5可以ATYPE=21 配置為第1個(gè)振鏡, 本地軸號(hào)6/7可以ATYPE=21 配置為第2個(gè)振鏡,可通過(guò) AXIS_ADDRESS 配置軸號(hào)。
以下是激光振鏡
控制開(kāi)發(fā)流程
一 新建MFC項(xiàng)目 添加函數(shù)庫(kù)
1.在VS2017菜單“文件”→“新建”→“項(xiàng)目”,啟動(dòng)創(chuàng)建項(xiàng)目向?qū)А?/p>
2.選擇開(kāi)發(fā)語(yǔ)言為“Visual C++”和程序類(lèi)型“MFC/ATL”中的“MFC應(yīng)用程序”。
3.選擇類(lèi)型為“基于對(duì)話(huà)框”,下一步或者完成。下一步則往后繼續(xù)配置,完成就直接完成即可。把類(lèi)型選好,其他的可以在項(xiàng)目中編輯。
4.找到廠(chǎng)家提供的光盤(pán)資料,路徑如下(64位庫(kù)為例):
A.進(jìn)入光盤(pán)資料找到PC函數(shù)文件夾。
B.選擇函數(shù)庫(kù)2.1。
C.Windows平臺(tái)。
D.根據(jù)需要選擇對(duì)應(yīng)的函數(shù)庫(kù)這里選擇64位庫(kù)。
E.解壓C++的壓縮包,里面有C++對(duì)應(yīng)的函數(shù)庫(kù)。
F.函數(shù)庫(kù)具體路徑如下。
5.將廠(chǎng)商提供的C++的庫(kù)文件和相關(guān)頭文件復(fù)制到新建的項(xiàng)目里面。
6.在項(xiàng)目中添加靜態(tài)庫(kù)和相關(guān)頭文件。
靜態(tài)庫(kù):zauxdll.lib, zmotion.lib
相關(guān)頭文件:zauxdll2.h, zmotion.h
A.先右擊頭文件,接著依次選擇:“添加”→“現(xiàn)有項(xiàng)”。
B.在彈出的窗口中依次添加靜態(tài)庫(kù)和相關(guān)頭文件。
7.聲明用到的頭文件和定義控制器連接句柄。
至此項(xiàng)目新建完成。
二 查看PC函數(shù)手冊(cè) 了解其用法
1.PC函數(shù)手冊(cè)也在光盤(pán)資料里面,具體路徑如下:
2.PC編程,一般先根據(jù)控制器連接方式選擇對(duì)應(yīng)的連接函數(shù)連接控制器,返回控制器句柄。接著用返回的控制器句柄,實(shí)現(xiàn)對(duì)控制器的控制。
3.比如通過(guò)網(wǎng)口連接控制器,先使用ZAux_OpenEth()鏈接控制器,獲取控制器句柄handle。
4.通過(guò)獲取到的控制器句柄handle,對(duì)控制器進(jìn)行激光振鏡軸類(lèi)型的設(shè)置。
第三個(gè)參數(shù)的值有以下的模式選擇,使用振鏡軸需選擇軸類(lèi)型為21的模式,設(shè)置軸為振鏡軸類(lèi)型,振鏡軸類(lèi)型系統(tǒng)周期與刷新周期都要比普通軸快很多。
5.通過(guò)獲取到的控制器句柄handle,控制控制器的振鏡軸進(jìn)行多軸運(yùn)動(dòng)控制,可以進(jìn)行搭配振鏡軸與普通軸進(jìn)行混合插補(bǔ)運(yùn)動(dòng)。
三 項(xiàng)目實(shí)操之激光振鏡打標(biāo)例程
1.例程以建立板卡的連接,并設(shè)置振鏡軸的拐角減速以及速度參數(shù),對(duì)內(nèi)部進(jìn)行設(shè)置的運(yùn)動(dòng)軌跡進(jìn)行處理完成對(duì)圓形的打標(biāo)。
2.例程簡(jiǎn)易流程圖。
3.通過(guò)網(wǎng)口連接控制器,獲取控制器連接句柄。
//ip連接
void CMarkDemoDlg::OnBnClickedButton2()
{
// TODO: 在此添加控件通知處理程序代碼
char buffer[256];
char item[256] = {0};
float ftemp = 0.0;
char atemp[256] = {0}; //存放控制器型號(hào)
uint32 uitemp = 0;
int32 iresult;
if(NULL != g_handle)
{
ZMC_Close(g_handle);
g_handle = NULL;
}
GetDlgItemText(IDC_IP_COMBO,buffer,255); //獲取當(dāng)前框內(nèi)的IP地址
buffer[255] = '\0';
iresult = ZMC_OpenEth(buffer, &g_handle); //獲取與控制器建立連接的結(jié)果
if(ERR_SUCCESS != iresult)
{
g_handle = NULL;
MessageBox(_T("Connect Failed"));
SetWindowText(_T("ZControlTest-Connect Failed"));
return;
}
SetWindowText("succse");
//
CComboBox *m_pEthList;
m_pEthList = (CComboBox *)GetDlgItem(IDC_IP_COMBO); //獲取ip地址
if(NULL == m_pEthList)
{
return;
}
//
if(CB_ERR != m_pEthList->FindString(0, buffer))
{
return;
}
//加入
m_pEthList->AddString(buffer); //將ip地址加入框內(nèi)
}
4.通過(guò)串口連接控制器,獲取控制器連接句柄。
void CMarkDemoDlg::OnBnClickedButton4()
{
// TODO: 在此添加控件通知處理程序代碼
int32 iresult;
uint8 icomid;
float ftemp = 0.0;
char atemp[256] = {0}; //存放控制器型號(hào)
uint32 uitemp = 0;
int m_icombaud;
if(NULL != g_handle)
{
ZMC_Close(g_handle);
g_handle = NULL;
}
CComboBox *m_pParityList;
m_pParityList = (CComboBox *)GetDlgItem(IDC_COMBO_PARITY);
m_icombaud = GetDlgItemInt(IDC_BAUD_COMBO);
ZMC_SetComDefaultBaud(m_icombaud, 8, m_pParityList->GetCurSel(), ONESTOPBIT);
icomid = GetDlgItemInt(IDC_PORT_COMBO);
iresult = ZMC_OpenCom(icomid, &g_handle);
if(ERR_SUCCESS != iresult)
{
g_handle = NULL;
MessageBox(_T("Connect Failed"));
return;
}
SetWindowText("success");
CString Comname;
CComboBox *m_pComList;
m_pComList = (CComboBox *)GetDlgItem(IDC_PORT_COMBO);
if(NULL == m_pComList)
{
return;
}
Comname.Format("%d",icomid);
//
if(CB_ERR != m_pComList->FindString(0, Comname))
{
return;
}
//加入
m_pComList->AddString(Comname);
}
5.利用生成的句柄進(jìn)行配置軸參數(shù),軸類(lèi)型等。
int axislist[2] = {4,5};
char cbuf[32] = {};
//設(shè)置主軸
ZAux_Direct_Base(g_handle, 2, axislist);
//獲取編輯框內(nèi)要設(shè)置的參數(shù)
int MachSpeed = GetDlgItemInt(IDC_EDIT_SPEED);
int MachAddSpeed = GetDlgItemInt(IDC_EDIT_ADDSPEED);
int MachDecSpeed = GetDlgItemInt(IDC_EDIT_DECSPEED);
float MachDecAngle = GetDlgItemInt(IDC_EDIT_DECANGLE) * 3.14 / 180;
float MachStopAngle = GetDlgItemInt(IDC_EDIT_STOPANGLE) * 3.14 / 180;
//軸初始化
for (int i = 4; i <= 5; i++)
{
//設(shè)置軸類(lèi)型為振鏡軸類(lèi)型
ZAux_Direct_SetAtype(g_handle, i, 21);
//設(shè)置每圈脈沖數(shù)
ZAux_Direct_SetUnits(g_handle, i, 300);
//設(shè)置速度
ZAux_Direct_SetSpeed(g_handle, i, MachSpeed);
//設(shè)置加速度
ZAux_Direct_SetAccel(g_handle, i, MachAddSpeed);
//設(shè)置減速度
ZAux_Direct_SetDecel(g_handle, i, MachDecSpeed);
//打開(kāi)振鏡軸連續(xù)插補(bǔ)
ZAux_Direct_SetMerge(g_handle, i, 1);
//設(shè)置拐角減速模式以及自動(dòng)倒角模式
ZAux_Direct_SetCornerMode(g_handle, i, 32+2);
//設(shè)置拐角半徑
ZAux_Direct_SetZsmooth(g_handle, i, 0.1);
//設(shè)置小圓限速半徑
ZAux_Direct_SetFullSpRadius(g_handle, i, 20);
//設(shè)置減速角度
ZAux_Direct_SetDecelAngle(g_handle, i, MachDecAngle);
//設(shè)置停止角度
ZAux_Direct_SetStopAngle(g_handle, i, MachStopAngle);
//設(shè)置SP速度
ZAux_Direct_SetForceSpeed(g_handle, i, 5000);
}
//打開(kāi)精準(zhǔn)輸出功能
ZAux_DirectCommand(g_handle, "AXIS_ZSET(4)=2", cbuf, 32);
ZAux_Direct_SetOp(g_handle, 11, 1);
ZAux_Direct_Base(g_handle, 2, axislist);
ZAux_Direct_SetOp(g_handle, 1, 1);
6.本例程的軌跡移動(dòng)數(shù)據(jù)都是以小線(xiàn)段的模式自己輸入的,運(yùn)行的過(guò)程中利用了多段小線(xiàn)段進(jìn)行圓弧擬合的方式進(jìn)行加快速度的處理操作。
單個(gè)圓CAD軌跡圖:
對(duì)應(yīng)部分軌跡數(shù)據(jù)以及使用代碼如下:
//單個(gè)圓相對(duì)
double x1[] = {-0.038000, -0.113000, -0.184000, -0.250000, -0.308000, -0.357000, -0.395000, -0.421000, -0.434000, -0.434000, -0.421000, -0.395000, -0.357000, -0.308000, -0.250000, -0.184000, -0.113000, -0.038000, 0.038000, 0.113000, 0.184000, 0.250000, 0.308000, 0.357000, 0.395000, 0.421000, 0.434000, 0.434000, 0.421000, 0.395000, 0.357000, 0.308000, 0.250000, 0.184000, 0.113000, 0.038000};
double yh1[] = {0.434000, 0.421000, 0.395000, 0.357000, 0.308000, 0.250000, 0.184000, 0.113000, 0.038000, -0.038000, -0.113000, -0.184000, -0.250000, -0.308000, -0.357000, -0.395000, -0.421000, -0.434000, -0.434000, -0.421000, -0.395000, -0.357000, -0.308000, -0.250000, -0.184000, -0.113000, -0.038000, 0.038000, 0.113000, 0.184000, 0.250000, 0.308000, 0.357000, 0.395000, 0.421000, 0.434000};
小線(xiàn)段轉(zhuǎn)圓弧函數(shù)說(shuō)明:
/*************************************************************
Description: //小線(xiàn)段變?yōu)閳A弧
Input: //handle:連接的控制器句柄
//pXPos:線(xiàn)段的x坐標(biāo)數(shù)組
//pYPos:線(xiàn)段的y坐標(biāo)數(shù)組
//nMaxNum:最大點(diǎn)數(shù)
//nMaxFitNum:最大擬合段數(shù)(100~1000)
//nAbs:1=絕對(duì);0=相對(duì);表示傳入的x、y坐標(biāo)數(shù)據(jù)為絕對(duì)還是相對(duì)
//refDistance:參考精度
Output: //
Return: //錯(cuò)誤碼
*************************************************************/
int __stdcall ZGraphProcess_SegFitArc(ZMC_HANDLE handle, double *pXPos, double *pYPos, int nMaxNum, int nMaxFitNum, int nAbs, double refDistance);
使用此函數(shù)將多段小線(xiàn)段擬合成圓弧簡(jiǎn)化操作步驟,不用單獨(dú)進(jìn)行每段小線(xiàn)段的插補(bǔ)運(yùn)動(dòng)操作。此函數(shù)為內(nèi)部函數(shù),如有需求聯(lián)系請(qǐng)正運(yùn)動(dòng)技術(shù)工程師給予支持。
代碼中利用單個(gè)圓擬合進(jìn)行橫縱循環(huán)打標(biāo)陣列圓的方式進(jìn)行打標(biāo)。
int axislist[2] = {4,5};
char cbuf[32] = {};
//設(shè)置主軸
ZAux_Direct_Base(g_handle, 2, axislist);
for (int k = 0; k < 1; k++)
{
for (int i = 0; i < 5; i++)
{
//移動(dòng)到一個(gè)指定位置
ZAux_DirectCommand(g_handle, "MOVE (0, -15)", cbuf, 32);
for (int j = 0; j < 5; j++)
{
ZAux_DirectCommand(g_handle, "MOVE (-15, 0)", cbuf, 32);
ZAux_Direct_MoveOp(g_handle, 0, 1);
//進(jìn)行小線(xiàn)段轉(zhuǎn)圓弧
int err_seg = ZGraphProcess_SegFitArc(g_handle, x1, yh1, sizeof(x1)/sizeof(double), 1000, 0, 0.01);
ZAux_Direct_MoveOp(g_handle, 0, 0);
}
ZAux_DirectCommand(g_handle, "MOVE (75, 0)", cbuf, 32);
}
ZAux_DirectCommand(g_handle, "MOVE (0, 75)", cbuf, 32);
}
7.編譯運(yùn)行演示。
(1)編譯運(yùn)行示教例程。
(2)同時(shí)通過(guò)ZDevelop軟件連接同一個(gè)控制器,對(duì)運(yùn)動(dòng)控制的軸參數(shù)進(jìn)行監(jiān)控。
標(biāo)刻25個(gè)圓形用時(shí)以及示波器顯示圖形如下:
標(biāo)刻25個(gè)圓形用時(shí)以及示波器顯示圖形
正運(yùn)動(dòng)技術(shù)激光振鏡演示實(shí)拍
本次,正運(yùn)動(dòng)技術(shù)的運(yùn)動(dòng)控制卡應(yīng)用開(kāi)發(fā)教程之激光振鏡控制就分享到這里,更多精彩內(nèi)容請(qǐng)關(guān)注“正運(yùn)動(dòng)小助手”公眾號(hào)。
本文由正運(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)源。
中國(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.connectcrack.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é)任。
相關(guān)資訊
產(chǎn)品新聞
更多>B1系列脈沖型伺服工藝段功能上線(xiàn),讓機(jī)...
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
推薦專(zhuān)題
更多>