技術頻道

娓娓工業(yè)
您現(xiàn)在的位置: 中國傳動網(wǎng) > 技術頻道 > 技術百科 > 開放式激光振鏡運動控制器:C++快速開發(fā)

開放式激光振鏡運動控制器:C++快速開發(fā)

時間:2022-10-18 10:05:34來源:深圳市正運動技術有限公司

導語:?今天,正運動技術為大家分享一下應用ZMC408SCAN開放式激光振鏡運動控制器的C++開發(fā),實現(xiàn)激光振鏡打標,可在文章末尾掃碼獲取例程源碼。

  今天,正運動技術為大家分享一下應用ZMC408SCAN開放式激光振鏡運動控制器的C++開發(fā),實現(xiàn)激光振鏡打標,可在文章末尾掃碼獲取例程源碼。

  除了C++還支持使用其他上位機軟件來開發(fā),上位機程序運行時需要動態(tài)庫“zmotion.dll”,上位機開發(fā)調試時可以把ZDevelop軟件同時連接到控制器輔助調試。

  01、ZMC408SCAN控制器介紹

  ZMC408SCAN是正運動技術新推出的一款支持EtherCAT總線的開放式激光振鏡運動控制器,專為工業(yè)激光+振鏡+運動控制方面的應用而設計。通過EtherCAT總線和脈沖軸接口能實現(xiàn)多軸聯(lián)動運動控制。

  ZMC408SCAN支持ETHERNET、EtherCAT、USB、CAN、RS485、RS232等通訊接口,通過CAN、EtherCAT總線可以連接各個擴展模塊,從而擴展數(shù)字量、模擬量或運動軸。

