0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

正运动技术 来源:正运动技术 作者:正运动技术 2022-10-19 09:04 次阅读

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

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


01 ZMC408SCAN控制器介绍

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

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

poYBAGNOh2iAeAwQAAJpd9hSaJ0707.png

(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开放式激光 控制器的参考架构,支持多种不同类型的激光器控制。

poYBAGNOh8GAL6DdAANF5e9R_88514.png

03 上位机和控制器通讯

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

poYBAGNOh_-ASXUaAAEnlGcw86E325.png

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

poYBAGNOiBSAXijHAABMk0yZhgw686.png

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相对运动。

pYYBAGNOiGWAUCaEAABI5w9R7Gs860.png

2.设置开关光

输出状态为0关光,输出状态为1开光。

poYBAGNOiI2AAD6JAABLCwf5q7I209.png

3. 开关光延时

poYBAGNOiJaALrDkAABDoi8L2dM677.png

4. 提前/延时开关光

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

poYBAGNOiKWAciZMAABRmIgEQcE646.png

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

通过改变模拟量输出的电压值来控制激光能量大小。

poYBAGNOiK6AVQXtAAA5T9J0bs4866.png

6. PWM占空比

通过设置 PWM 的占空比来调整激光频率,在开始打轨迹之前一定要先设置好。

pYYBAGNOiLeAGZg5AABXCTy6Xdk057.png

7. PWM频率

pYYBAGNOiMGASP3zAAA-kGZS5ZQ763.png

8. 振镜轴拐角延时

poYBAGNOiMqAdGZAAABw5ilQYp4861.png

9. 拐角延时起始角度

poYBAGNOiNKAO8ycAAEYYsfnA_I821.png

10. 拐角延时结束角度

pYYBAGNOiNuAEDiSAAEVC1_jrD0949.png

二、程序流程

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

poYBAGNOiQmABGnJAABfVpC4ci8835.pngpYYBAGNOiRGAJsCtAADNZGfB-2M457.png

三、主要程序展示

初始化定义相关变量,初始化轴参数,配置好 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 = %fn",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 = %fn",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 = %fn",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 = %fn",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 = 0nMOVE_DELAY(%f)n",m_nLastDelay/1000);
       strcat(cmdbuff, tempbuff);
   }
   else
   {
       sprintf(tempbuff, "MOVEOP_DELAY = %fn",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,点击连接,依次设置好激光器参数、运动参数,设置好后输入打轨迹的参数,点击运动开始打圆形轨迹,点击停止结束。

poYBAGNOjXyALsXEAADQwKGVhcc429.png

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

pYYBAGNOjYSAT77HAAC7Aq0C_pI435.png

XY模式下的轨迹,轨迹包括了圆形打标轨迹和空走轨迹:

poYBAGNOjYqACUSkAACZNSCV1zg940.png

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

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 控制器
    +关注

    关注

    112

    文章

    15998

    浏览量

    176343
  • C++
    C++
    +关注

    关注

    21

    文章

    2088

    浏览量

    73381
  • EtherCAT总线
    +关注

    关注

    5

    文章

    68

    浏览量

    5354
收藏 人收藏

    评论

    相关推荐

    ZMC408SCAN控制光纤激光器加工

    ZMC408SCAN是正运动技术新推出的一款支持EtherCAT总线的开放式激光运动
    的头像 发表于 09-14 14:16 1525次阅读
    ZMC408SCAN<b class='flag-5'>振</b><b class='flag-5'>镜</b><b class='flag-5'>控制</b>光纤<b class='flag-5'>激光器</b>加工

    开放式激光运动控制器在Ubuntu+Qt下自定义图形标刻

    开放式激光运动控制器在Ubuntu+Qt下自定义图形标刻
    的头像 发表于 10-08 10:45 456次阅读
    <b class='flag-5'>开放式</b><b class='flag-5'>激光</b><b class='flag-5'>振</b><b class='flag-5'>镜</b><b class='flag-5'>运动</b><b class='flag-5'>控制器</b>在Ubuntu+Qt下自定义图形标刻

    激光运动控制系统开发

    激光 运动控制 技术是将
    发表于 07-06 18:13 366次下载
    <b class='flag-5'>激光</b><b class='flag-5'>振</b><b class='flag-5'>镜</b><b class='flag-5'>运动</b><b class='flag-5'>控制系统开发</b>

    开放式激光+运动控制器(五):ZMC408SCAN控制器

    轴设置等;采用优化的网络通讯协议可以实现实时的运动控制。ZMC408SCAN总线控制器支持脉冲轴/总线轴/轴混合插补。
    发表于 03-03 14:45 2048次阅读
    <b class='flag-5'>开放式</b><b class='flag-5'>激光</b><b class='flag-5'>振</b><b class='flag-5'>镜</b>+<b class='flag-5'>运动</b><b class='flag-5'>控制器</b>(五):ZMC408SCAN<b class='flag-5'>控制器</b>

    激光运动控制器(一):ZMC408SCAN接口与功能

    ZMC408SCAN是正运动技术新推出的一款支持EtherCAT总线的开放式激光运动
    的头像 发表于 08-01 15:03 2947次阅读
    <b class='flag-5'>激光</b><b class='flag-5'>振</b><b class='flag-5'>镜</b><b class='flag-5'>运动</b><b class='flag-5'>控制器</b>(一):ZMC408SCAN接口与功能

    应用ZMC408SCAN开放式激光运动控制器C++开发

    今天,正运动技术为大家分享一下应用ZMC408SCAN开放式激光运动
    的头像 发表于 10-24 11:26 1595次阅读

    ZMC408SCAN控制光纤激光器加工的方法

    ZMC408SCAN是正运动技术新推出的一款支持EtherCAT总线的开放式激光运动
    的头像 发表于 10-26 17:32 1877次阅读

    开放式激光运动控制器C++矫正方法与实现

    ZMC408SCAN是正运动技术新推出的一款支持EtherCAT总线的开放式激光运动
    的头像 发表于 10-27 09:02 1803次阅读
    <b class='flag-5'>开放式</b><b class='flag-5'>激光</b><b class='flag-5'>振</b><b class='flag-5'>镜</b><b class='flag-5'>运动</b><b class='flag-5'>控制器</b>:<b class='flag-5'>C++</b><b class='flag-5'>振</b><b class='flag-5'>镜</b>矫正方法与实现

    开放式激光运动控制器ZMC408SCAN进行矫正的方法与实现

    ZMC408SCAN是正运动技术新推出的一款支持EtherCAT总线的开放式激光运动
    的头像 发表于 10-31 17:56 1672次阅读

    运动激光运动控制器ZMC408SCAN用户手册

    ZMC408SCAN 激光运动控制器是正运动技术推出的高性能总线双
    发表于 04-11 14:22 3次下载

    ZMC420SCAN激光运动控制器用户手册

    ZMC 是正运动技术推出的网络运动控制器型号简称。 ZMC4 系列支持正运动 XPLC 的功能,可以通过网络来做组态显示。 ZMC420SCAN 系列
    发表于 04-11 14:28 3次下载

    运动控制器激光控制

    激光运动控制系统中不但有运动控制,还有
    的头像 发表于 09-26 11:44 1918次阅读
    <b class='flag-5'>运动</b><b class='flag-5'>控制器</b><b class='flag-5'>激光</b><b class='flag-5'>振</b><b class='flag-5'>镜</b><b class='flag-5'>控制</b>

    开放式激光运动控制器激光清洗应用

    开放式激光运动控制器激光清洗解决方案。
    的头像 发表于 07-18 09:44 206次阅读
    <b class='flag-5'>开放式</b><b class='flag-5'>激光</b><b class='flag-5'>振</b><b class='flag-5'>镜</b><b class='flag-5'>运动</b><b class='flag-5'>控制器</b>的<b class='flag-5'>激光</b>清洗应用

    开放式激光运动控制器在Ubuntu+Qt下CAD图形标刻

    开放式激光运动控制器再Ubuntu+Qt下CAD图形标刻
    的头像 发表于 09-18 15:12 151次阅读
    <b class='flag-5'>开放式</b><b class='flag-5'>激光</b><b class='flag-5'>振</b><b class='flag-5'>镜</b><b class='flag-5'>运动</b><b class='flag-5'>控制器</b>在Ubuntu+Qt下CAD图形标刻