今天,正運動小助手給大家分享一下開放式激光振鏡運動控制器:C++快速調(diào)用圖形庫應用,本文以二維碼打標、文本打標、矢量圖形打標為例, 解決用戶在激光打標時需要進行各種復雜的操作和函數(shù)庫調(diào)用時容易出現(xiàn)的錯誤問題。
01 ZMC408SCAN控制器介紹
ZMC408SCAN是正運動技術(shù)推出的高性能總線雙振鏡運動控制器,集成了2個百兆以太網(wǎng)口,支持EtherCAT、EtherNET、CAN、RS232、RS485、24路通用數(shù)字輸入、20路通用數(shù)字輸出、2路通用模擬量輸出、2路通用模擬量輸入、4個本地差分脈沖軸接口、1個MPG手輪編碼器接口、2個帶反饋振鏡接口、1個激光電源專用接口、一個EXIO可配置擴展IO接口。
ZMC408SCAN控制器支持EtherCAT總線連接,支持最快500μs的刷新周期,支持最多達16軸運動控制,支持直線插補、任意圓弧插補、空間圓弧、螺旋插補、電子凸輪、電子齒輪、同步跟隨、虛擬軸設(shè)置等;采用優(yōu)化的網(wǎng)絡通訊協(xié)議可以實現(xiàn)實時的運動控制。單臺電腦最多支持達256個ZMC控制器同時連接。

(1)ZMC408SCAN內(nèi)置高精度PSO位置同步輸出功能,在加工圓角、曲線部分時即使進行了減速調(diào)整,在高速加工的場合,也能控制激光輸出的間距保持恒定;
(2)支持激光振鏡控制和振鏡反饋,包含2個振鏡接口,支持2D振鏡和3D振鏡,配合不帶加減速的運動指令MOVESCAN,拐角處振鏡加工自動延時,完成精準高效的激光控制,提高激光加工設(shè)備的產(chǎn)能;
(3)通過指令在運動中靈活的調(diào)節(jié)激光開光/關(guān)光延時,響應快,精確到us級別的控制,且設(shè)置過程簡單,大大縮短了工程師的調(diào)參時間;
(4)自帶LASER激光器控制接口,支持IPG、YLR、YLS等類型激光電源,還帶一個EXIO擴展IO接口,通過定制轉(zhuǎn)接板,靈活控制市場上主流的各種激光器;
(5)支持PC同時控制16個ZMC408SCAN控制器同時工作,形成一種振鏡陣列的激光加工;
(6)板載4路高速差分脈沖輸出,并帶4路高速差分編碼器反饋,支持EtherCAT總線驅(qū)動器的控制,支持5軸XYZAC軸的插補,支持振鏡軸與運動軸混合插補。
1.基本規(guī)格參數(shù)

2.接口定義


3.參考架構(gòu)

