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

news2024/11/20 6:31:34

今天,正运动小助手给大家分享一下开放式激光振镜运动控制器: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.基本规格参数
在这里插入图片描述

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;iAxis<=5;iAxis++)
    {
        iresult = ZAux_Direct_SetAtype(m_Handle,iAxis,21);
        iresult = ZAux_Direct_SetUnits(m_Handle,iAxis,500);
    }
    OnCbnSelchangeComboLaser();
}
//断开控制器
void CZmc_laserDlg::OnBnClickedBtnClose()
{
    if(NULL != m_Handle)
    {
        KillTimer(0);            //关定时器
        ZAux_Close(m_Handle);
        m_Handle = NULL;
        SetWindowText("未链接");
    }
}

3.选择激光器类型

通过指令ZAux_SetExioType(ZMC_HANDLE handle,int iType)设定转接板类型,不同的转接板类型对应不同类型的激光器(需定制)。

使用时我们只需要选择对应的激光器类型,并按照对应接口接好线,调节好功率(激光能量)、频率。

在这里插入图片描述

程序如下:

//修改激光器类型
void CZmc_laserDlg::OnCbnSelchangeComboLaser()
{
    if(NULL == m_Handle)
    {
        MessageBox(_T("控制器未连接"));
        return;
    }
    UpdateData(TRUE);
    if(m_nLaserType == FIBER_408)          //408 FIBER转换?板参数设置
    {
        int iret = ZAux_SetExioType(m_Handle,0);
        m_nEnableIO = 47;
        m_nLaserIO = 8;
        m_nRedIO = 48;
        m_nAout = 3;
        m_nPwmIo = 9;
    }
    else if(m_nLaserType == LASER_408)
    {
        int iret = ZAux_SetExioType(m_Handle,-1);
        m_nEnableIO = 31;
        m_nLaserIO = 8;
        m_nRedIO = 32;
        m_nAout = 2;
        m_nPwmIo = 9;
    }
    else if(m_nLaserType == YAG_408)          //408 YAG转换板参数设置
    {
        int iret = ZAux_SetExioType(m_Handle,1);
        m_nEnableIO = 47;
        m_nLaserIO = 8;
        m_nRedIO = 48;
        m_nAout = 3;
        m_nPwmIo = 9;
    }
    else if(m_nLaserType == FIBER_504)              //504
    {
        m_nEnableIO = 5;
        m_nLaserIO = 6;
        m_nRedIO = 28;
        m_nAout = 2;
        m_nPwmIo = 7;
    }
    UpdateData(FALSE);
}

4.设置运动参数和二维码大小参数

将运动参数及填充工艺参数存到变量里面,在后面打标过程中调用此参数,现在这个值是一个初始化值,只是一个参考作用,具体参数还要通过测试调整后才能更适合相应机台及打标加工,空移速度为后续打标轨迹中空走轨迹所用速度。

开关光延时是用于提前开光和延时关光,设置适当的开光延时参数可以去除在运动起点出现的 “火柴头”,但如果开光延时参数设置太大则会导致起始段缺笔的现象。

可以通过ZAux_Direct_MoveOpDelay设置为负值,负值标刻激光器提前出光。一般光纤激光器的开光延时就是设置负值,而其他激光器,如端泵激光器是设置正值的。

设置适当的关光延时参数可以去除在运动结束时出现的不闭合现象,但如果关光延时设置太大会导致结束段出现“火柴头”。

关光指令后调用指令ZAux_Direct_MoveDelay设置对应的延时时间实现延时控制。

设置适当的拐角延时参数可以去除在运动轨迹是直角时出现的圆角现象,但如果拐角延时设置太大会导致标刻时间增加,且拐角处有重点现象,为解决这一问题,引入拐角自动延时模式,根据拐角角度计算延时时间。

调用指令ZAux_Direct_SetCornerMode设置拐角延时模式为2,通过 ZAux_Direct_SetDecelAngle与ZAux_Direct_SetStopAngle设置拐角开始延时和结束延时角度、ZAux_Direct_SetZsmooth设置最大拐角延时时间。

在这里插入图片描述

实际的拐角延时则依据轨迹的实际角度自动计算对应拐角延时时间,在设定的角度范围内,延时时间呈线性分布。

在这里插入图片描述

程序如下:

