時間:2020-12-17 17:37:26來源:正運動技術(shù)
今天,正運動技術(shù)為大家分享一下應(yīng)用C++開發(fā)一個激光振鏡的運動控制例程。
我們主要從新建MFC項目,添加函數(shù)庫講起,最后通過項目實戰(zhàn)——激光振鏡打標例程講解,來讓大家熟悉它的項目開發(fā)。
在正式學(xué)習(xí)之前,我們先了解一下正運動技術(shù)的運動控制器ZMC420SCAN。這款產(chǎn)品是20軸運動控制器。
ZMC420SCAN 總線控制器支持 ECAT/RTEX 總線連接,支持多達20軸運動控制,支持直線插補、任意圓弧插補、空間圓弧、螺旋插補、電子凸輪、電子齒輪、同步跟隨、虛擬軸設(shè)置等;采用優(yōu)化的網(wǎng)絡(luò)通訊協(xié)議可以實現(xiàn)實時的運動控制。
ZMC420SCAN 總線控制器支持脈沖軸/總線軸/振鏡軸混合插補。
ZMC420SCAN 支持10路脈沖輸出與編碼器反饋且支持4路振鏡軸,板載24點輸入,12點輸出,2AD,2DA,所有輸出口都支持高速PWM控制。
接線方式如下圖1所示:
圖1
ZMC420SCAN使用一套API函數(shù),支持C、C++、C#、LabVIEW、Python、Delphi等開發(fā)語言,支持VC6.0、VB6.0、Qt、.Net等平臺,支持Windows、Linux、WinCE、iMac等操作系統(tǒng)。
圖2
ZMC420SCAN 的PWM 輸出受正常輸出功能的控制,輸出口“ON”狀態(tài)下才能進行PWM輸出,便于控制激光能量。
ZMC420SCAN 的輸出0-7的具有精準輸出的功能,每個輸出的精準輸出功能相互獨立,通過MOVEOP_DELAY 與AXIS_ZSET ,來設(shè)置每個MOVE_OP 指令是否使用精準輸出以及精準輸出的延時,從而實現(xiàn)激光的PSO 控制。
ZMC420SCAN 的輸出0-7支持精準輸出且相互獨立,通過指令:MOVE_OP,AXIS_ZSET,MOVEOP_DELAY來分別控制激光的開關(guān),精準輸出開關(guān)及延時,從而實現(xiàn)激光PSO控制。
振鏡軸:
ZMC420SCAN支持XY2-100振鏡協(xié)議,支持運動控制與振鏡聯(lián)合插補運動。
上位機通過網(wǎng)口與控制器相連,獲取對應(yīng)控制器的句柄,通過XY2-100協(xié)議控制振鏡軸,通過總線協(xié)議或者脈沖模式控制伺服或步進軸。
本地軸號4/5可以ATYPE=21 配置為第1個振鏡, 本地軸號6/7可以ATYPE=21 配置為第2個振鏡,可通過 AXIS_ADDRESS 配置軸號。
以下是激光振鏡
控制開發(fā)流程
一 新建MFC項目 添加函數(shù)庫
1.在VS2017菜單“文件”→“新建”→“項目”,啟動創(chuàng)建項目向?qū)А?/p>
2.選擇開發(fā)語言為“Visual C++”和程序類型“MFC/ATL”中的“MFC應(yīng)用程序”。
3.選擇類型為“基于對話框”,下一步或者完成。下一步則往后繼續(xù)配置,完成就直接完成即可。把類型選好,其他的可以在項目中編輯。
4.找到廠家提供的光盤資料,路徑如下(64位庫為例):
A.進入光盤資料找到PC函數(shù)文件夾。
B.選擇函數(shù)庫2.1。
C.Windows平臺。
D.根據(jù)需要選擇對應(yīng)的函數(shù)庫這里選擇64位庫。
E.解壓C++的壓縮包,里面有C++對應(yīng)的函數(shù)庫。
F.函數(shù)庫具體路徑如下。
5.將廠商提供的C++的庫文件和相關(guān)頭文件復(fù)制到新建的項目里面。
6.在項目中添加靜態(tài)庫和相關(guān)頭文件。
靜態(tài)庫:zauxdll.lib, zmotion.lib
相關(guān)頭文件:zauxdll2.h, zmotion.h
A.先右擊頭文件,接著依次選擇:“添加”→“現(xiàn)有項”。
B.在彈出的窗口中依次添加靜態(tài)庫和相關(guān)頭文件。
7.聲明用到的頭文件和定義控制器連接句柄。
至此項目新建完成。
二 查看PC函數(shù)手冊 了解其用法
1.PC函數(shù)手冊也在光盤資料里面,具體路徑如下:
2.PC編程,一般先根據(jù)控制器連接方式選擇對應(yīng)的連接函數(shù)連接控制器,返回控制器句柄。接著用返回的控制器句柄,實現(xiàn)對控制器的控制。
3.比如通過網(wǎng)口連接控制器,先使用ZAux_OpenEth()鏈接控制器,獲取控制器句柄handle。
4.通過獲取到的控制器句柄handle,對控制器進行激光振鏡軸類型的設(shè)置。
第三個參數(shù)的值有以下的模式選擇,使用振鏡軸需選擇軸類型為21的模式,設(shè)置軸為振鏡軸類型,振鏡軸類型系統(tǒng)周期與刷新周期都要比普通軸快很多。
5.通過獲取到的控制器句柄handle,控制控制器的振鏡軸進行多軸運動控制,可以進行搭配振鏡軸與普通軸進行混合插補運動。
三 項目實操之激光振鏡打標例程
1.例程以建立板卡的連接,并設(shè)置振鏡軸的拐角減速以及速度參數(shù),對內(nèi)部進行設(shè)置的運動軌跡進行處理完成對圓形的打標。
2.例程簡易流程圖。
3.通過網(wǎng)口連接控制器,獲取控制器連接句柄。
//ip連接
void CMarkDemoDlg::OnBnClickedButton2()
{
// TODO: 在此添加控件通知處理程序代碼
char buffer[256];
char item[256] = {0};
float ftemp = 0.0;
char atemp[256] = {0}; //存放控制器型號
uint32 uitemp = 0;
int32 iresult;
if(NULL != g_handle)
{
ZMC_Close(g_handle);
g_handle = NULL;
}
GetDlgItemText(IDC_IP_COMBO,buffer,255); //獲取當前框內(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.通過串口連接控制器,獲取控制器連接句柄。
void CMarkDemoDlg::OnBnClickedButton4()
{
// TODO: 在此添加控件通知處理程序代碼
int32 iresult;
uint8 icomid;
float ftemp = 0.0;
char atemp[256] = {0}; //存放控制器型號
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.利用生成的句柄進行配置軸參數(shù),軸類型等。
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è)置軸類型為振鏡軸類型
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);
//打開振鏡軸連續(xù)插補
ZAux_Direct_SetMerge(g_handle, i, 1);
//設(shè)置拐角減速模式以及自動倒角模式
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);
}
//打開精準輸出功能
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.本例程的軌跡移動數(shù)據(jù)都是以小線段的模式自己輸入的,運行的過程中利用了多段小線段進行圓弧擬合的方式進行加快速度的處理操作。
單個圓CAD軌跡圖:
對應(yīng)部分軌跡數(shù)據(jù)以及使用代碼如下:
//單個圓相對
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};
小線段轉(zhuǎn)圓弧函數(shù)說明:
/*************************************************************
Description: //小線段變?yōu)閳A弧
Input: //handle:連接的控制器句柄
//pXPos:線段的x坐標數(shù)組
//pYPos:線段的y坐標數(shù)組
//nMaxNum:最大點數(shù)
//nMaxFitNum:最大擬合段數(shù)(100~1000)
//nAbs:1=絕對;0=相對;表示傳入的x、y坐標數(shù)據(jù)為絕對還是相對
//refDistance:參考精度
Output: //
Return: //錯誤碼
*************************************************************/
int __stdcall ZGraphProcess_SegFitArc(ZMC_HANDLE handle, double *pXPos, double *pYPos, int nMaxNum, int nMaxFitNum, int nAbs, double refDistance);
使用此函數(shù)將多段小線段擬合成圓弧簡化操作步驟,不用單獨進行每段小線段的插補運動操作。此函數(shù)為內(nèi)部函數(shù),如有需求聯(lián)系請正運動技術(shù)工程師給予支持。
代碼中利用單個圓擬合進行橫縱循環(huán)打標陣列圓的方式進行打標。
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++)
{
//移動到一個指定位置
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);
//進行小線段轉(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.編譯運行演示。
(1)編譯運行示教例程。
(2)同時通過ZDevelop軟件連接同一個控制器,對運動控制的軸參數(shù)進行監(jiān)控。
標刻25個圓形用時以及示波器顯示圖形如下:
標刻25個圓形用時以及示波器顯示圖形
正運動技術(shù)激光振鏡演示實拍
本次,正運動技術(shù)的運動控制卡應(yīng)用開發(fā)教程之激光振鏡控制就分享到這里,更多精彩內(nèi)容請關(guān)注“正運動小助手”公眾號。
本文由正運動技術(shù)原創(chuàng),歡迎大家轉(zhuǎn)載,共同學(xué)習(xí),一起提高中國智能制造水平。文章版權(quán)歸正運動技術(shù)所有,如有轉(zhuǎn)載請注明文章來源。
中國傳動網(wǎng)版權(quán)與免責聲明:凡本網(wǎng)注明[來源:中國傳動網(wǎng)]的所有文字、圖片、音視和視頻文件,版權(quán)均為中國傳動網(wǎng)(m.u63ivq3.com)獨家所有。如需轉(zhuǎn)載請與0755-82949061聯(lián)系。任何媒體、網(wǎng)站或個人轉(zhuǎn)載使用時須注明來源“中國傳動網(wǎng)”,違反者本網(wǎng)將追究其法律責任。
本網(wǎng)轉(zhuǎn)載并注明其他來源的稿件,均來自互聯(lián)網(wǎng)或業(yè)內(nèi)投稿人士,版權(quán)屬于原版權(quán)人。轉(zhuǎn)載請保留稿件來源及作者,禁止擅自篡改,違者自負版權(quán)法律責任。