02 打標庫說明
1.目的
為解決激光打標時需要進行各種復雜的操作和函數(shù)庫調(diào)用時容易出現(xiàn)的錯誤問題。用戶可以通過PC更加方便的進行加工文件的生成,在軟件中進行圖形加工操作。
如要打標二維碼,只需要通過條碼指令ZmotionLaser_BarCode(int nTechnology,const char *pStrText,const char *pStrType,double dX,double dY,double dSizeX,double dSizeY,double dAngle)將參數(shù)設(shè)置好,選擇好要標刻的碼類型,將標刻內(nèi)容輸入即可,通過程序?qū)⑵滠壽E生成的三次文件等待啟動標刻。
如要打標文本,則通過對應的文本指令ZmotionLaser_Text(int nTechnology,const char *pStrText,double dX,double dY,double dAccuracy)設(shè)置好其工藝參數(shù)大小、旋轉(zhuǎn)角度等,而后輸入我們要標刻的文本內(nèi)容,通過三次文件的形式進行打標。
我們打標條碼、二維碼、不同字體樣式的文本、矢量圖形、位圖等,都有對應的接口指令,從而實現(xiàn)快速調(diào)參開發(fā),可以節(jié)省工程師大量的編程及工藝規(guī)劃時間。
2.方式
使用ZmotionLaser.dll與ZmotionLaser.lib庫添加到需要使用的程序中,調(diào)用ZmotionLaser.h中的相關(guān)函數(shù)即可生成需要加工的三次文件,在控制器中運行該三次文件就可以進行加工(需要帶Zmotion庫與ZMotionCad3庫)。
3.三次文件使用步驟如下
(1)先開啟文件生成;
(2)進行各種初始化,確定軸與輸出口;
(3)設(shè)置各種加工參數(shù),調(diào)整加工效果;
(4)進行加工函數(shù)的調(diào)用,將需要加工的數(shù)據(jù)寫入;
(5)調(diào)用生成函數(shù)生成加工三次文件;
(6)關(guān)閉文件生成。
4.優(yōu)勢
僅需要很少的指令填上對應參數(shù)就能實現(xiàn)一個類型打標,將復雜的指令編程簡單化,對于加工軌跡復雜、文件較大也能實現(xiàn)動態(tài)追加文件發(fā)送字符串運行。
03 指令說明
一、條碼
1.函數(shù)名: uint32 ZmotionLaser_BarCode(int nTechnology,const char *pStrText,const char *pStrType,double dX,double dY,double dSizeX,double dSizeY,double dAngle)
2.說明: 進行條碼圖形的加工,通過該指令配合上幾個常用指令我們可以輕松選擇要打標的條碼類型,以及更改我們想要的尺寸大小、打標幅面內(nèi)的位置。
二、文本及狀態(tài)設(shè)置
1.文本
(1)函數(shù)名: uint32 ZmotionLaser_Text(int nTechnology,const char *pStrText,double dX,double dY,double dAccuracy)
(2)說明: 進行文本圖形的加工,通過該指令配合上幾個常用指令我們可以簡單的實現(xiàn)文本打標,只需要將打標的內(nèi)容填到對應參數(shù)位置,在對應參數(shù)寫好工藝參數(shù),打標坐標位置等。
2.文本狀態(tài)設(shè)置
(1)函數(shù)名: uint32 ZmotionLaser_SetTextStyle(const char * pStrFont,bool bThickness,bool bItalics,bool bUnderline,bool bDelete,double dHeight,double dWidthR,double dAngle,double dTilt)
(2)說明: 設(shè)置文本的狀態(tài),需要確定文本的字體、風格、尺寸、角度和傾斜等狀態(tài)。該狀態(tài)設(shè)置后如果不重新設(shè)置,后續(xù)所有文本的狀態(tài)都按照該狀態(tài)進行,配合文本指令使用進行文本打標。
三、矢量圖形參數(shù)設(shè)置
1.函數(shù)名: uint32 ZmotionLaser_SetVectPar(int nPower, double dFreq,double dMarkSp,double dJumpSp,double dOpenDelay,double dCloseDelay,double dJumpDelay,double dCorAngle,double dCorDelay,double dEndDelay,int nTechnology)
2.說明: 設(shè)置某一工藝的矢量圖形加工參數(shù)。該指令用于矢量圖形加工時參數(shù)設(shè)置,針對矢量圖形的加工復雜性,通過將參數(shù)提前寫入,以在打標時快速響應。
04 激光振鏡控制實例
一、二維碼打標
1.二維碼打標參數(shù)設(shè)置界面

2.操作流程
(1)架好設(shè)備后,用振鏡矯正工具將振鏡矯正(可參考正運動小助手文章“開放式激光振鏡運動控制器:C++振鏡矯正方法與實現(xiàn)”);
(2)矯正完成后,如上圖選擇對應的IP地址進行連接,選擇對應的激光器類型、設(shè)置好運動參數(shù)、選好填充工藝并將參數(shù)設(shè)置好、選擇要標刻的條碼類型、設(shè)置條碼大小及打標位置旋轉(zhuǎn)角度等,在內(nèi)容欄填入標刻內(nèi)容;
(3)準備工作完成,點擊標刻進行打標,如果中途發(fā)現(xiàn)有異常,點擊停止即可。
通過這個例程我們可以實現(xiàn)多種類型條碼、二維碼的打標,適用于多種激光器類型,還能隨時調(diào)整打標的內(nèi)容、大小、位置以及在xy平面上的角度,而且通過對功率的調(diào)整我們可以在不同的物品上進行打標,如平面產(chǎn)品包裝、充電器、手機外殼、一些金屬產(chǎn)品等。
我們用到的頭文件和定義控制器句柄,實現(xiàn)與控制器連接的第一步。通過ZAux_OpenEth(char *ipaddr, ZMC_HANDLE * phandle)指令連接控制器獲取返回句柄。斷開連接則用ZAux_Close(ZMC_HANDLE handle)。連接上就能對控制器實現(xiàn)交互控制了。

