今天,正运动小助手给大家分享一下开放式激光振镜运动控制器:c++快速调用图形库应用,本文以二维码打标、文本打标、矢量图形打标为例,解决用户在激光打标时需要进行各种复杂的操作和函数库调用时容易出现的错误问题。
01 zmc408scan控制器介绍
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.基本规格参数
项目 描述
型号 zmc408scan
基本轴数 8(4脉冲+4振镜轴)
最多扩展轴数 16轴(轴数与系统周期和振镜周期相关)
基本轴类型 ethercat/本地脉冲轴,振镜轴
数字io数 24进20出(带过流保护),每轴端子中另外各带2路数字输入,2路数字输出,可做告警,使能,到位和误差清除等应用。
最多扩展io数 4096
pwm数 8(通用数字输出 out0-out7)+2(激光接口专用,即out8,out9)
ad/da 通用ad、da各2路;激光专用da1路,激光专用ad1路需定制。
最多扩展ad/da 1024
脉冲位数 64
编码器位数 64
速度加速度位数 64
脉冲最高频率 10m
每轴运动缓冲数 4096(缓冲数与系统周期相关)
数组空间 256万个
程序空间 128m
flash空间 256m
电源输入 24v直流输入,io口负载没有计算在内。
通讯接口 rs232,rs485,以太网,u盘,can,ethercat
外形尺寸 235mm*149mm*50mm
2.接口定义
标识 接口 个数 说明
rs232 rs232串口(port0) 1个 采用modbus_rtu协议
rs485 rs485串口(port0) 1个 采用modbus_rtu协议
ethercat ethercat总线接口 1个 ethercat总线接口,接ethercat总线驱动器和ethercat总线扩展模块
ethernet 网口 1个 采用modbus_tcp协议,通过交换机扩展网口个数,?*port查询网口通道数,默认ip地址
192.168.0.11
udisk u盘接口 1个 插入u盘设备
e+24v 主电源 1个 24v直流电源给控制器供电
can can总线接口 1个 连接can扩展模块或控制器
in 数字io输入口 24个 漏型,内部24v供电,10路高速输入,输入0-3具有锁存功能
out 数字io输出口 20个 漏型,内部24v供电,8路高速输出,输出0-7具有pwm功能,输出0-7具有精准输出和pso功能
ad 模拟量输入口 2个 分辨率12位,0-10v
da 模拟量输出口 2个 分辨率12位,0-10v
axis 脉冲轴接口 4个 每个接口包含差分脉冲输出和差分编码器输入
mpg 手轮接口 1个 5-24v手轮信号输入
scan 激光振镜接口 2个 激光振镜接口,带反馈,采用xy2-100协议
laser 激光器接口 1个 激光电源控制端口,支持ipg、ylr、yls等类型激光电源
exio 扩展io接口 1个 灵活定制转接板,可扩展 spi、fiber、yag等其它类型激光电源控制接口
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] = '�'; 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.二维码打标界面
二、文本打标
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;}
三、矢量图形打标
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); //绘图 }}
本次,正运动技术开放式激光振镜运动控制器:c++快速调用图形库应用,就分享到这里。
DNA存储问世 基因芯片或成未来发展方向
欧洲近年来开始明确动力电池制造的布局 决定建立欧洲第二个电池产业联盟
如何挑选无线收发模块和RF无线收发模块的外壳屏蔽罩
一款黑科技时代下的健身神器,健身房智能镜子来袭
国产光刻机加快研发 有望打破垄断格局
开放式激光振镜运动控制器:C++快速调用图形库应用
基于计算机网络技术和地理空间技术的林火预测预报、监控系统
江智室外非道路场景用机器人
设计2层板,你需要记住如下7个设计规则
安森美半导体实现高通QC3.0的完整方案
三星量产全新LPDDR5 DRAM芯片 支持5G和AI功能
意法半导体推出全新入门级32位STM32 MCU系列
工业4.0:如何锤炼中国的工业级模拟芯片
深康佳A:拟参与建设半导体产业园,力争建设期内总投入300亿元
物联网企业,开始做信创的生意
NOMA物联网通信的能耗最小化问题
骁龙710和骁龙730的规格资料,弥补了骁龙600和骁龙800之间的差距
在人工智能时代 FPGA必将在更多应用领域得到更加广泛的使用
Windows 10系统iso镜像发布
基于PC/104总线的旋转变压器电路设计