开放式激光振镜运动控制器C++ 快速调用图形库应用

网友投稿 322 2023-12-12


今天,正运动小助手给大家分享一下开放式激光振镜运动控制器:C++快速调用图形库应用,本文以二维码打标、文本打标、矢量图形打标为例,解决用户在激光打标时需要进行各种复杂的操作和函数库调用时容易出现的错误问题。

开放式激光振镜运动控制器C++ 快速调用图形库应用

  01ZMC408SCAN控制器介绍  ZMC408SCAN是正运动技术推出的高性能总线双振镜运动控制器,集成了2个百兆以太网口,支持EtherCAT、EtherNET、CAN、RS232、RS485、24路通用数字输入、20路通用数字输出、2路通用模拟量输出、2路通用模拟量输入、4个本地差分脉冲轴接口、1个MPG手轮编码器接口、2个带反馈振镜接口、1个激光电源专用接口、一个EXIO可配置扩展IO接口。

  ZMC408SCAN控制器支持EtherCAT总线连接,支持最快500μs的刷新周期,支持最多达16轴运动控制,支持直线插补、任意圆弧插补、空间圆弧、螺旋插补、电子凸轮、电子齿轮、同步跟随、虚拟轴设置等;采用优化的网络通讯协议可以实现实时的运动控制。

单台电脑最多支持达256个ZMC控制器同时连接  (1)ZMC408SCAN内置高精度PSO位置同步输出功能,在加工圆角、曲线部分时即使进行了减速调整,在高速加工的场合,也能控制激光输出的间距保持恒定;  (2)支持激光振镜控制和振镜反馈,包含2个振镜接口,支持2D振镜和3D振镜,配合不带加减速的运动指令MOVESCAN,拐角处振镜加工自动延时,完成精准高效的激光控制,提高激光加工设备的产能;  (3)通过指令在运动中灵活的调节激光开光/关光延时,响应快,精确到us级别的控制,且设置过程简单,大大缩短了工程师的调参时间;(4)自带LASER激光器控制接口,支持IPG、YLR、YLS等类型激光电源,还带一个EXIO扩展IO接口,通过定制转接板,灵活控制市场上主流的各种激光器;(5)支持PC同时控制16个ZMC408SCAN控制器同时工作,形成一种振镜阵列的激光加工;  (6)板载4路高速差分脉冲输出,并带4路高速差分编码器反馈,支持EtherCAT总线驱动器的控制,支持5轴XYZAC轴的插补,支持振镜轴与运动轴混合插补。

  1.基本规格参数  2.接口定义  3.参考架构  02打标库说明  1.目的为解决激光打标时需要进行各种复杂的操作和函数库调用时容易出现的错误问题用户可以通过PC更加方便的进行加工文件的生成,在软件中进行图形加工操作。

如要打标二维码,只需要通过条码指令ZmotionLaser_BarCode(int nTechnology,const char *pStrText,const char *pStrType,double dX,double dY,double dSizeX,double dSizeY,double dAngle)将参数设置好,选择好要标刻的码类型,将标刻内容输入即可,通过程序将其轨迹生成的三次文件等待启动标刻。

如要打标文本,则通过对应的文本指令ZmotionLaser_Text(int nTechnology,const char *pStrText,double dX,double dY,double dAccuracy)设置好其工艺参数大小、旋转角度等,而后输入我们要标刻的文本内容,通过三次文件的形式进行打标。

  我们打标条码、二维码、不同字体样式的文本、矢量图形、位图等,都有对应的接口指令,从而实现快速调参开发,可以节省工程师大量的编程及工艺规划时间  2.方式  使用ZmotionLaser.dll与ZmotionLaser.lib库添加到需要使用的程序中,调用ZmotionLaser.h中的相关函数即可生成需要加工的三次文件,在控制器中运行该三次文件就可以进行加工(需要带Zmotion库与ZMotionCad3库)。

  3.三次文件使用步骤如下  (1)先开启文件生成;(2)进行各种初始化,确定轴与输出口;(3)设置各种加工参数,调整加工效果;(4)进行加工函数的调用,将需要加工的数据写入;(5)调用生成函数生成加工三次文件;  (6)关闭文件生成。

  4.优势  仅需要很少的指令填上对应参数就能实现一个类型打标,将复杂的指令编程简单化,对于加工轨迹复杂、文件较大也能实现动态追加文件发送字符串运行  03指令说明  一、条码  1.函数名:uint32 ZmotionLaser_BarCode(int nTechnology,const char *pStrText,const char *pStrType,double dX,double dY,double dSizeX,double dSizeY,double dAngle)  2.说明:进行条码图形的加工,通过该指令配合上几个常用指令我们可以轻松选择要打标的条码类型,以及更改我们想要的尺寸大小、打标幅面内的位置。