程序如下:
//連接控制器
void CZmc_laserDlg::OnBnClickedBtnConnet()
{
char buffer[256];
int32 iresult;
if(NULL != m_Handle)
{
ZAux_Close(m_Handle);
m_Handle = NULL;
}
GetDlgItemText(IDC_IPLIST,buffer,255);
buffer[255] = '\0';
iresult = ZAux_OpenEth(buffer, &m_Handle);
if(ERR_SUCCESS != iresult)
{
m_Handle = NULL;
MessageBox(_T("鏈接失敗"));
SetWindowText("未鏈接");
return;
}
SetWindowText("已鏈接");
for(int iAxis = 4;iAxis<=5;iAxis++)
{
iresult = ZAux_Direct_SetAtype(m_Handle,iAxis,21);
iresult = ZAux_Direct_SetUnits(m_Handle,iAxis,500);
}
OnCbnSelchangeComboLaser();
}
//斷開控制器
void CZmc_laserDlg::OnBnClickedBtnClose()
{
if(NULL != m_Handle)
{
KillTimer(0); //關(guān)定時器
ZAux_Close(m_Handle);
m_Handle = NULL;
SetWindowText("未鏈接");
}
}
3.選擇激光器類型
通過指令ZAux_SetExioType(ZMC_HANDLE handle,int iType)設(shè)定轉(zhuǎn)接板類型,不同的轉(zhuǎn)接板類型對應不同類型的激光器(需定制)。
使用時我們只需要選擇對應的激光器類型,并按照對應接口接好線,調(diào)節(jié)好功率(激光能量)、頻率。

程序如下:
//修改激光器類型
void CZmc_laserDlg::OnCbnSelchangeComboLaser()
{
if(NULL == m_Handle)
{
MessageBox(_T("控制器未連接"));
return;
}
UpdateData(TRUE);
if(m_nLaserType == FIBER_408) //408 FIBER轉(zhuǎn)換?板參數(shù)設(shè)置
{
int iret = ZAux_SetExioType(m_Handle,0);
m_nEnableIO = 47;
m_nLaserIO = 8;
m_nRedIO = 48;
m_nAout = 3;
m_nPwmIo = 9;
}
else if(m_nLaserType == LASER_408)
{
int iret = ZAux_SetExioType(m_Handle,-1);
m_nEnableIO = 31;
m_nLaserIO = 8;
m_nRedIO = 32;
m_nAout = 2;
m_nPwmIo = 9;
}
else if(m_nLaserType == YAG_408) //408 YAG轉(zhuǎn)換板參數(shù)設(shè)置
{
int iret = ZAux_SetExioType(m_Handle,1);
m_nEnableIO = 47;
m_nLaserIO = 8;
m_nRedIO = 48;
m_nAout = 3;
m_nPwmIo = 9;
}
else if(m_nLaserType == FIBER_504) //504
{
m_nEnableIO = 5;
m_nLaserIO = 6;
m_nRedIO = 28;
m_nAout = 2;
m_nPwmIo = 7;
}
UpdateData(FALSE);
}
4.設(shè)置運動參數(shù)和二維碼大小參數(shù)
將運動參數(shù)及填充工藝參數(shù)存到變量里面,在后面打標過程中調(diào)用此參數(shù),現(xiàn)在這個值是一個初始化值,只是一個參考作用,具體參數(shù)還要通過測試調(diào)整后才能更適合相應機臺及打標加工,空移速度為后續(xù)打標軌跡中空走軌跡所用速度。
開關(guān)光延時是用于提前開光和延時關(guān)光,設(shè)置適當?shù)拈_光延時參數(shù)可以去除在運動起點出現(xiàn)的 “火柴頭”,但如果開光延時參數(shù)設(shè)置太大則會導致起始段缺筆的現(xiàn)象。
可以通過ZAux_Direct_MoveOpDelay設(shè)置為負值,負值標刻激光器提前出光。一般光纖激光器的開光延時就是設(shè)置負值,而其他激光器,如端泵激光器是設(shè)置正值的。
設(shè)置適當?shù)年P(guān)光延時參數(shù)可以去除在運動結(jié)束時出現(xiàn)的不閉合現(xiàn)象,但如果關(guān)光延時設(shè)置太大會導致結(jié)束段出現(xiàn)“火柴頭”。
關(guān)光指令后調(diào)用指令ZAux_Direct_MoveDelay設(shè)置對應的延時時間實現(xiàn)延時控制。
設(shè)置適當?shù)墓战茄訒r參數(shù)可以去除在運動軌跡是直角時出現(xiàn)的圓角現(xiàn)象,但如果拐角延時設(shè)置太大會導致標刻時間增加,且拐角處有重點現(xiàn)象,為解決這一問題,引入拐角自動延時模式,根據(jù)拐角角度計算延時時間。
調(diào)用指令ZAux_Direct_SetCornerMode設(shè)置拐角延時模式為2,通過 ZAux_Direct_SetDecelAngle與ZAux_Direct_SetStopAngle設(shè)置拐角開始延時和結(jié)束延時角度、ZAux_Direct_SetZsmooth設(shè)置最大拐角延時時間。