電源,還帶一個EXIO擴展IO接口,通過定制轉接板,靈活控制市場上主流的各種激光器;   (5)支持PC同時控制16個ZMC408SCAN控制器同時工作,形成一種振鏡陣列的激光加工;   (6)板載4路高速差分脈沖輸出,并帶4路高速差分編碼器反饋,支持EtherCAT總線驅動器的控制,支持5軸XYZAC軸的插補,支持振鏡軸與運動軸混合插補。   (7)支持直線插補、任意圓弧插補、空間圓弧、螺旋插補、電子凸輪、電子齒輪、同步跟隨、虛擬軸設置等多種運動控制功能。   02系統(tǒng)架構   下圖為ZMC408SCAN開放式激光控制器的參考架構,支持多種不同類型的激光器控制。   03上位機和控制器通訊   上位機和控制器通訊調用正運動封裝好的函數(shù)庫,提供運動控制和激光控制等眾多函數(shù)庫接口,激光振鏡的系統(tǒng)架構參見下圖。   本例采用EtherNET網(wǎng)口連接控制器,通過函數(shù)ZAux_OpenEth()建立通訊連接,用戶可在設置好的界面中選擇當前網(wǎng)段下的控制器IP完成連接,控制器出廠IP地址192.168.0.11,參見下圖。   04激光控制   一、指令介紹   下面是我們程序中用到的接口函數(shù),主要包含激光控制和激光振鏡控制兩部分,程序的實現(xiàn)可直接使用封裝好的接口函數(shù)發(fā)送命令給控制器。   本例采用FIBER激光器和2D激光振鏡,用到下面的函數(shù)接口:   § ZAux_Direct_MoveScanAbs:振鏡軸多軸絕對直線插補SCAN運動,不帶加減速過程,我們這里用來控制振鏡軸運動,通過小線段的形式擬合圓形軌跡;   § ZAux_Direct_MoveOpDelay:緩沖輸出延時,提前開光時將延時時間設置為負數(shù);   § ZAux_Direct_MoveDelay:緩沖輸出延時,我們這里用來延時關光。   激光功率設置:提供模擬量ZAux_Direct_SetDA、PWM的占空比ZAux_Direct_SetPwmDuty和頻率ZAux_Direct_SetPwmFreq等方式控制設置振鏡軸拐角處自動延時:   ZAux_Direct_SetCornerMode   1.振鏡軸直線插補   ZAux_Direct_MoveScanAbs絕對運動,ZAux_Direct_MoveScan相對運動。   2.設置開關光   輸出狀態(tài)為0關光,輸出狀態(tài)為1開光。   3.開關光延時   4.提前/延時開關光   正數(shù)時間延時,負數(shù)時間提前開關光。   5.設置激光能量(功率)   通過改變模擬量輸出的電壓值來控制激光能量大小。   6.PWM占空比   通過設置PWM的占空比來調整激光頻率,在開始打軌跡之前一定要先設置好。   7.PWM頻率   8.振鏡軸拐角延時   9.拐角延時起始角度   10.拐角延時結束角度   二、程序流程   先建立控制器通訊,獲取連接句柄,激光器選擇及參數(shù)設置,然后編輯紅光與激光口控制開關,運動參數(shù)設置,軌跡參數(shù)進行小線段處理,開始運動,停止運動。   三、主要程序展示   初始化定義相關變量,初始化軸參數(shù),配置好FIBER轉接板的方向為輸出,后續(xù)的激光軌跡加工控制由按鈕觸發(fā)。   在運動之前我們要設置好空移速度、打標速度、開關光延時、軌跡圓半徑、標刻行列數(shù)、圓心距等參數(shù)。運動開始直接調用這些相關參數(shù)執(zhí)行,獲取完軌跡后調用3次文件執(zhí)行。   1.初始化408FIBER轉換板針腳定義,不同激光器類型定義一套不同的輸出口,輸出口可以在選擇激光器類型后對應在界面上進行修改。   408 FIBER轉換板參數(shù)初始化程序:   ·   void CZmc_fontToMoveDlg::OnCbnSelchangeComboLaser(){ // TODO: 在此添加控件通知處理程序代碼 UpdateData(TRUE); if(m_nLaserType == FIBER_408) //408 FIBER轉換板參數(shù)設置 { char cmdbuffAck[2048] = ""; int iresult = ZAux_Execute(m_Handle,"EXIO_DIR(0, $8FFFF)",cmdbuffAck,2048); m_nEnableIO = 47; //使能io m_nLaserIO = 8; //出關io m_nRedIO = 48; //紅光io m_nAout = 3; //功率io m_nPwmIo = 9; //頻率io } else if(m_nLaserType == YLR_408) { m_nEnableIO = 31; //使能io m_nLaserIO = 8; //出關io m_nRedIO = 32; //紅光io m_nAout = 2; //功率io m_nPwmIo = 9; //頻率io } else if(m_nLaserType == YAG_408) //408 YAG轉換板參數(shù)設置 { char cmdbuffAck[2048] = ""; int iresult = ZAux_Execute(m_Handle,"EXIO_DIR(0, $AFBBF)",cmdbuffAck,2048); m_nEnableIO = 47; //使能io m_nLaserIO = 8; //出關io m_nRedIO = 48; //紅光io m_nAout = 3; //功率io m_nPwmIo = 9; //頻率io } else if(m_nLaserType == FIBER_504) //504 { m_nEnableIO = 5; //使能io m_nLaserIO = 6; //出關io m_nRedIO = 28; //紅光io m_nAout = 2; //功率io m_nPwmIo = 7; //頻率io } UpdateData(FALSE);}   2.設置拐角延時與激光功率,再調用運動執(zhí)行,程序如下。   ·   void CZmc_fontToMoveDlg::OnBnClickedBtnMove(){ // TODO: 在此添加控件通知處理程序代碼 UpdateData(TRUE); //設置拐角減速此ZSMOOTH為拐角延時 int iresult = ZAux_Direct_SetCornerMode(m_Handle,SCAN_AxisX,2); //設置精準輸出 iresult = ZAux_Direct_SetParam(m_Handle,"AXIS_ZSET",SCAN_AxisX,3); //設置拐角延時 iresult = ZAux_Direct_SetZsmooth(m_Handle,SCAN_AxisX,m_nCorDelay); //設置拐角起始角度,減速時間在DecelAngle-StopAngle線性變化 iresult = ZAux_Direct_SetDecelAngle(m_Handle,SCAN_AxisX,0); //設置拐角結束角度 iresult = ZAux_Direct_SetStopAngle(m_Handle,SCAN_AxisX,90/180*3.1415926); //設置激光功率 iresult = ZAux_Direct_SetDA(m_Handle,m_nAout,m_nAoutVal); //設置激光頻率 iresult = ZAux_Direct_SetPwmDuty(m_Handle,m_nPwmIo,0.5); iresult = ZAux_Direct_SetPwmFreq(m_Handle,m_nPwmIo,m_nPwmFreq); //獲取軌跡數(shù)據(jù),(0,0)為圓外接起點,5*5間距畫半徑為5的小圓 Cal_WorkData(m_fStartX, m_fStartY, m_nStepDis, m_nColNum, m_nRowNum, m_fRadius); Run_3FileMode();}   3.圓弧轉小線段是將我們的設置的圓弧軌跡轉換為小線段存起來,然后轉換后由3次文件的形式加載執(zhí)行。   圓弧轉小線段程序如下:   ·   void CZmc_fontToMoveDlg::Cal_WorkData(float fStartX, float fStartY, float iStepDis, int iColNum, int iRowNum, float fRadius){ //圓弧轉小線段 int ilen = -1; double ArcX; double ArcY; //獲取單個整圓轉換長度 int iret = ZMotionOptimize_TransArcSeges(m_Handle,fStartX - fRadius, fStartY, fStartX + fRadius, fStartY + 2 * fRadius, 0, -2 * PI, m_refDistance, &ArcX, &ArcY, &ilen); if (iret != 0 || ilen < 0) { CString StrErr; StrErr.Format("圓弧轉小線段失敗錯誤碼:%d",iret); MessageBox(StrErr); return; } double *ArcToLineX; double *ArcToLineY; ArcToLineX = (double*)malloc(sizeof(double)*ilen); ArcToLineY = (double*)malloc(sizeof(double)*ilen); //獲取數(shù)據(jù) iret = ZMotionOptimize_TransArcSeges(m_Handle, fStartX - fRadius, fStartY, fStartX + fRadius, fStartY + 2 * fRadius, 0, -2 * PI, m_refDistance, ArcToLineX, ArcToLineY, &ilen); //軌跡總長度 m_GraphTotalLen = ilen * iColNum * iRowNum; m_GraphData = (struct_GraphPos*)malloc(sizeof(struct_GraphPos)*m_GraphTotalLen); //申請分配內存 //填寫數(shù)據(jù) int iAcr = 0; for (int icol = 0; icol < iColNum ; icol++) { for(int irow = 0 ;irow   4.這里程序完成空移,然后移動完成之前,如果下一條運動指令執(zhí)行的是軌跡運動,那么提前將激光打開。   ·   //空移到打標點起始點void CZmc_fontToMoveDlg::Zscan_Z3pFile_StartString(struct_GraphPos *iGraphData){ char cmdbuff[2048] = ""; char tempbuff[2048] = ""; //生成命令 sprintf(tempbuff, "BASE(%d,%d)\n",SCAN_AxisX,SCAN_AxisY); //設置打標軸 strcat(cmdbuff, tempbuff); //空移到起點 sprintf(tempbuff, "FORCE_SPEED = %f\n",m_dEmpSpeed); //設置空移速度 strcat(cmdbuff, tempbuff); sprintf(tempbuff, "MOVESCANABS(%f,%f)\n",(*iGraphData).fposx,(*iGraphData).fposy); //移動 strcat(cmdbuff, tempbuff); //設置提前開光 if (m_nStartDelay < 0) //提前出光 { sprintf(tempbuff, "MOVEOP_DELAY = %f\n",m_nStartDelay/1000); strcat(cmdbuff, tempbuff); } else { sprintf(tempbuff, "MOVE_DELAY(%f)\n",m_nStartDelay/1000); strcat(cmdbuff, tempbuff); } //開光 sprintf(tempbuff, "MOVE_OP(%d,1)\nMOVE_DELAY(10)\nMOVE_OP(%d,1)\n",m_nEnableIO,m_nLaserIO); strcat(cmdbuff, tempbuff); //判斷命令長度是否發(fā)送 strcat(g_MoveStr,cmdbuff); Zscan_Z3pFile_Down();}   //生成打標直線段字符串void CZmc_fontToMoveDlg::Zscan_Z3pFile_LineString(struct_GraphPos *iGraphData){ char cmdbuff[2048] = ""; char tempbuff[2048] = ""; //生成命令 //空移到起點 sprintf(tempbuff, "FORCE_SPEED = %f\n",m_dSpeed); //設置打標速度 strcat(cmdbuff, tempbuff); sprintf(tempbuff, "MOVESCANABS(%f,%f)\n",(*iGraphData).fposx,(*iGraphData).fposy); //移動 strcat(cmdbuff, tempbuff); //判斷命令長度是否發(fā)送 strcat(g_MoveStr,cmdbuff); Zscan_Z3pFile_Down();}   5.延時關光是在打標軌跡完成后,將激光延時關閉。   延時關光程序如下:   ·   void CZmc_fontToMoveDlg::Zscan_Z3pFile_EndString(struct_GraphPos *iGraphData){ char cmdbuff[2048] = ""; char tempbuff[2048] = ""; //生成命令 sprintf(tempbuff, "FORCE_SPEED = %f\n",m_dEmpSpeed); //設置空移速度 strcat(cmdbuff, tempbuff); sprintf(tempbuff, "MOVESCANABS(%f,%f)\n",(*iGraphData).fposx,(*iGraphData).fposy); //移動 strcat(cmdbuff, tempbuff); //延時關光 if(m_nLastDelay >0) { //延時關光 sprintf(tempbuff, "MOVEOP_DELAY = 0\nMOVE_DELAY(%f)\n",m_nLastDelay/1000); strcat(cmdbuff, tempbuff); } else { sprintf(tempbuff, "MOVEOP_DELAY = %f\n",m_nLastDelay/1000); strcat(cmdbuff, tempbuff); } //關光 sprintf(tempbuff, "MOVE_OP(%d,OFF)\n",m_nLaserIO); strcat(cmdbuff, tempbuff); //判斷命令長度是否發(fā)送 strcat(g_MoveStr,cmdbuff); Zscan_Z3pFile_Down();}   四、最終效果   首先點擊下拉框選擇控制器IP,點擊連接,依次設置好激光器參數(shù)、運動參數(shù),設置好后輸入打軌跡的參數(shù),點擊運動開始打圓形軌跡,點擊停止結束。   通過Zdevelop軟件的示波器采樣運動結果:先從其他位置空移到起始位置,然后提前1ms開光,走完一個圓形軌跡,關閉激光(延時關光),再空移到下一個圓形軌跡的起點,開光(提前1ms開光),又走完一個軌跡后,關光(延時5ms關光),如此循環(huán)執(zhí)行,直到設置的行列數(shù)打完停止(打軌跡中也能點擊停止)。   XY模式下的軌跡,軌跡包括了圓形打標軌跡和空走軌跡:   本次,正運動技術開放式激光振鏡運動控制器:C++快速開發(fā) ,就分享到這里。   更多精彩內容請關注“正運動小助手”公眾號,需要相關開發(fā)環(huán)境與例程代碼,請咨詢正運動技術銷售工程師:400-089-8936。   本文由正運動技術原創(chuàng),歡迎大家轉載,共同學習,一起提高中國智能制造水平。文章版權歸正運動技術所有,如有轉載請注明文章來源。" style="margin: 0px auto; width: 600px;" alt="  今天,正運動技術為大家分享一下應用ZMC408SCAN開放式激光振鏡運動控制器的C++開發(fā),實現(xiàn)激光振鏡打標,可在文章末尾掃碼獲取例程源碼。   除了C++還支持使用其他上位機軟件來開發(fā),上位機程序運行時需要動態(tài)庫“zmotion.dll”,上位機開發(fā)調試時可以把ZDevelop軟件同時連接到控制器輔助調試。   01ZMC408SCAN控制器介紹   ZMC408SCAN是正運動技術新推出的一款支持EtherCAT總線的開放式激光振鏡運動控制器,專為工業(yè)激光+振鏡+運動控制方面的應用而設計。通過EtherCAT總線和脈沖軸接口能實現(xiàn)多軸聯(lián)動運動控制。   ZMC408SCAN支持ETHERNET、EtherCAT、USB、CAN、RS485、RS232等通訊接口,通過CAN、EtherCAT總線可以連接各個擴展模塊,從而擴展數(shù)字量、模擬量或運動軸。   (1)ZMC408SCAN內置高精度PSO位置同步輸出功能,在加工圓角、曲線部分時即使進行了減速調整,在高速加工的場合,也能控制激光輸出的間距保持恒定;   (2)支持激光振鏡控制和振鏡反饋,包含2個振鏡接口,支持2D振鏡和3D振鏡,配合不帶加減速的運動指令MOVESCAN,拐角處振鏡加工自動延時,完成精準高效的激光控制,提高激光加工設備的產(chǎn)能;   (3)通過指令在運動中靈活的調節(jié)激光開光/關光延時,響應快,精確到us級別的控制,且設置過程簡單,大大縮短了工程師的調參時間;   (4)自帶LASER激光器控制接口,支持IPG、YLR、YLS等類型激光電源,還帶一個EXIO擴展IO接口,通過定制轉接板,靈活控制市場上主流的各種激光器;   (5)支持PC同時控制16個ZMC408SCAN控制器同時工作,形成一種振鏡陣列的激光加工;   (6)板載4路高速差分脈沖輸出,并帶4路高速差分編碼器反饋,支持EtherCAT總線驅動器的控制,支持5軸XYZAC軸的插補,支持振鏡軸與運動軸混合插補。   (7)支持直線插補、任意圓弧插補、空間圓弧、螺旋插補、電子凸輪、電子齒輪、同步跟隨、虛擬軸設置等多種運動控制功能。   02系統(tǒng)架構   下圖為ZMC408SCAN開放式激光控制器的參考架構,支持多種不同類型的激光器控制。   03上位機和控制器通訊   上位機和控制器通訊調用正運動封裝好的函數(shù)庫,提供運動控制和激光控制等眾多函數(shù)庫接口,激光振鏡的系統(tǒng)架構參見下圖。   本例采用EtherNET網(wǎng)口連接控制器,通過函數(shù)ZAux_OpenEth()建立通訊連接,用戶可在設置好的界面中選擇當前網(wǎng)段下的控制器IP完成連接,控制器出廠IP地址192.168.0.11,參見下圖。   04激光控制   一、指令介紹   下面是我們程序中用到的接口函數(shù),主要包含激光控制和激光振鏡控制兩部分,程序的實現(xiàn)可直接使用封裝好的接口函數(shù)發(fā)送命令給控制器。   本例采用FIBER激光器和2D激光振鏡,用到下面的函數(shù)接口:   § ZAux_Direct_MoveScanAbs:振鏡軸多軸絕對直線插補SCAN運動,不帶加減速過程,我們這里用來控制振鏡軸運動,通過小線段的形式擬合圓形軌跡;   § ZAux_Direct_MoveOpDelay:緩沖輸出延時,提前開光時將延時時間設置為負數(shù);   § ZAux_Direct_MoveDelay:緩沖輸出延時,我們這里用來延時關光。   激光功率設置:提供模擬量ZAux_Direct_SetDA、PWM的占空比ZAux_Direct_SetPwmDuty和頻率ZAux_Direct_SetPwmFreq等方式控制設置振鏡軸拐角處自動延時:   ZAux_Direct_SetCornerMode   1.振鏡軸直線插補   ZAux_Direct_MoveScanAbs絕對運動,ZAux_Direct_MoveScan相對運動。   2.設置開關光   輸出狀態(tài)為0關光,輸出狀態(tài)為1開光。   3.開關光延時   4.提前/延時開關光   正數(shù)時間延時,負數(shù)時間提前開關光。   5.設置激光能量(功率)   通過改變模擬量輸出的電壓值來控制激光能量大小。   6.PWM占空比   通過設置PWM的占空比來調整激光頻率,在開始打軌跡之前一定要先設置好。   7.PWM頻率   8.振鏡軸拐角延時   9.拐角延時起始角度   10.拐角延時結束角度   二、程序流程   先建立控制器通訊,獲取連接句柄,激光器選擇及參數(shù)設置,然后編輯紅光與激光口控制開關,運動參數(shù)設置,軌跡參數(shù)進行小線段處理,開始運動,停止運動。   三、主要程序展示   初始化定義相關變量,初始化軸參數(shù),配置好FIBER轉接板的方向為輸出,后續(xù)的激光軌跡加工控制由按鈕觸發(fā)。   在運動之前我們要設置好空移速度、打標速度、開關光延時、軌跡圓半徑、標刻行列數(shù)、圓心距等參數(shù)。運動開始直接調用這些相關參數(shù)執(zhí)行,獲取完軌跡后調用3次文件執(zhí)行。   1.初始化408FIBER轉換板針腳定義,不同激光器類型定義一套不同的輸出口,輸出口可以在選擇激光器類型后對應在界面上進行修改。   408 FIBER轉換板參數(shù)初始化程序:   ·   void CZmc_fontToMoveDlg::OnCbnSelchangeComboLaser(){ // TODO: 在此添加控件通知處理程序代碼 UpdateData(TRUE); if(m_nLaserType == FIBER_408) //408 FIBER轉換板參數(shù)設置 { char cmdbuffAck[2048] = ""; int iresult = ZAux_Execute(m_Handle,"EXIO_DIR(0, $8FFFF)",cmdbuffAck,2048); m_nEnableIO = 47; //使能io m_nLaserIO = 8; //出關io m_nRedIO = 48; //紅光io m_nAout = 3; //功率io m_nPwmIo = 9; //頻率io } else if(m_nLaserType == YLR_408) { m_nEnableIO = 31; //使能io m_nLaserIO = 8; //出關io m_nRedIO = 32; //紅光io m_nAout = 2; //功率io m_nPwmIo = 9; //頻率io } else if(m_nLaserType == YAG_408) //408 YAG轉換板參數(shù)設置 { char cmdbuffAck[2048] = ""; int iresult = ZAux_Execute(m_Handle,"EXIO_DIR(0, $AFBBF)",cmdbuffAck,2048); m_nEnableIO = 47; //使能io m_nLaserIO = 8; //出關io m_nRedIO = 48; //紅光io m_nAout = 3; //功率io m_nPwmIo = 9; //頻率io } else if(m_nLaserType == FIBER_504) //504 { m_nEnableIO = 5; //使能io m_nLaserIO = 6; //出關io m_nRedIO = 28; //紅光io m_nAout = 2; //功率io m_nPwmIo = 7; //頻率io } UpdateData(FALSE);}   2.設置拐角延時與激光功率,再調用運動執(zhí)行,程序如下。   ·   void CZmc_fontToMoveDlg::OnBnClickedBtnMove(){ // TODO: 在此添加控件通知處理程序代碼 UpdateData(TRUE); //設置拐角減速此ZSMOOTH為拐角延時 int iresult = ZAux_Direct_SetCornerMode(m_Handle,SCAN_AxisX,2); //設置精準輸出 iresult = ZAux_Direct_SetParam(m_Handle,"AXIS_ZSET",SCAN_AxisX,3); //設置拐角延時 iresult = ZAux_Direct_SetZsmooth(m_Handle,SCAN_AxisX,m_nCorDelay); //設置拐角起始角度,減速時間在DecelAngle-StopAngle線性變化 iresult = ZAux_Direct_SetDecelAngle(m_Handle,SCAN_AxisX,0); //設置拐角結束角度 iresult = ZAux_Direct_SetStopAngle(m_Handle,SCAN_AxisX,90/180*3.1415926); //設置激光功率 iresult = ZAux_Direct_SetDA(m_Handle,m_nAout,m_nAoutVal); //設置激光頻率 iresult = ZAux_Direct_SetPwmDuty(m_Handle,m_nPwmIo,0.5); iresult = ZAux_Direct_SetPwmFreq(m_Handle,m_nPwmIo,m_nPwmFreq); //獲取軌跡數(shù)據(jù),(0,0)為圓外接起點,5*5間距畫半徑為5的小圓 Cal_WorkData(m_fStartX, m_fStartY, m_nStepDis, m_nColNum, m_nRowNum, m_fRadius); Run_3FileMode();}   3.圓弧轉小線段是將我們的設置的圓弧軌跡轉換為小線段存起來,然后轉換后由3次文件的形式加載執(zhí)行。   圓弧轉小線段程序如下:   ·   void CZmc_fontToMoveDlg::Cal_WorkData(float fStartX, float fStartY, float iStepDis, int iColNum, int iRowNum, float fRadius){ //圓弧轉小線段 int ilen = -1; double ArcX; double ArcY; //獲取單個整圓轉換長度 int iret = ZMotionOptimize_TransArcSeges(m_Handle,fStartX - fRadius, fStartY, fStartX + fRadius, fStartY + 2 * fRadius, 0, -2 * PI, m_refDistance, &ArcX, &ArcY, &ilen); if (iret != 0 || ilen < 0) { CString StrErr; StrErr.Format("圓弧轉小線段失敗錯誤碼:%d",iret); MessageBox(StrErr); return; } double *ArcToLineX; double *ArcToLineY; ArcToLineX = (double*)malloc(sizeof(double)*ilen); ArcToLineY = (double*)malloc(sizeof(double)*ilen); //獲取數(shù)據(jù) iret = ZMotionOptimize_TransArcSeges(m_Handle, fStartX - fRadius, fStartY, fStartX + fRadius, fStartY + 2 * fRadius, 0, -2 * PI, m_refDistance, ArcToLineX, ArcToLineY, &ilen); //軌跡總長度 m_GraphTotalLen = ilen * iColNum * iRowNum; m_GraphData = (struct_GraphPos*)malloc(sizeof(struct_GraphPos)*m_GraphTotalLen); //申請分配內存 //填寫數(shù)據(jù) int iAcr = 0; for (int icol = 0; icol < iColNum ; icol++) { for(int irow = 0 ;irow   4.這里程序完成空移,然后移動完成之前,如果下一條運動指令執(zhí)行的是軌跡運動,那么提前將激光打開。   ·   //空移到打標點起始點void CZmc_fontToMoveDlg::Zscan_Z3pFile_StartString(struct_GraphPos *iGraphData){ char cmdbuff[2048] = ""; char tempbuff[2048] = ""; //生成命令 sprintf(tempbuff, "BASE(%d,%d)\n",SCAN_AxisX,SCAN_AxisY); //設置打標軸 strcat(cmdbuff, tempbuff); //空移到起點 sprintf(tempbuff, "FORCE_SPEED = %f\n",m_dEmpSpeed); //設置空移速度 strcat(cmdbuff, tempbuff); sprintf(tempbuff, "MOVESCANABS(%f,%f)\n",(*iGraphData).fposx,(*iGraphData).fposy); //移動 strcat(cmdbuff, tempbuff); //設置提前開光 if (m_nStartDelay < 0) //提前出光 { sprintf(tempbuff, "MOVEOP_DELAY = %f\n",m_nStartDelay/1000); strcat(cmdbuff, tempbuff); } else { sprintf(tempbuff, "MOVE_DELAY(%f)\n",m_nStartDelay/1000); strcat(cmdbuff, tempbuff); } //開光 sprintf(tempbuff, "MOVE_OP(%d,1)\nMOVE_DELAY(10)\nMOVE_OP(%d,1)\n",m_nEnableIO,m_nLaserIO); strcat(cmdbuff, tempbuff); //判斷命令長度是否發(fā)送 strcat(g_MoveStr,cmdbuff); Zscan_Z3pFile_Down();}   //生成打標直線段字符串void CZmc_fontToMoveDlg::Zscan_Z3pFile_LineString(struct_GraphPos *iGraphData){ char cmdbuff[2048] = ""; char tempbuff[2048] = ""; //生成命令 //空移到起點 sprintf(tempbuff, "FORCE_SPEED = %f\n",m_dSpeed); //設置打標速度 strcat(cmdbuff, tempbuff); sprintf(tempbuff, "MOVESCANABS(%f,%f)\n",(*iGraphData).fposx,(*iGraphData).fposy); //移動 strcat(cmdbuff, tempbuff); //判斷命令長度是否發(fā)送 strcat(g_MoveStr,cmdbuff); Zscan_Z3pFile_Down();}   5.延時關光是在打標軌跡完成后,將激光延時關閉。   延時關光程序如下:   ·   void CZmc_fontToMoveDlg::Zscan_Z3pFile_EndString(struct_GraphPos *iGraphData){ char cmdbuff[2048] = ""; char tempbuff[2048] = ""; //生成命令 sprintf(tempbuff, "FORCE_SPEED = %f\n",m_dEmpSpeed); //設置空移速度 strcat(cmdbuff, tempbuff); sprintf(tempbuff, "MOVESCANABS(%f,%f)\n",(*iGraphData).fposx,(*iGraphData).fposy); //移動 strcat(cmdbuff, tempbuff); //延時關光 if(m_nLastDelay >0) { //延時關光 sprintf(tempbuff, "MOVEOP_DELAY = 0\nMOVE_DELAY(%f)\n",m_nLastDelay/1000); strcat(cmdbuff, tempbuff); } else { sprintf(tempbuff, "MOVEOP_DELAY = %f\n",m_nLastDelay/1000); strcat(cmdbuff, tempbuff); } //關光 sprintf(tempbuff, "MOVE_OP(%d,OFF)\n",m_nLaserIO); strcat(cmdbuff, tempbuff); //判斷命令長度是否發(fā)送 strcat(g_MoveStr,cmdbuff); Zscan_Z3pFile_Down();}   四、最終效果   首先點擊下拉框選擇控制器IP,點擊連接,依次設置好激光器參數(shù)、運動參數(shù),設置好后輸入打軌跡的參數(shù),點擊運動開始打圓形軌跡,點擊停止結束。   通過Zdevelop軟件的示波器采樣運動結果:先從其他位置空移到起始位置,然后提前1ms開光,走完一個圓形軌跡,關閉激光(延時關光),再空移到下一個圓形軌跡的起點,開光(提前1ms開光),又走完一個軌跡后,關光(延時5ms關光),如此循環(huán)執(zhí)行,直到設置的行列數(shù)打完停止(打軌跡中也能點擊停止)。   XY模式下的軌跡,軌跡包括了圓形打標軌跡和空走軌跡:   本次,正運動技術開放式激光振鏡運動控制器:C++快速開發(fā) ,就分享到這里。   更多精彩內容請關注“正運動小助手”公眾號,需要相關開發(fā)環(huán)境與例程代碼,請咨詢正運動技術銷售工程師:400-089-8936。   本文由正運動技術原創(chuàng),歡迎大家轉載,共同學習,一起提高中國智能制造水平。文章版權歸正運動技術所有,如有轉載請注明文章來源。" width="600" height="" border="0" vspace="0">

  (1)ZMC408SCAN內置高精度PSO位置同步輸出功能,在加工圓角、曲線部分時即使進行了減速調整,在高速加工的場合,也能控制激光輸出的間距保持恒定;

  (2)支持激光振鏡控制和振鏡反饋,包含2個振鏡接口,支持2D振鏡和3D振鏡,配合不帶加減速的運動指令MOVESCAN,拐角處振鏡加工自動延時,完成精準高效的激光控制,提高激光加工設備的產(chǎn)能;

  (3)通過指令在運動中靈活的調節(jié)激光開光/關光延時,響應快,精確到us級別的控制,且設置過程簡單,大大縮短了工程師的調參時間;

  (4)自帶LASER激光器控制接口,支持IPG、YLR、YLS等類型激光電源,還帶一個EXIO擴展IO接口,通過定制轉接板,靈活控制市場上主流的各種激光器;

  (5)支持PC同時控制16個ZMC408SCAN控制器同時工作,形成一種振鏡陣列的激光加工;

  (6)板載4路高速差分脈沖輸出,并帶4路高速差分編碼器反饋,支持EtherCAT總線驅動器的控制,支持5軸XYZAC軸的插補,支持振鏡軸與運動軸混合插補。

  (7)支持直線插補、任意圓弧插補、空間圓弧、螺旋插補、電子凸輪、電子齒輪、同步跟隨、虛擬軸設置等多種運動控制功能。

  02、系統(tǒng)架構

  下圖為ZMC408SCAN開放式激光控制器的參考架構,支持多種不同類型的激光器控制。

運動控制

  03、上位機和控制器通訊

  上位機和控制器通訊調用正運動封裝好的函數(shù)庫,提供運動控制和激光控制等眾多函數(shù)庫接口,激光振鏡的系統(tǒng)架構參見下圖。

運動控制

  本例采用EtherNET網(wǎng)口連接控制器,通過函數(shù)ZAux_OpenEth()建立通訊連接,用戶可在設置好的界面中選擇當前網(wǎng)段下的控制器IP完成連接,控制器出廠IP地址192.168.0.11,參見下圖。

運動控制

  04、激光控制

  一、指令介紹

  下面是我們程序中用到的接口函數(shù),主要包含激光控制和激光振鏡控制兩部分,程序的實現(xiàn)可直接使用封裝好的接口函數(shù)發(fā)送命令給控制器。

  本例采用FIBER激光器和2D激光振鏡,用到下面的函數(shù)接口:

  § ZAux_Direct_MoveScanAbs:振鏡軸多軸絕對直線插補SCAN運動,不帶加減速過程,我們這里用來控制振鏡軸運動,通過小線段的形式擬合圓形軌跡;

  § ZAux_Direct_MoveOpDelay:緩沖輸出延時,提前開光時將延時時間設置為負數(shù);

  § ZAux_Direct_MoveDelay:緩沖輸出延時,我們這里用來延時關光。

  激光功率設置:提供模擬量ZAux_Direct_SetDA、PWM的占空比ZAux_Direct_SetPwmDuty和頻率ZAux_Direct_SetPwmFreq等方式控制設置振鏡軸拐角處自動延時:

  ZAux_Direct_SetCornerMode

  1.振鏡軸直線插補

  ZAux_Direct_MoveScanAbs絕對運動,ZAux_Direct_MoveScan相對運動。

運動控制

  2.設置開關光

  輸出狀態(tài)為0關光,輸出狀態(tài)為1開光。

運動控制

  3.開關光延時

運動控制

  4.提前/延時開關光

  正數(shù)時間延時,負數(shù)時間提前開關光。

運動控制

  5.設置激光能量(功率)

  通過改變模擬量輸出的電壓值來控制激光能量大小。

運動控制

  6.PWM占空比

  通過設置PWM的占空比來調整激光頻率,在開始打軌跡之前一定要先設置好。

運動控制

  7.PWM頻率

運動控制

  8.振鏡軸拐角延時

運動控制

  9.拐角延時起始角度

運動控制

  10.拐角延時結束角度

運動控制

  二、程序流程

  先建立控制器通訊,獲取連接句柄,激光器選擇及參數(shù)設置,然后編輯紅光與激光口控制開關,運動參數(shù)設置,軌跡參數(shù)進行小線段處理,開始運動,停止運動。

運動控制

運動控制

  三、主要程序展示

  初始化定義相關變量,初始化軸參數(shù),配置好FIBER轉接板的方向為輸出,后續(xù)的激光軌跡加工控制由按鈕觸發(fā)。

  在運動之前我們要設置好空移速度、打標速度、開關光延時、軌跡圓半徑、標刻行列數(shù)、圓心距等參數(shù)。運動開始直接調用這些相關參數(shù)執(zhí)行,獲取完軌跡后調用3次文件執(zhí)行。

  1.初始化408FIBER轉換板針腳定義,不同激光器類型定義一套不同的輸出口,輸出口可以在選擇激光器類型后對應在界面上進行修改。

  408 FIBER轉換板參數(shù)初始化程序:

  ·

  void CZmc_fontToMoveDlg::OnCbnSelchangeComboLaser(){ // TODO: 在此添加控件通知處理程序代碼 UpdateData(TRUE); if(m_nLaserType == FIBER_408) //408 FIBER轉換板參數(shù)設置 { char cmdbuffAck[2048] = ""; int iresult = ZAux_Execute(m_Handle,"EXIO_DIR(0, $8FFFF)",cmdbuffAck,2048); m_nEnableIO = 47; //使能io m_nLaserIO = 8; //出關io m_nRedIO = 48; //紅光io m_nAout = 3; //功率io m_nPwmIo = 9; //頻率io } else if(m_nLaserType == YLR_408) { m_nEnableIO = 31; //使能io m_nLaserIO = 8; //出關io m_nRedIO = 32; //紅光io m_nAout = 2; //功率io m_nPwmIo = 9; //頻率io } else if(m_nLaserType == YAG_408) //408 YAG轉換板參數(shù)設置 { char cmdbuffAck[2048] = ""; int iresult = ZAux_Execute(m_Handle,"EXIO_DIR(0, $AFBBF)",cmdbuffAck,2048); m_nEnableIO = 47; //使能io m_nLaserIO = 8; //出關io m_nRedIO = 48; //紅光io m_nAout = 3; //功率io m_nPwmIo = 9; //頻率io } else if(m_nLaserType == FIBER_504) //504 { m_nEnableIO = 5; //使能io m_nLaserIO = 6; //出關io m_nRedIO = 28; //紅光io m_nAout = 2; //功率io m_nPwmIo = 7; //頻率io } UpdateData(FALSE);}

  2.設置拐角延時與激光功率,再調用運動執(zhí)行,程序如下。

  ·

  void CZmc_fontToMoveDlg::OnBnClickedBtnMove(){ // TODO: 在此添加控件通知處理程序代碼 UpdateData(TRUE); //設置拐角減速此ZSMOOTH為拐角延時 int iresult = ZAux_Direct_SetCornerMode(m_Handle,SCAN_AxisX,2); //設置精準輸出 iresult = ZAux_Direct_SetParam(m_Handle,"AXIS_ZSET",SCAN_AxisX,3); //設置拐角延時 iresult = ZAux_Direct_SetZsmooth(m_Handle,SCAN_AxisX,m_nCorDelay); //設置拐角起始角度,減速時間在DecelAngle-StopAngle線性變化 iresult = ZAux_Direct_SetDecelAngle(m_Handle,SCAN_AxisX,0); //設置拐角結束角度 iresult = ZAux_Direct_SetStopAngle(m_Handle,SCAN_AxisX,90/180*3.1415926); //設置激光功率 iresult = ZAux_Direct_SetDA(m_Handle,m_nAout,m_nAoutVal); //設置激光頻率 iresult = ZAux_Direct_SetPwmDuty(m_Handle,m_nPwmIo,0.5); iresult = ZAux_Direct_SetPwmFreq(m_Handle,m_nPwmIo,m_nPwmFreq); //獲取軌跡數(shù)據(jù),(0,0)為圓外接起點,5*5間距畫半徑為5的小圓 Cal_WorkData(m_fStartX, m_fStartY, m_nStepDis, m_nColNum, m_nRowNum, m_fRadius); Run_3FileMode();}

  3.圓弧轉小線段是將我們的設置的圓弧軌跡轉換為小線段存起來,然后轉換后由3次文件的形式加載執(zhí)行。

  圓弧轉小線段程序如下:

  ·

  void CZmc_fontToMoveDlg::Cal_WorkData(float fStartX, float fStartY, float iStepDis, int iColNum, int iRowNum, float fRadius){ //圓弧轉小線段 int ilen = -1; double ArcX; double ArcY; //獲取單個整圓轉換長度 int iret = ZMotionOptimize_TransArcSeges(m_Handle,fStartX - fRadius, fStartY, fStartX + fRadius, fStartY + 2 * fRadius, 0, -2 * PI, m_refDistance, &ArcX, &ArcY, &ilen); if (iret != 0 || ilen < 0) { CString StrErr; StrErr.Format("圓弧轉小線段失敗錯誤碼:%d",iret); MessageBox(StrErr); return; } double *ArcToLineX; double *ArcToLineY; ArcToLineX = (double*)malloc(sizeof(double)*ilen); ArcToLineY = (double*)malloc(sizeof(double)*ilen); //獲取數(shù)據(jù) iret = ZMotionOptimize_TransArcSeges(m_Handle, fStartX - fRadius, fStartY, fStartX + fRadius, fStartY + 2 * fRadius, 0, -2 * PI, m_refDistance, ArcToLineX, ArcToLineY, &ilen); //軌跡總長度 m_GraphTotalLen = ilen * iColNum * iRowNum; m_GraphData = (struct_GraphPos*)malloc(sizeof(struct_GraphPos)*m_GraphTotalLen); //申請分配內存 //填寫數(shù)據(jù) int iAcr = 0; for (int icol = 0; icol < iColNum ; icol++) { for(int irow = 0 ;irow

  4.這里程序完成空移,然后移動完成之前,如果下一條運動指令執(zhí)行的是軌跡運動,那么提前將激光打開。

  ·

  //空移到打標點起始點void CZmc_fontToMoveDlg::Zscan_Z3pFile_StartString(struct_GraphPos *iGraphData){ char cmdbuff[2048] = ""; char tempbuff[2048] = ""; //生成命令 sprintf(tempbuff, "BASE(%d,%d)\n",SCAN_AxisX,SCAN_AxisY); //設置打標軸 strcat(cmdbuff, tempbuff); //空移到起點 sprintf(tempbuff, "FORCE_SPEED = %f\n",m_dEmpSpeed); //設置空移速度 strcat(cmdbuff, tempbuff); sprintf(tempbuff, "MOVESCANABS(%f,%f)\n",(*iGraphData).fposx,(*iGraphData).fposy); //移動 strcat(cmdbuff, tempbuff); //設置提前開光 if (m_nStartDelay < 0) //提前出光 { sprintf(tempbuff, "MOVEOP_DELAY = %f\n",m_nStartDelay/1000); strcat(cmdbuff, tempbuff); } else { sprintf(tempbuff, "MOVE_DELAY(%f)\n",m_nStartDelay/1000); strcat(cmdbuff, tempbuff); } //開光 sprintf(tempbuff, "MOVE_OP(%d,1)\nMOVE_DELAY(10)\nMOVE_OP(%d,1)\n",m_nEnableIO,m_nLaserIO); strcat(cmdbuff, tempbuff); //判斷命令長度是否發(fā)送 strcat(g_MoveStr,cmdbuff); Zscan_Z3pFile_Down();}

  //生成打標直線段字符串void CZmc_fontToMoveDlg::Zscan_Z3pFile_LineString(struct_GraphPos *iGraphData){ char cmdbuff[2048] = ""; char tempbuff[2048] = ""; //生成命令 //空移到起點 sprintf(tempbuff, "FORCE_SPEED = %f\n",m_dSpeed); //設置打標速度 strcat(cmdbuff, tempbuff); sprintf(tempbuff, "MOVESCANABS(%f,%f)\n",(*iGraphData).fposx,(*iGraphData).fposy); //移動 strcat(cmdbuff, tempbuff); //判斷命令長度是否發(fā)送 strcat(g_MoveStr,cmdbuff); Zscan_Z3pFile_Down();}

  5.延時關光是在打標軌跡完成后,將激光延時關閉。

  延時關光程序如下:

  ·

  void CZmc_fontToMoveDlg::Zscan_Z3pFile_EndString(struct_GraphPos *iGraphData){ char cmdbuff[2048] = ""; char tempbuff[2048] = ""; //生成命令 sprintf(tempbuff, "FORCE_SPEED = %f\n",m_dEmpSpeed); //設置空移速度 strcat(cmdbuff, tempbuff); sprintf(tempbuff, "MOVESCANABS(%f,%f)\n",(*iGraphData).fposx,(*iGraphData).fposy); //移動 strcat(cmdbuff, tempbuff); //延時關光 if(m_nLastDelay >0) { //延時關光 sprintf(tempbuff, "MOVEOP_DELAY = 0\nMOVE_DELAY(%f)\n",m_nLastDelay/1000); strcat(cmdbuff, tempbuff); } else { sprintf(tempbuff, "MOVEOP_DELAY = %f\n",m_nLastDelay/1000); strcat(cmdbuff, tempbuff); } //關光 sprintf(tempbuff, "MOVE_OP(%d,OFF)\n",m_nLaserIO); strcat(cmdbuff, tempbuff); //判斷命令長度是否發(fā)送 strcat(g_MoveStr,cmdbuff); Zscan_Z3pFile_Down();}

  四、最終效果

  首先點擊下拉框選擇控制器IP,點擊連接,依次設置好激光器參數(shù)、運動參數(shù),設置好后輸入打軌跡的參數(shù),點擊運動開始打圓形軌跡,點擊停止結束。

運動控制

  通過Zdevelop軟件的示波器采樣運動結果:先從其他位置空移到起始位置,然后提前1ms開光,走完一個圓形軌跡,關閉激光(延時關光),再空移到下一個圓形軌跡的起點,開光(提前1ms開光),又走完一個軌跡后,關光(延時5ms關光),如此循環(huán)執(zhí)行,直到設置的行列數(shù)打完停止(打軌跡中也能點擊停止)。

運動控制

  XY模式下的軌跡,軌跡包括了圓形打標軌跡和空走軌跡:

運動控制

  本次,正運動技術開放式激光振鏡運動控制器:C++快速開發(fā) ,就分享到這里。

  更多精彩內容請關注“正運動小助手”公眾號,需要相關開發(fā)環(huán)境與例程代碼,請咨詢正運動技術銷售工程師:400-089-8936。

  本文由正運動技術原創(chuàng),歡迎大家轉載,共同學習,一起提高中國智能制造水平。文章版權歸正運動技術所有,如有轉載請注明文章來源。

標簽: 控制器運動控制

點贊

分享到:

上一篇:分享稱重傳感器的接線方式

下一篇:人機界面與觸摸屏之間有哪些...

中國傳動網(wǎng)版權與免責聲明:凡本網(wǎng)注明[來源:中國傳動網(wǎng)]的所有文字、圖片、音視和視頻文件,版權均為中國傳動網(wǎng)(www.treenowplaneincome.com)獨家所有。如需轉載請與0755-82949061聯(lián)系。任何媒體、網(wǎng)站或個人轉載使用時須注明來源“中國傳動網(wǎng)”,違反者本網(wǎng)將追究其法律責任。

本網(wǎng)轉載并注明其他來源的稿件,均來自互聯(lián)網(wǎng)或業(yè)內投稿人士,版權屬于原版權人。轉載請保留稿件來源及作者,禁止擅自篡改,違者自負版權法律責任。

網(wǎng)站簡介|會員服務|聯(lián)系方式|幫助信息|版權信息|網(wǎng)站地圖|友情鏈接|法律支持|意見反饋|sitemap

中國傳動網(wǎng)-工業(yè)自動化與智能制造的全媒體“互聯(lián)網(wǎng)+”創(chuàng)新服務平臺

網(wǎng)站客服服務咨詢采購咨詢媒體合作

Chuandong.com Copyright ?2005 - 2024 ,All Rights Reserved 版權所有 粵ICP備 14004826號 | 營業(yè)執(zhí)照證書 | 不良信息舉報中心 | 粵公網(wǎng)安備 44030402000946號