二、文本及状态设置  1.文本  (1)函数名:uint32 ZmotionLaser_Text(int nTechnology,const char *pStrText,double dX,double dY,double dAccuracy)(2)说明: 进行文本图形的加工,通过该指令配合上几个常用指令我们可以简单的实现文本打标,只需要将打标的内容填到对应参数位置,在对应参数写好工艺参数,打标坐标位置等。

  2.文本状态设置  (1)函数名:uint32 ZmotionLaser_SetTextStyle(const char * pStrFont,bool bThickness,bool bItalics,bool bUnderline,bool bDelete,double dHeight,double dWidthR,double dAngle,double dTilt)  (2)说明: 设置文本的状态,需要确定文本的字体、风格、尺寸、角度和倾斜等状态。

该状态设置后如果不重新设置,后续所有文本的状态都按照该状态进行,配合文本指令使用进行文本打标  三、矢量图形参数设置  1.函数名: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.说明: 设置某一工艺的矢量图形加工参数。

该指令用于矢量图形加工时参数设置,针对矢量图形的加工复杂性,通过将参数提前写入,以在打标时快速响应  04激光振镜控制实例  一、二维码打标  1.二维码打标参数设置界面  2.操作流程  (1)架好设备后,用振镜矫正工具将振镜矫正(可参考正运动小助手文章“开放式激光振镜运动控制器:C++振镜矫正方法与实现”);(2)矫正完成后,如上图选择对应的IP地址进行连接,选择对应的激光器类型、设置好运动参数、选好填充工艺并将参数设置好、选择要标刻的条码类型、设置条码大小及打标位置旋转角度等,在内容栏填入标刻内容;  (3)准备工作完成,点击标刻进行打标,如果中途发现有异常,点击停止即可。

  通过这个例程我们可以实现多种类型条码、二维码的打标,适用于多种激光器类型,还能随时调整打标的内容、大小、位置以及在xy平面上的角度,而且通过对功率的调整我们可以在不同的物品上进行打标,如平面产品包装、充电器、手机外壳、一些金属产品等。

  我们用到的头文件和定义控制器句柄,实现与控制器连接的第一步通过ZAux_OpenEth(char *ipaddr, ZMC_HANDLE * phandle)指令连接控制器获取返回句柄断开连接则用ZAux_Close(ZMC_HANDLE handle)。

连接上就能对控制器实现交互控制了  程序如下:  //连接控制器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;iAxisLoadIcon(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; //填充参数初始化 m_FillPara.m_bEnable = true; //填充使能 m_FillPara.m_bOutline = true; //使能轮廓 m_FillPara.m_bOutlineFirst = false; //轮廓优先 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; //填充线数目 m_FillPara.m_dLineSpace = 0.1; //线间距 m_FillPara.m_dMargin = 0; //边距 m_FillPara.m_dSOffset = 0; //开始偏移 m_FillPara.m_dEOffset = 0; //结束偏移 m_FillPara.m_dLineIndent = 0; //直线缩进 //文本参数 m_dTextHigh = 30; //文本高度 m_dTextWidth = 30; //文本宽度 m_dTextAngle = 0; //文本角度 m_dTextXpos = 0; m_dTextYpos = 0; m_TextString = _T("");}  5.设置填充工艺参数  由输入内容生成二维码,将我们的二维码轨迹分成小线段轨迹生成三次文件,并且将填充工艺参数等设置进去。

  通过指令ZmotionLaser_SetOutput(int nAp,int nMO,int nRed)设置好出光口号,为标刻做好准备  填充工艺:主要是指令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)的一些参数,将参数通过变量的形式做到界面上。

  bOutline使能轮廓:填充时是否保存原来的图形轮廓bOutlineFirst轮廓优先:填充时保留轮廓的情况下,勾选轮廓优先会使轮廓轨迹在填充线之前进行加工,否则轮廓轨迹在填充线之后进行加工(如想了解更多填充工艺,可联系正运动技术支持工程师)。