實際的拐角延時則依據(jù)軌跡的實際角度自動計算對應拐角延時時間,在設(shè)定的角度范圍內(nèi),延時時間呈線性分布。

程序如下:
CZmc_laserDlg::CZmc_laserDlg(CWnd* pParent /*=NULL*/)
: CDialogEx(CZmc_laserDlg::IDD, pParent)
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
m_nEnableIO = 47;
m_nLaserIO = 8;
m_nRedIO = 48;
m_nAout = 3;
m_nAoutVal = 128;
m_nPwmIo = 9;
m_nPwmFreq = 40000;
m_dSpeed = 1000;
m_dEmpSpeed = 1000;
m_nStartDelay = 1000;
m_nLastDelay = 1000;
m_nCorDelay = 1000;
m_nLaserType = 0;
//填充參數(shù)初始化
m_FillPara.m_bEnable = true; //填充使能
m_FillPara.m_bOutline = true; //使能輪廓
m_FillPara.m_bOutlineFirst = false; //輪廓優(yōu)先
m_FillPara.m_bEdge = false; //是否繞邊走一次
m_FillPara.m_bAverage = true; //是否平均分布填充線
m_FillPara.m_nType = 1; //填充類型
m_FillPara.m_nAngle = 0; //填充線角度
m_FillPara.m_nNum = 0; //填充線數(shù)目
m_FillPara.m_dLineSpace = 0.1; //線間距
m_FillPara.m_dMargin = 0; //邊距
m_FillPara.m_dSOffset = 0; //開始偏移
m_FillPara.m_dEOffset = 0; //結(jié)束偏移
m_FillPara.m_dLineIndent = 0; //直線縮進
//文本參數(shù)
m_dTextHigh = 30; //文本高度
m_dTextWidth = 30; //文本寬度
m_dTextAngle = 0; //文本角度
m_dTextXpos = 0;
m_dTextYpos = 0;
m_TextString = _T("");
}
5.設(shè)置填充工藝參數(shù)
由輸入內(nèi)容生成二維碼,將我們的二維碼軌跡分成小線段軌跡生成三次文件,并且將填充工藝參數(shù)等設(shè)置進去。
通過指令 ZmotionLaser_SetOutput(int nAp,int nMO,int nRed)設(shè)置好出光口號,為標刻做好準備。
填充工藝: 主要是指令uint32 ZmotionLaser_SetFillParam(bool bEnable,bool bOutline,bool bOutlineFirst,bool bEdge,bool bAverage,int nType,int nAngle,int nNum,double dLineSpace,double dMargin,double dSOffset,double dEOffset,double dLineIndent,int nFillNum)的一些參數(shù),將參數(shù)通過變量的形式做到界面上。
bOutline 使能輪廓 :填充時是否保存原來的圖形輪廓。
bOutlineFirst輪廓優(yōu)先 :填充時保留輪廓的情況下,勾選輪廓優(yōu)先會使輪廓軌跡在填充線之前進行加工,否則輪廓軌跡在填充線之后進行加工(如想了解更多填充工藝,可聯(lián)系正運動技術(shù)支持工程師)。
填充類型 :圖形進行填充的方式
(1)單相填充:填充線總是從左向右填充;
(2)雙向填充:填充線先是從左向右,然后從右向左進行填充,其余循環(huán)填充;
(3)弓形填充:類似于雙向填充,但填充線末端之間會產(chǎn)生連接線;
(4)優(yōu)化弓形填充:類似于弓形填充,但對象空白的地方仍會跳過去填充。

