技术频道

娓娓工业
您现在的位置: 中国传动网 > > > 开放式激光振镜运动控制器:C++快速开发

开放式激光振镜运动控制器:C++快速开发

时间:2022-10-18 10:05:34来源:深圳市正运动技术有限公司

导语:​今天,正运动技术为大家分享一下应用ZMC408SCAN开放式激光振镜运动控制器的C++开发,实现激光振镜打标,可在文章末尾扫码获取例程源码。

  今天,正运动技术为大家分享一下应用ZMC408SCAN开放式激光振镜运动控制太阳集团网址首页器的C++开发,实现激光振镜打标,可在文章末尾扫码获取例程源码。

太阳集团网址首页  除了C++还支持使用其他上位机软件来开发,上位机程序运行时需要动态库“zmotion.dll”,上位机开发调试时可以把ZDevelop软件同时连接到控制器辅助调试。

太阳集团网址首页  01、ZMC408SCAN控制器介绍

  ZMC408SCAN是正运动技术新推出的一款支持EtherCAT总线的开放式激光振镜运动控制器,专为工业激光+振镜+运动控制方面的应用而设计。通过EtherCAT总线和脉冲轴接口能实现多轴联动运动控制。

  ZMC408SCAN支持ETHERNET、EtherCAT、USB、CAN、RS485、RS232等通讯接口,通过CAN、EtherCAT总线可以连接各个扩展模块,从而扩展数字量、模拟量或运动轴。