CZmc_laserDlg::CZmc_laserDlg(CWnd* pParent /*=NULL*/)
    : CDialogEx(CZmc_laserDlg::IDD, pParent)
{
    m_hIcon = AfxGetApp()->LoadIcon(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 <= WinWidth*ObjectHeight)
        {
            ObjectPixHeight = WinHeight;
            ObjectPixWidth = ObjectPixHeight *ObjectWidth/ObjectHeight;
        }
        else
        {
            ObjectPixWidth = WinWidth;
            ObjectPixHeight = ObjectPixWidth *ObjectHeight/ObjectWidth;
        }
        double dUnitsPerMm = ObjectPixHeight/ObjectHeight; //每MM的显示点数
        CPoint ZeroPoint;
        ZeroPoint.x = (rectClient.Width()-ObjectPixWidth)/2 ;
        ZeroPoint.y = (rectClient.Height()-ObjectPixHeight)/2 ;
        dc->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++快速调用图形库应用,就分享到这里。

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/29228.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

牛客网语法篇练习复合类型(一)

1.试计算在区间1 到n 的所有整数中&#xff0c;数字x&#xff08;0 ≤ x ≤ 9&#xff09;共出现了多少次&#xff1f; 例如&#xff0c;在1到11 中&#xff0c;即在1、2、3、4、5、6、7、8、9、10、11 中&#xff0c;数字1 出现了4 次。 n,x list(map(int,input().split())) …

CSS的两种渐变

线性渐变和径向渐变 几个常见的例子效果 <!DOCTYPE html> <html><head><meta charset"utf-8"><title></title><style>.a{font-size: 20px;width: 100%;height: 50px;margin: 10px;background-image: linear-gradient(r…

应急监管双重预防机制数字化管理解决方案

新《安全生产法》&#xff0c;将组织建立并落实双重预防工作机制写入生产经营单位主要负责人职责中&#xff0c;双重预防机制建设已上升到法律的高度。2021 年 12 月 31 日国务院安委会印发《全国危险化学品安全风险集中治理方案》&#xff0c;将推进基于信息化的危险化学品企业…

大二Web课程设计——海贼王中乔巴专题漫画(可以很好的应付老师的作业)HTML+CSS

HTML实例网页代码, 本实例适合于初学HTML的同学。该实例里面有设置了css的样式设置&#xff0c;有div的样式格局&#xff0c;这个实例比较全面&#xff0c;有助于同学的学习,本文将介绍如何通过从头开始设计个人网站并将其转换为代码的过程来实践设计。 精彩专栏推荐&#x1f4…

Baklib帮助中心|如何设置好客户服务帮助您的客户?

在如今这个高度智能化的时代&#xff0c;很多人已经习惯了靠自己解决问题&#xff0c;所以当人们浏览网页、使用某件商品时&#xff0c;首先想到的不是客户服务&#xff0c;而是服务中心。 那么&#xff0c;您如何设计帮助中心帮助您的客户&#xff1f;这是大多数公司希望解决…

工程项目管理的主要内容都是什么?

工程项目资金管理组织工作主要就文本是什么&#xff1f; 1&#xff0e;物业公司的资金管理组织工作&#xff08;工程建设建筑工程&#xff09; 物业公司的资金管理组织工作是全过程的&#xff0c;主要就包括工程项目重大决策和实行期的全过程&#xff0c;也即从基本建设工程项…

【图文教程】Centos 7下安装Hadoop

环境说明&#xff1a; 系统&#xff1a;Centos7 在VM中安装的 hadoop版本&#xff1a;2.7.7 JDK&#xff1a;1.8 注意&#xff1a;Hadoop需要Java环境的。记得安装Java环境 PS&#xff1a;Centos JDK安装 mkdir /data1&#xff1a;上传jdk的tar.解压 2&#xff1a;修改/e…

vulntarget-b靶场详细通关记录

vulntarget-b靶场详细通关记录 前言 这个靶场打了好几天才打下来&#xff0c;在上线msf和免杀过火绒还有psexec横向移动卡中了很久。而且这个靶场的通关资料较少&#xff0c;吐槽一下网上的相关文章很多关键步骤都不写而且复现不成功。以下将记录个人通关vulntarget-b靶场的详…

简述二进制码、十进制码、BCD码、十六进制码转换的算法

进制转换简述二进制码、十进制码、BCD码、十六进制码转换的算法把四字节 BCD 码 5287 转换为十六进制码 14A7H简述二进制码、十进制码、BCD码、十六进制码转换的算法 ①二进制转十进制&#xff1a;把二进制的“1”&#xff0c;从右边第一个开始按2的1次方&#xff0c;2的2次方…

如何使用轻量应用服务器自带的Cloudreve应用镜像搭建属于自己的云网盘?

Cloudreve是一款开源的网盘软件&#xff0c;支持服务器本机、腾讯云COS等多种存储方式&#xff0c;提供离线下载、拖拽上传、在线预览等功能&#xff0c;可以帮助用户快速搭建个人或多人使用的网盘系统。腾讯云轻量应用服务器 Cloudreve应用镜像集合了Cloudreve、Nginx、MariaD…

【Tensorboard】工具使用细节记录,实现训练数据保存及可视化

目录 1 导入tensorboard-前提安装tensorboard&#xff01; 2 确定存储位置 3 作为预训练参数加载函数 4 调用加载函数 5 保存训练模型参数 6 tensorboard可视化-环境&#xff1a;ubuntu 【学习资源】from torch.utils.tensorboard import SummaryWriter导入不成功问题_…

[附源码]计算机毕业设计JAVA考研部落

[附源码]计算机毕业设计JAVA考研部落 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven…

算法刷题—树

1.什么是树 1.1树的概念 树(Tree)是n(n>0)个节点的有限集,n0称为空树。 在任意一个棵非空树中: 1.有且仅有一个特定的称为根(Root)的结点; 2.当n>1时,其余节点可以分为m个(m>0)互不相交的T1,T2.....Tm其中每一个集合本身也是一课树并且称为根的子树(SubTree) 注: 在一…

分布式文件存储系统minio

结构化数据&#xff1a;也称作行数据&#xff0c;是由二维表结构来逻辑表达和实现的数据&#xff0c;严格地遵循数据格式与长度规范&#xff0c;主要通过关系型数据库进行存储和管理。 特点&#xff1a;高度组织化和格式化&#xff0c;可以用二维表结构来逻辑表达和实现的数据…

5 - 1 判断题

1.一棵有124个结点的完全二叉树&#xff0c;其叶结点个数是确定的。T 什么是完全二叉树&#xff1f;&#xff08;会的可以跳过&#xff09; 完全二叉树&#xff1a;一棵深度为k的有n个结点的二叉树&#xff0c;对其结点按从上至下&#xff0c;从左至右的顺序进行编号&#xff…

学习大数据需要具备什么基础么?

Python优势明显&#xff0c;应用领域超多 如果要推荐一种人人都能掌握的编程语言&#xff0c;应该没有比Python更合适的了。 Python 简单易学&#xff0c;用途广泛&#xff0c;适合零基础入门&#xff0c;在编程语言排名上升最快&#xff0c;能完成数据挖掘、机器学习、实时计…

SpringBoot SpringBoot 开发实用篇 5 整合第三方技术 5.25 RocketMQ 安装

SpringBoot 【黑马程序员SpringBoot2全套视频教程&#xff0c;springboot零基础到项目实战&#xff08;spring boot2完整版&#xff09;】 SpringBoot 开发实用篇 文章目录SpringBootSpringBoot 开发实用篇5 整合第三方技术5.25 RocketMQ 安装5.25.1 RocketMQ 下载5.25.2 安装…

眼见为实:关于微服务熔断这几个知识点,你可能理解错了

“ 微服务熔断&#xff0c;是当微服务中某个子服务&#xff0c;发生异常不可用&#xff0c;其他服务在进行远程调用时不能正常访问而一直占用资源&#xff0c;导致正常的服务也发生资源不能释放而崩溃&#xff0c;这时为了不造成整个微服务群瘫痪&#xff0c;进行的保护机制” …

漏洞分析|Apache Airflow Pinot Provider 命令注入漏洞

项目介绍 Airflow 是一个使用 python 语言编写的 data pipeline 调度和监控工作流的平台。Airflow 是通过 DAG&#xff08;Directed acyclic graph 有向无环图&#xff09;来管理任务流程的任务调度工具&#xff0c; 不需要知道业务数据的具体内容&#xff0c;设置任务的依赖关…

【头歌实验】四、Python分支结构

文章目录>>>第1关&#xff1a;判断闰年任务描述案例分析相关知识条件表达式分支语句测试说明参考答案>>>第2关&#xff1a;计算快递费用任务描述案例分析相关知识分支结构向上取整的函数ceil测试说明参考答案>>>第3关&#xff1a;成绩等级判定任务描…