程序如下:
void CZmc_laserDlg::OnEnChangeEditText()
{
UpdateData(TRUE);
//打開打標庫3次文件功能
int rtn = ZmotionLaser_OpenFile3(m_Handle);
if(CheckError(rtn,"ZmotionLaser_OpenFile3")) return;
rtn = ZmotionLaser_SetOutputLimits(55); //設(shè)置輸出口最大編號限制
if(CheckError(rtn,"ZmotionLaser_OpenFile3")) return;
rtn = ZmotionLaser_SetScanAxis(4,5); //設(shè)置振鏡軸號
if(CheckError(rtn,"ZmotionLaser_SetScanAxis")) return;
rtn = ZmotionLaser_SetOutput(m_nLaserIO,m_nEnableIO,m_nRedIO); //設(shè)置開光光控制
if(CheckError(rtn,"ZmotionLaser_SetOutput")) return;
rtn = ZmotionLaser_AoutInit(m_nAout,255); //設(shè)置模擬量功率設(shè)置
if(CheckError(rtn,"ZmotionLaser_AoutInit")) return;
rtn = ZmotionLaser_SetPowerEnable(false); //關(guān)閉動態(tài)修改功率
if(CheckError(rtn,"ZmotionLaser_SetPowerEnable")) return;
rtn = ZmotionLaser_SetLightInstruct(1);
if(CheckError(rtn,"ZmotionLaser_SetLightInstruct")) return;
rtn = ZmotionLaser_SetLightString("MOVE_OP(8,ON)\n","MOVE_OP(8,OFF)\n");
if(CheckError(rtn,"ZmotionLaser_SetLightInstruct")) return;
//設(shè)置加工工藝參數(shù)
int ipower = (int)(m_nAoutVal*100/256);
rtn = ZmotionLaser_SetVectPar(ipower, m_nPwmFreq, m_dSpeed, m_dEmpSpeed, m_nStartDelay, m_nLastDelay, m_nLastDelay, 10, m_nCorDelay,m_nLastDelay ,1);
if(CheckError(rtn,"ZmotionLaser_SetVectPar")) return;
//設(shè)置填充參數(shù)
rtn = ZmotionLaser_SetFillObject(m_FillPara,1);
if(CheckError(rtn,"ZmotionLaser_SetFillObject")) return;
//開始填充
rtn = ZmotionLaser_FillStart();
if(CheckError(rtn,"ZmotionLaser_FillStart")) return;
//加工文本字符
CString strBarCode;
m_ListBarCode.GetLBText(m_ListBarCode.GetCurSel(),strBarCode);
rtn = ZmotionLaser_BarCode(1,m_TextString,strBarCode,m_dTextXpos,m_dTextYpos,m_dTextHigh,m_dTextWidth,m_dTextAngle);
if(CheckError(rtn,"ZmotionLaser_BarCode")) return;
//結(jié)束填充
rtn = ZmotionLaser_FillEnd();
if(CheckError(rtn,"ZmotionLaser_FillEnd")) return;
char* MoveStr = NULL;
int nRow = 0;
MoveStr = ZmotionLaser_GetProcessString(false);
MoveStr = ZmotionLaser_GetProEndString(nRow);
OnShowGraph(); //顯示圖形
//生成加工三次文件
rtn = ZmotionLaser_CreateFile3(".//ZscanLaser.z3p",true);
if(CheckError(rtn,"ZmotionLaser_CreateFile3")) return;
rtn = ZmotionLaser_CloseFile3();
if(CheckError(rtn,"ZmotionLaser_CloseFile3")) return;
}
6.進行標刻
通過Zpj文件方式下載三次文件到控制器ROM,開啟一個未使用或者一個確認停止的任務號運行該文件。
程序如下:
void CZmc_laserDlg::OnBnClickedBtnMark()
{
if(NULL == m_Handle)
{
MessageBox(_T("控制器未連接"));
return;
}
//運行生成的3次文件
int rtn = ZAux_Down3FileRom(m_Handle,".//ZscanLaser.z3p","Text123.z3p");
if(CheckError(rtn,"ZAux_Down3FileRom")) return;
rtn = ZAux_Direct_StopTask(m_Handle,1);
if(CheckError(rtn,"ZAux_Direct_StopTask")) return;
rtn = ZAux_Run3FileRom(m_Handle,"Text123.z3p",1,0); //任務1運行3次文件
if(CheckError(rtn,"ZAux_Down3FileRom")) return;
}
7.完成打標
停止加工,主要是將任務停止,然后停止所有的軸運動,關(guān)掉激光。
程序如下:
void CZmc_laserDlg::OnBnClickedBtnStop()
{
int rtn = ZAux_Direct_StopTask(m_Handle,1);
if(CheckError(rtn,"ZAux_Direct_StopTask")) return;
rtn = ZAux_Direct_Rapidstop(m_Handle,3);
if(CheckError(rtn,"ZAux_Direct_Rapidstop")) return;
rtn = ZAux_Direct_SetOp(m_Handle,m_nLaserIO,0); //關(guān)光
Sleep(10);
rtn = ZAux_Direct_SetOp(m_Handle,m_nEnableIO,0);
SetDlgItemTextA(IDC_BTN_LASER,"激光(關(guān))");
}
8.二維碼打標界面