电源,还带一个EXIO扩展IO接口,通过定制转接板,灵活控制市场上主流的各种激光器;   (5)支持PC同时控制16个ZMC408SCAN控制器同时工作,形成一种振镜阵列的激光加工;   (6)板载4路高速差分脉冲输出,并带4路高速差分编码器反馈,支持EtherCAT总线驱动器的控制,支持5轴XYZAC轴的插补,支持振镜轴与运动轴混合插补。   (7)支持直线插补、任意圆弧插补、空间圆弧、螺旋插补、电子凸轮、电子齿轮、同步跟随、虚拟轴设置等多种运动控制功能。   02系统架构   下图为ZMC408SCAN开放式激光控制器的参考架构,支持多种不同类型的激光器控制。   03上位机和控制器通讯   上位机和控制器通讯调用正运动封装好的函数库,提供运动控制和激光控制等众多函数库接口,激光振镜的系统架构参见下图。   本例采用EtherNET网口连接控制器,通过函数ZAux_OpenEth()建立通讯连接,用户可在设置好的界面中选择当前网段下的控制器IP完成连接,控制器出厂IP地址192.168.0.11,参见下图。   04激光控制   一、指令介绍   下面是我们程序中用到的接口函数,主要包含激光控制和激光振镜控制两部分,程序的实现可直接使用封装好的接口函数发送命令给控制器。   本例采用FIBER激光器和2D激光振镜,用到下面的函数接口:   § ZAux_Direct_MoveScanAbs:振镜轴多轴绝对直线插补SCAN运动,不带加减速过程,我们这里用来控制振镜轴运动,通过小线段的形式拟合圆形轨迹;   § ZAux_Direct_MoveOpDelay:缓冲输出延时,提前开光时将延时时间设置为负数;   § ZAux_Direct_MoveDelay:缓冲输出延时,我们这里用来延时关光。   激光功率设置:提供模拟量ZAux_Direct_SetDA、PWM的占空比ZAux_Direct_SetPwmDuty和频率ZAux_Direct_SetPwmFreq等方式控制设置振镜轴拐角处自动延时:   ZAux_Direct_SetCornerMode   1.振镜轴直线插补   ZAux_Direct_MoveScanAbs绝对运动,ZAux_Direct_MoveScan相对运动。   2.设置开关光   输出状态为0关光,输出状态为1开光。   3.开关光延时   4.提前/延时开关光   正数时间延时,负数时间提前开关光。   5.设置激光能量(功率)   通过改变模拟量输出的电压值来控制激光能量大小。   6.PWM占空比   通过设置PWM的占空比来调整激光频率,在开始打轨迹之前一定要先设置好。   7.PWM频率   8.振镜轴拐角延时   9.拐角延时起始角度   10.拐角延时结束角度   二、程序流程   先建立控制器通讯,获取连接句柄,激光器选择及参数设置,然后编辑红光与激光口控制开关,运动参数设置,轨迹参数进行小线段处理,开始运动,停止运动。   三、主要程序展示   初始化定义相关变量,初始化轴参数,配置好FIBER转接板的方向为输出,后续的激光轨迹加工控制由按钮触发。   在运动之前我们要设置好空移速度、打标速度、开关光延时、轨迹圆半径、标刻行列数、圆心距等参数。运动开始直接调用这些相关参数执行,获取完轨迹后调用3次文件执行。   1.初始化408FIBER转换板针脚定义,不同激光器类型定义一套不同的输出口,输出口可以在选择激光器类型后对应在界面上进行修改。   408 FIBER转换板参数初始化程序:   ·   void CZmc_fontToMoveDlg::OnCbnSelchangeComboLaser(){ // TODO: 在此添加控件通知处理程序代码 UpdateData(TRUE); if(m_nLaserType == FIBER_408) //408 FIBER转换板参数设置 { 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转换板参数设置 { 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.设置拐角延时与激光功率,再调用运动执行,程序如下。   ·   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); //获取轨迹数据,(0,0)为圆外接起点,5*5间距画半径为5的小圆 Cal_WorkData(m_fStartX, m_fStartY, m_nStepDis, m_nColNum, m_nRowNum, m_fRadius); Run_3FileMode();}   3.圆弧转小线段是将我们的设置的圆弧轨迹转换为小线段存起来,然后转换后由3次文件的形式加载执行。   圆弧转小线段程序如下:   ·   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); //获取数据 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); //申请分配内存 //填写数据 int iAcr = 0; for (int icol = 0; icol < iColNum ; icol++) { for(int irow = 0 ;irow   4.这里程序完成空移,然后移动完成之前,如果下一条运动指令执行的是轨迹运动,那么提前将激光打开。   ·   //空移到打标点起始点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); //判断命令长度是否发送 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); //判断命令长度是否发送 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); //判断命令长度是否发送 strcat(g_MoveStr,cmdbuff); Zscan_Z3pFile_Down();}   四、最终效果   首先点击下拉框选择控制器IP,点击连接,依次设置好激光器参数、运动参数,设置好后输入打轨迹的参数,点击运动开始打圆形轨迹,点击停止结束。   通过Zdevelop软件的示波器采样运动结果:先从其他位置空移到起始位置,然后提前1ms开光,走完一个圆形轨迹,关闭激光(延时关光),再空移到下一个圆形轨迹的起点,开光(提前1ms开光),又走完一个轨迹后,关光(延时5ms关光),如此循环执行,直到设置的行列数打完停止(打轨迹中也能点击停止)。   XY模式下的轨迹,轨迹包括了圆形打标轨迹和空走轨迹:   本次,正运动技术开放式激光振镜运动控制器:C++快速开发 ,就分享到这里。   更多精彩内容请关注“正运动小助手”公众号,需要相关开发环境与例程代码,请咨询正运动技术销售工程师:400-089-8936。   本文由正运动技术原创,欢迎大家转载,共同学习,一起提高中国智能制造水平。文章版权归正运动技术所有,如有转载请注明文章来源。" style="margin: 0px auto; width: 600px;" alt="  今天,正运动技术为大家分享一下应用ZMC408SCAN开放式激光振镜运动控制器的C++开发,实现激光振镜打标,可在文章末尾扫码获取例程源码。   除了C++还支持使用其他上位机软件来开发,上位机程序运行时需要动态库“zmotion.dll”,上位机开发调试时可以把ZDevelop软件同时连接到控制器辅助调试。   01ZMC408SCAN控制器介绍   ZMC408SCAN是正运动技术新推出的一款支持EtherCAT总线的开放式激光振镜运动控制器,专为工业激光+振镜+运动控制方面的应用而设计。通过EtherCAT总线和脉冲轴接口能实现多轴联动运动控制。   ZMC408SCAN支持ETHERNET、EtherCAT、USB、CAN、RS485、RS232等通讯接口,通过CAN、EtherCAT总线可以连接各个扩展模块,从而扩展数字量、模拟量或运动轴。   (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轴的插补,支持振镜轴与运动轴混合插补。   (7)支持直线插补、任意圆弧插补、空间圆弧、螺旋插补、电子凸轮、电子齿轮、同步跟随、虚拟轴设置等多种运动控制功能。   02系统架构   下图为ZMC408SCAN开放式激光控制器的参考架构,支持多种不同类型的激光器控制。   03上位机和控制器通讯   上位机和控制器通讯调用正运动封装好的函数库,提供运动控制和激光控制等众多函数库接口,激光振镜的系统架构参见下图。   本例采用EtherNET网口连接控制器,通过函数ZAux_OpenEth()建立通讯连接,用户可在设置好的界面中选择当前网段下的控制器IP完成连接,控制器出厂IP地址192.168.0.11,参见下图。   04激光控制   一、指令介绍   下面是我们程序中用到的接口函数,主要包含激光控制和激光振镜控制两部分,程序的实现可直接使用封装好的接口函数发送命令给控制器。   本例采用FIBER激光器和2D激光振镜,用到下面的函数接口:   § ZAux_Direct_MoveScanAbs:振镜轴多轴绝对直线插补SCAN运动,不带加减速过程,我们这里用来控制振镜轴运动,通过小线段的形式拟合圆形轨迹;   § ZAux_Direct_MoveOpDelay:缓冲输出延时,提前开光时将延时时间设置为负数;   § ZAux_Direct_MoveDelay:缓冲输出延时,我们这里用来延时关光。   激光功率设置:提供模拟量ZAux_Direct_SetDA、PWM的占空比ZAux_Direct_SetPwmDuty和频率ZAux_Direct_SetPwmFreq等方式控制设置振镜轴拐角处自动延时:   ZAux_Direct_SetCornerMode   1.振镜轴直线插补   ZAux_Direct_MoveScanAbs绝对运动,ZAux_Direct_MoveScan相对运动。   2.设置开关光   输出状态为0关光,输出状态为1开光。   3.开关光延时   4.提前/延时开关光   正数时间延时,负数时间提前开关光。   5.设置激光能量(功率)   通过改变模拟量输出的电压值来控制激光能量大小。   6.PWM占空比   通过设置PWM的占空比来调整激光频率,在开始打轨迹之前一定要先设置好。   7.PWM频率   8.振镜轴拐角延时   9.拐角延时起始角度   10.拐角延时结束角度   二、程序流程   先建立控制器通讯,获取连接句柄,激光器选择及参数设置,然后编辑红光与激光口控制开关,运动参数设置,轨迹参数进行小线段处理,开始运动,停止运动。   三、主要程序展示   初始化定义相关变量,初始化轴参数,配置好FIBER转接板的方向为输出,后续的激光轨迹加工控制由按钮触发。   在运动之前我们要设置好空移速度、打标速度、开关光延时、轨迹圆半径、标刻行列数、圆心距等参数。运动开始直接调用这些相关参数执行,获取完轨迹后调用3次文件执行。   1.初始化408FIBER转换板针脚定义,不同激光器类型定义一套不同的输出口,输出口可以在选择激光器类型后对应在界面上进行修改。   408 FIBER转换板参数初始化程序:   ·   void CZmc_fontToMoveDlg::OnCbnSelchangeComboLaser(){ // TODO: 在此添加控件通知处理程序代码 UpdateData(TRUE); if(m_nLaserType == FIBER_408) //408 FIBER转换板参数设置 { 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转换板参数设置 { 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.设置拐角延时与激光功率,再调用运动执行,程序如下。   ·   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); //获取轨迹数据,(0,0)为圆外接起点,5*5间距画半径为5的小圆 Cal_WorkData(m_fStartX, m_fStartY, m_nStepDis, m_nColNum, m_nRowNum, m_fRadius); Run_3FileMode();}   3.圆弧转小线段是将我们的设置的圆弧轨迹转换为小线段存起来,然后转换后由3次文件的形式加载执行。   圆弧转小线段程序如下:   ·   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); //获取数据 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); //申请分配内存 //填写数据 int iAcr = 0; for (int icol = 0; icol < iColNum ; icol++) { for(int irow = 0 ;irow   4.这里程序完成空移,然后移动完成之前,如果下一条运动指令执行的是轨迹运动,那么提前将激光打开。   ·   //空移到打标点起始点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); //判断命令长度是否发送 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); //判断命令长度是否发送 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); //判断命令长度是否发送 strcat(g_MoveStr,cmdbuff); Zscan_Z3pFile_Down();}   四、最终效果   首先点击下拉框选择控制器IP,点击连接,依次设置好激光器参数、运动参数,设置好后输入打轨迹的参数,点击运动开始打圆形轨迹,点击停止结束。   通过Zdevelop软件的示波器采样运动结果:先从其他位置空移到起始位置,然后提前1ms开光,走完一个圆形轨迹,关闭激光(延时关光),再空移到下一个圆形轨迹的起点,开光(提前1ms开光),又走完一个轨迹后,关光(延时5ms关光),如此循环执行,直到设置的行列数打完停止(打轨迹中也能点击停止)。   XY模式下的轨迹,轨迹包括了圆形打标轨迹和空走轨迹:   本次,正运动技术开放式激光振镜运动控制器:C++快速开发 ,就分享到这里。   更多精彩内容请关注“正运动小助手”公众号,需要相关开发环境与例程代码,请咨询正运动技术销售工程师:400-089-8936。   本文由正运动技术原创,欢迎大家转载,共同学习,一起提高中国智能制造水平。文章版权归正运动技术所有,如有转载请注明文章来源。" width="600" height="" border="0" vspace="0">

  (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轴的插补,支持振镜轴与运动轴混合插补。

太阳集团网址首页  (7)支持直线插补、任意圆弧插补、空间圆弧、螺旋插补、电子凸轮、电子齿轮、同步跟随、虚拟轴设置等多种运动控制功能。

  02、系统架构

  下图为ZMC408SCAN开放式激光控制器的参考架构,支持多种不同类型的激光器控制。

运动控制

  03、上位机和控制器通讯

太阳集团网址首页  上位机和控制器通讯调用正运动封装好的函数库,提供运动控制和激光控制等众多函数库接口,激光振镜的系统架构参见下图。

运动控制

  本例采用EtherNET网口连接控制器,通过函数ZAux_OpenEth()建立通讯连接,用户可在设置好的界面中选择当前网段下的控制器IP完成连接,控制器出厂IP地址192.168.0.11,参见下图。

运动控制

太阳集团网址首页  04、激光控制

太阳集团网址首页  一、指令介绍

  下面是我们程序中用到的接口函数,主要包含激光控制和激光振镜控制两部分,程序的实现可直接使用封装好的接口函数发送命令给控制器。

太阳集团网址首页  本例采用FIBER激光器和2D激光振镜,用到下面的函数接口:

  § ZAux_Direct_MoveScanAbs:振镜轴多轴绝对直线插补SCAN运动,不带加减速过程,我们这里用来控制振镜轴运动,通过小线段的形式拟合圆形轨迹;

  § ZAux_Direct_MoveOpDelay:缓冲输出延时,提前开光时将延时时间设置为负数;

  § ZAux_Direct_MoveDelay:缓冲输出延时,我们这里用来延时关光。

太阳集团网址首页  激光功率设置:提供模拟量ZAux_Direct_SetDA、PWM的占空比ZAux_Direct_SetPwmDuty和频率ZAux_Direct_SetPwmFreq等方式控制设置振镜轴拐角处自动延时:

太阳集团网址首页  ZAux_Direct_SetCornerMode

太阳集团网址首页  1.振镜轴直线插补

  ZAux_Direct_MoveScanAbs绝对运动,ZAux_Direct_MoveScan相对运动。

运动控制

  2.设置开关光

太阳集团网址首页  输出状态为0关光,输出状态为1开光。

运动控制

  3.开关光延时

运动控制

太阳集团网址首页  4.提前/延时开关光

  正数时间延时,负数时间提前开关光。

运动控制

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

太阳集团网址首页  通过改变模拟量输出的电压值来控制激光能量大小。

运动控制

  6.PWM占空比

太阳集团网址首页  通过设置PWM的占空比来调整激光频率,在开始打轨迹之前一定要先设置好。

运动控制

  7.PWM频率

运动控制

太阳集团网址首页  8.振镜轴拐角延时

运动控制

太阳集团网址首页  9.拐角延时起始角度

运动控制

太阳集团网址首页  10.拐角延时结束角度

运动控制

太阳集团网址首页  二、程序流程

  先建立控制器通讯,获取连接句柄,激光器选择及参数设置,然后编辑红光与激光口控制开关,运动参数设置,轨迹参数进行小线段处理,开始运动,停止运动。

运动控制

运动控制

  三、主要程序展示

  初始化定义相关变量,初始化轴参数,配置好FIBER转接板的方向为输出,后续的激光轨迹加工控制由按钮触发。

太阳集团网址首页  在运动之前我们要设置好空移速度、打标速度、开关光延时、轨迹圆半径、标刻行列数、圆心距等参数。运动开始直接调用这些相关参数执行,获取完轨迹后调用3次文件执行。

  1.初始化408FIBER转换板针脚定义,不同激光器类型定义一套不同的输出口,输出口可以在选择激光器类型后对应在界面上进行修改。

太阳集团网址首页  408 FIBER转换板参数初始化程序:

  ·

太阳集团网址首页  void CZmc_fontToMoveDlg::OnCbnSelchangeComboLaser(){ // TODO: 在此添加控件通知处理程序代码 UpdateData(TRUE); if(m_nLaserType == FIBER_408) //408 FIBER转换板参数设置 { 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转换板参数设置 { 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.设置拐角延时与激光功率,再调用运动执行,程序如下。

  ·

  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); //获取轨迹数据,(0,0)为圆外接起点,5*5间距画半径为5的小圆 Cal_WorkData(m_fStartX, m_fStartY, m_nStepDis, m_nColNum, m_nRowNum, m_fRadius); Run_3FileMode();}

  3.圆弧转小线段是将我们的设置的圆弧轨迹转换为小线段存起来,然后转换后由3次文件的形式加载执行。

  圆弧转小线段程序如下:

  ·

太阳集团网址首页  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); //获取数据 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); //申请分配内存 //填写数据 int iAcr = 0; for (int icol = 0; icol < iColNum ; icol++) { for(int irow = 0 ;irow

  4.这里程序完成空移,然后移动完成之前,如果下一条运动指令执行的是轨迹运动,那么提前将激光打开。

  ·

  //空移到打标点起始点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); //判断命令长度是否发送 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); //判断命令长度是否发送 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); //判断命令长度是否发送 strcat(g_MoveStr,cmdbuff); Zscan_Z3pFile_Down();}

太阳集团网址首页  四、最终效果

太阳集团网址首页  首先点击下拉框选择控制器IP,点击连接,依次设置好激光器参数、运动参数,设置好后输入打轨迹的参数,点击运动开始打圆形轨迹,点击停止结束。

运动控制

太阳集团网址首页  通过Zdevelop软件的示波器采样运动结果:先从其他位置空移到起始位置,然后提前1ms开光,走完一个圆形轨迹,关闭激光(延时关光),再空移到下一个圆形轨迹的起点,开光(提前1ms开光),又走完一个轨迹后,关光(延时5ms关光),如此循环执行,直到设置的行列数打完停止(打轨迹中也能点击停止)。

运动控制

太阳集团网址首页  XY模式下的轨迹,轨迹包括了圆形打标轨迹和空走轨迹:

运动控制

  本次,正运动技术开放式激光振镜运动控制器:C++快速开发 ,就分享到这里。

  更多精彩内容请关注“正运动小助手”公众号,需要相关开发环境与例程代码,请咨询正运动技术销售工程师:400-089-8936。

  本文由正运动技术原创,欢迎大家转载,共同学习,一起提高中国智能制造水平。文章版权归正运动技术所有,如有转载请注明文章来源。

标签:

点赞

分享到:

上一篇:

下一篇:

中国传动网版权与免责声明:凡本网注明[来源:中国传动网]的所有文字、图片、音视和视频文件,版权均为中国传动网(sd-yilutong.com)独家所有。如需转载请与0755-82949061联系。任何媒体、网站或个人转载使用时须注明来源“中国传动网”,违反者本网将追究其法律责任。

太阳集团网址首页本网转载并注明其他来源的稿件,均来自互联网或业内投稿人士,版权属于原版权人。转载请保留稿件来源及作者,禁止擅自篡改,违者自负版权法律责任。

相关资讯

网站简介|会员服务|联系方式|帮助信息|版权信息|网站地图|友情链接|法律支持|意见反馈|sitemap

太阳集团网址首页中国传动网-工业自动化与智能制造的全媒体“互联网+”创新服务平台

Chuandong.com Copyright ©2005 - 2022 ,All Rights Reserved 版权所有 | 营业执照证书 | |

太阳集团娱乐贵宾厅-APP专业版下载 betway88必威体育-官方版APP下载 太阳城手机版下载-手机版APP下载 必威网址官方登陆网址-官方版APP下载 必威体育app官方版下载-Android下载 威尼斯人在线官网-娱乐官网登录