填充类型:图形进行填充的方式  (1)单相填充:填充线总是从左向右填充;  (2)双向填充:填充线先是从左向右,然后从右向左进行填充,其余循环填充;  (3)弓形填充:类似于双向填充,但填充线末端之间会产生连接线;  (4)优化弓形填充:类似于弓形填充,但对象空白的地方仍会跳过去填充。

  程序如下:  void CZmc_laserDlg::OnEnChangeEditText(){ UpdateData(TRUE); //打开打标库3次文件功能 int rtn = ZmotionLaser_OpenFile3(m_Handle); if(CheckError(rtn,"ZmotionLaser_OpenFile3")) return; rtn = ZmotionLaser_SetOutputLimits(55); //设置输出口最大编号限制 if(CheckError(rtn,"ZmotionLaser_OpenFile3")) return; rtn = ZmotionLaser_SetScanAxis(4,5); //设置振镜轴号 if(CheckError(rtn,"ZmotionLaser_SetScanAxis")) return; rtn = ZmotionLaser_SetOutput(m_nLaserIO,m_nEnableIO,m_nRedIO); //设置开光光控制 if(CheckError(rtn,"ZmotionLaser_SetOutput")) return; rtn = ZmotionLaser_AoutInit(m_nAout,255); //设置模拟量功率设置 if(CheckError(rtn,"ZmotionLaser_AoutInit")) return; rtn = ZmotionLaser_SetPowerEnable(false); //关闭动态修改功率 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; //设置加工工艺参数 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; //设置填充参数 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; //结束填充 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.完成打标  停止加工,主要是将任务停止,然后停止所有的轴运动,关掉激光。

  程序如下:  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); //关光 Sleep(10); rtn = ZAux_Direct_SetOp(m_Handle,m_nEnableIO,0); SetDlgItemTextA(IDC_BTN_LASER,"激光(关)");}  8.二维码打标界面  9. 界面参数配置讲解&打标效果展示  二、文本打标*1.文本打标参数设置界面  通过该例程我们可以实现产品包装生产日期、金属元件、硬质塑料产品上的标注打标,还能在金属物品上进行纪念语等的打标,多种字体样式可选择。

  操作流程和二维码打标类似,连接控制器,选择对应激光器类型,填写运动参数、填充工艺以及标刻文本信息等(可根据实际打标测试结果进行调整)程序构建类似,唯一不同在于标刻处程序写法上有差异,二维码打标是将轨迹生成与标刻运行分开写,而文本打标是将参数设置好、文本内容确定后,点击打标才开始生成三次文件,后开启任务运行文件。

  程序如下:  //标刻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); //设置输出口最大编号限制 if(CheckError(rtn,"ZmotionLaser_OpenFile3")) return; rtn = ZmotionLaser_SetScanAxis(4,5); //设置振镜轴号 if(CheckError(rtn,"ZmotionLaser_SetScanAxis")) return; rtn = ZmotionLaser_SetOutput(m_nLaserIO,m_nEnableIO,m_nRedIO);//设置开光控制 if(CheckError(rtn,"ZmotionLaser_SetOutput")) return; rtn = ZmotionLaser_AoutInit(m_nAout,255); //设置模拟量功率设置 if(CheckError(rtn,"ZmotionLaser_AoutInit")) return; rtn = ZmotionLaser_SetPowerEnable(false); //关闭动态修改功率 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; //设置加工工艺参数 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; //设置填充参数 rtn = ZmotionLaser_SetFillObject(m_FillPara,1); if(CheckError(rtn,"ZmotionLaser_SetFillObject")) return; //设置文本字体参数 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; //结束填充 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. 界面参数配置讲解&打标效果展示  三、矢量图形打标*1.矢量图形打标参数设置界面  通过该例程我们可以实现一些图案的打标,如产品LONG打印、图案打印、金属牌上打印图案做项链等。

  操作流程和前面两个例程类似,唯一不同的是这里矢量图形标刻,我们要选择保存好的矢量图形,设置完大小、位置、旋转角度后进行标刻我们添加进来图形可以在右下部分区域看见图形(二维码例程一样有显示图形)如下图红色框内显示。

*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; //转成显示坐标 top = -(bottom + height); //显示的区域 double WinWidth = rectClient.Width() - 8; double WinHeight = rectClient.Height() - 8; // 实际的区域 double ObjectWidth = width; double ObjectHeight = height; double ObjectPixWidth, ObjectPixHeight; if (ObjectWidth*WinHeight SetViewportOrg(ZeroPoint.x-left*dUnitsPerMm, ZeroPoint.y-top*dUnitsPerMm); ZMotionCad3_Draw(dc->m_hDC, (Struct_ZCad_Item *) m_pGraph, 0, 1.0f/dUnitsPerMm); //绘图 }}  3. 界面参数配置讲解&打标效果展示  本次,正运动技术开放式激光振镜运动控制器:C++快速调用图形库应用,就分享到这里。

  更多精彩内容请关注“正运动小助手”公众号,需要相关开发环境与例程代码,请咨询正运动技术销售工程师:400-089-8936本文由正运动技术原创,欢迎大家转载,共同学习,一起提高中国智能制造水平文章版权归正运动技术所有,如有转载请注明文章来源。

免责声明:本文来源:[中国传动网]的所有文字、图片、音视和视频文件,版权均为中国传动网(www.chuandong.com)独家所有

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:开关磁阻电机的九大优势、三大缺点、应用领域全面解析
下一篇:开放式激光振镜运动控制器C++快速开发
相关文章

 发表评论

暂时没有评论,来抢沙发吧~