9.界面參數(shù)配置講解&打標效果展示
二、文本打標
1.文本打標參數(shù)設(shè)置界面

通過該例程我們可以實現(xiàn)產(chǎn)品包裝生產(chǎn)日期、金屬元件、硬質(zhì)塑料產(chǎn)品上的標注打標,還能在金屬物品上進行紀念語等的打標,多種字體樣式可選擇。
操作流程和二維碼打標類似,連接控制器,選擇對應激光器類型,填寫運動參數(shù)、填充工藝以及標刻文本信息等(可根據(jù)實際打標測試結(jié)果進行調(diào)整)。
程序構(gòu)建類似,唯一不同在于標刻處程序?qū)懛ㄉ嫌胁町悾S碼打標是將軌跡生成與標刻運行分開寫,而文本打標是將參數(shù)設(shè)置好、文本內(nèi)容確定后,點擊打標才開始生成三次文件,后開啟任務運行文件。
程序如下:
//標刻
void CZmc_laserDlg::OnBnClickedBtnMark()
{
if(NULL == m_Handle)
{
MessageBox(_T("控制器未連接"));
return;
}
UpdateData(TRUE);
//打開打標庫3次文件功能
int rtn = ZmotionLaser_OpenFile3();
if(CheckError(rtn,"ZmotionLaser_OpenFile3")) return;
rtn = ZmotionLaser_SetOutputLimits(55); //設(shè)置輸出口最大編號限制
if(CheckError(rtn,"ZmotionLaser_OpenFile3")) return;
rtn = ZmotionLaser_SetScanAxis(4,5); //設(shè)置振鏡軸號
if(CheckError(rtn,"ZmotionLaser_SetScanAxis")) return;
rtn = ZmotionLaser_SetOutput(m_nLaserIO,m_nEnableIO,m_nRedIO);//設(shè)置開光控制
if(CheckError(rtn,"ZmotionLaser_SetOutput")) return;
rtn = ZmotionLaser_AoutInit(m_nAout,255); //設(shè)置模擬量功率設(shè)置
if(CheckError(rtn,"ZmotionLaser_AoutInit")) return;
rtn = ZmotionLaser_SetPowerEnable(false); //關(guān)閉動態(tài)修改功率
if(CheckError(rtn,"ZmotionLaser_SetPowerEnable")) return;
rtn = ZmotionLaser_SetLightInstruct(1);
if(CheckError(rtn,"ZmotionLaser_SetLightInstruct")) return;
rtn = ZmotionLaser_SetLightString("MOVE_OP(8,ON)\n","MOVE_OP(8,OFF)\n");
if(CheckError(rtn,"ZmotionLaser_SetLightInstruct")) return;
//設(shè)置加工工藝參數(shù)
int ipower = (int)(m_nAoutVal*100/256);
rtn = ZmotionLaser_SetVectPar(ipower, m_nPwmFreq, m_dSpeed, m_dEmpSpeed, m_nStartDelay, m_nLastDelay, m_nLastDelay, 10, m_nCorDelay,m_nLastDelay ,1);
if(CheckError(rtn,"ZmotionLaser_SetVectPar")) return;
//設(shè)置填充參數(shù)
rtn = ZmotionLaser_SetFillObject(m_FillPara,1);
if(CheckError(rtn,"ZmotionLaser_SetFillObject")) return;
//設(shè)置文本字體參數(shù)
CString strFont;
m_ListFont.GetLBText(m_ListFont.GetCurSel(),strFont);
rtn = ZmotionLaser_SetTextStyle(strFont,m_FontThickness,m_FontItalics,m_FontUnderline,m_FontDelete,m_dTextHigh,m_dTextWidth,m_dTextAngle,m_dTextTilt);
if(CheckError(rtn,"ZmotionLaser_SetTextStyle")) return;
//開始填充
rtn = ZmotionLaser_FillStart();
if(CheckError(rtn,"ZmotionLaser_FillStart")) return;
//加工文本字符
rtn = ZmotionLaser_Text(1,m_TextString,m_dTextXpos,m_dTextYpos,m_dTextAccuracy);
if(CheckError(rtn,"ZmotionLaser_Text")) return;
//結(jié)束填充
rtn = ZmotionLaser_FillEnd();
if(CheckError(rtn,"ZmotionLaser_FillEnd")) return;
char* MoveStr = NULL;
int nRow = 0;
MoveStr = ZmotionLaser_GetProcessString(false);
MoveStr = ZmotionLaser_GetProEndString(nRow);
//生成加工三次文件
rtn = ZmotionLaser_CreateFile3(".//ZscanLaser.z3p",true);
if(CheckError(rtn,"ZmotionLaser_CreateFile3")) return;
rtn = ZmotionLaser_CloseFile3();
if(CheckError(rtn,"ZmotionLaser_CloseFile3")) return;
//運行生成的3次文件
rtn = ZAux_Down3FileRom(m_Handle,".//ZscanLaser.z3p","Text123.z3p");
if(CheckError(rtn,"ZAux_Down3FileRom")) return;
rtn = ZAux_Direct_StopTask(m_Handle,1);
if(CheckError(rtn,"ZAux_Direct_StopTask")) return;
rtn = ZAux_Run3FileRom(m_Handle,"Text123.z3p",1,0); //任務運行3次文件
if(CheckError(rtn,"ZAux_Down3FileRom")) return;
}
2.界面參數(shù)配置講解&打標效果展示
三、矢量圖形打標
1.矢量圖形打標參數(shù)設(shè)置界面

