今天,正运动技术为大家分享一下应用zmc408scan开放式激光振镜运动控制器的c++开发,实现激光振镜打标 ,可在文章末尾扫码获取例程源码。
除了c++还支持使用其他上位机软件来开发,上位机程序运行时需要动态库“zmotion.dll”,上位机开发调试时可以把zdevelop软件同时连接到控制器辅助调试。
01 zmc408scan控制器介绍
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 = %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 = 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,点击连接,依次设置好激光器参数、运动参数,设置好后输入打轨迹的参数,点击运动开始打圆形轨迹,点击停止结束。
通过 z develop 软件的示波器采样运动结果:先从其他位置空移到起始位置,然后提前 1ms 开光,走完一个圆形轨迹,关闭激光(延时关光),再空移到下一个圆形轨迹的起点,开光(提前 1ms 开光) , 又走完一个轨迹后,关光(延时 5ms 关光),如此循环执行,直到设置的行列数打完停止(打轨迹中也能点击停止)。
xy模式下的轨迹,轨迹包括了圆形打标轨迹和空走轨迹:
本次,正运动技术开放式激光振镜运动控制器:c++快速开发 ,就分享到这里。
载具自动回流线
天数智芯与南京未来网络合作 共同探索新型算力基础设施建设方案
大唐恩智浦荣获“车规级模拟类芯片优质供应商”荣誉称号
AI深陷“亏损门”,人工智能产业化路在何方?
基于专用开关芯片TL494实现开关电源的设计及应用
开放式激光振镜运动控制器:C++快速开发
USB 3.0投屏芯片的功能特征介绍
【创龙科技】最全的TI、Xilinx、NXP工业核心板汇总!
讨论游戏Emoji Scavenger Hunt的内部运作方式
华进公司成为无锡市智能传感器产业知识产权联盟理事单位
全员参与,把质量管理纳入企业日常工作!
快讯:全球首富辞职 快手将于2月5日在香港上市 天才少年曹原再发Nature
欧胜推出多通道音频编码解码器WM8595
全面体验,音质升级,这款不入耳耳机你见过吗?
华普微成为CSA联盟Participants 级别正式会员
中科曙光金融联合实验室正式成立
张小军:视+AR平台系统部署解决方案,并且要成为最好的AR开放平台
铠装热电偶与一般热电偶区别
诺基亚9PureView被曝能用口香糖解锁
传统船检已经过时?AR智慧船检来助力!!