通過該例程我們可以實現(xiàn)一些圖案的打標,如產(chǎn)品LONG打印、圖案打印、金屬牌上打印圖案做項鏈等。
操作流程和前面兩個例程類似,唯一不同的是這里矢量圖形標刻,我們要選擇保存好的矢量圖形,設(shè)置完大小、位置、旋轉(zhuǎn)角度后進行標刻。
我們添加進來圖形可以在右下部分區(qū)域看見圖形(二維碼例程一樣有顯示圖形)。如下圖紅色框內(nèi)顯示。
2.矢量圖形打標界面

程序如下:
//顯示圖形
void CZmc_laserDlg::OnShowGraph()
{
CDC*dc = GetDlgItem(IDC_PIC_SHOW)->GetDC();
CRect rectClient;
GetDlgItem(IDC_PIC_SHOW)->GetClientRect(rectClient);
CBrush brush(RGB(255, 255, 255));
dc->FillRect(&rectClient, &brush);
//畫一個外框
int iwidth = rectClient.Width();
int iheight = rectClient.Height();
dc->MoveTo(0,0);
dc->LineTo(iwidth-1,0);
dc->LineTo(iwidth-1,iheight-1);
dc->LineTo(0,iheight-1);
dc->LineTo(0,0);
int rtn=0;
rtn = ZMotionCad3_DeleteChain((Struct_ZCad_Item *) m_pGraph->m_pVectorData);
rtn = ZMotionCad3_DeleteChain((Struct_ZCad_Item *) m_pGraph->m_pImageData);
m_pGraph->m_pImageData = NULL;
m_pGraph->m_pVectorData = ZMotionCad3_ImportVectGraph(m_FileName, 1016,1,0.001); //導入圖形生成軌跡
if (m_pGraph)
{
uint32 uiresult;
//元素尺寸
float left, bottom, width, height;
uiresult = ZMotionCad3_GetRange((Struct_ZCad_Item *)m_pGraph, &left, &bottom, &width, &height);
float top;
//轉(zhuǎn)成顯示坐標
top = -(bottom + height);
//顯示的區(qū)域
double WinWidth = rectClient.Width() - 8;
double WinHeight = rectClient.Height() - 8;
// 實際的區(qū)域
double ObjectWidth = width;
double ObjectHeight = height;
double ObjectPixWidth, ObjectPixHeight;
if (ObjectWidth*WinHeight <= WinWidth*ObjectHeight)
{
ObjectPixHeight = WinHeight;
ObjectPixWidth = ObjectPixHeight *ObjectWidth/ObjectHeight;
}
else
{
ObjectPixWidth = WinWidth;
ObjectPixHeight = ObjectPixWidth *ObjectHeight/ObjectWidth;
}
double dUnitsPerMm = ObjectPixHeight/ObjectHeight; //每MM的顯示點數(shù)
CPoint ZeroPoint;
ZeroPoint.x = (rectClient.Width()-ObjectPixWidth)/2 ;
ZeroPoint.y = (rectClient.Height()-ObjectPixHeight)/2 ;
dc->SetViewportOrg(ZeroPoint.x-left*dUnitsPerMm, ZeroPoint.y-top*dUnitsPerMm);
ZMotionCad3_Draw(dc->m_hDC, (Struct_ZCad_Item *) m_pGraph, 0, 1.0f/dUnitsPerMm); //繪圖
}
}
3.界面參數(shù)配置講解&打標效果展示
本次,正運動技術(shù)開放式激光振鏡運動控制器:C++快速調(diào)用圖形庫應用,就分享到這里。
更多精彩內(nèi)容請關(guān)注“ 正運動小助手 ”公眾號,需要相關(guān)開發(fā)環(huán)境與例程代碼,請咨詢正運動技術(shù)銷售工程師:400-089-8936。
本文由正運動技術(shù)原創(chuàng),歡迎大家轉(zhuǎn)載,共同學習,一起提高中國智能制造水平。文章版權(quán)歸正運動技術(shù)所有,如有轉(zhuǎn)載請注明文章來源。
正運動技術(shù)專注于運動控制技術(shù)研究和通用運動控制軟硬件產(chǎn)品的研發(fā),是國家級高新技術(shù)企業(yè)。正運動技術(shù)匯集了來自華為、中興等公司的優(yōu)秀人才,在堅持自主創(chuàng)新的同時,積極聯(lián)合各大高校協(xié)同運動控制基礎(chǔ)技術(shù)的研究,是國內(nèi)工控領(lǐng)域發(fā)展最快的企業(yè)之一,也是國內(nèi)少有、完整掌握運動控制核心技術(shù)和實時工控軟件平臺技術(shù)的企業(yè)。主要業(yè)務有:運動控制卡_運動控制器_EtherCAT運動控制卡_EtherCAT控制器_運動控制系統(tǒng)_視覺控制器__運動控制PLC_運動控制_機器人控制器_視覺定位等等。
|