中国自动化学会专家咨询工作委员会指定宣传媒体
文摘详情
gkongbbs

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

http://www.gkong.com 2024-10-08 09:38 深圳市正运动技术有限公司

001.gif

前面课程我们讲述了如何通过Ubuntu+Qt进行振镜校正(详情点击→开放式激光振镜运动控制器在Ubuntu+Qt下的激光振镜校正),本节自定义图形标刻是在振镜校正的前提下实现的。在正式学习之前,我们先了解一下正运动技术的ZMC408SCAN-V22运动控制器,ZMC408SCAN-V22支持在Linux环境进行开发使用。



 

01 ZMC408SCAN-V22硬件介绍

ZMC408SCAN-V22是正运动技术推出的高性能双振镜运动控制器,集成了2个百兆以太网口,支持EtherCAT、EtherNET、CAN、RS232、RS485、24路通用数字输入、20路通用数字输出、2路通用模拟量输出、2路通用模拟量输入、4个本地差分脉冲轴接口、1个MPG手轮编码器接口、2个带反馈振镜接口、1个LASER激光专用接口、1个FIBER激光器接口。开放式系统框图如下所示:

1.png

ZMC408SCAN-V22总线控制器支持EtherCAT总线连接,支持最快500μs的刷新周期,支持最多达16轴运动控制,支持直线插补、任意圆弧插补、空间圆弧、螺旋插补、电子凸轮、电子齿轮、同步跟随、虚拟轴设置等;采用优化的网络通讯协议可以实现实时的运动控制。

2.png

ZMC408SCAN-V22通过CAN、EtherCAT总线可以连接各个扩展模块,从而扩展数字量、模拟量或运动轴。可以在 Windows,Linux,Mac,Android,Wince各种操作系统下开发,提供vc,c#,vb.net,labview等各种环境的dll库。上位机软件编程参考《ZMotion PC函数库编程手册》。

3.png

02 Ubuntu+Qt进行自定义图形标刻项目的开发

1.在Qt Creator菜单选择“文件”→“新建文件或项目...”,打开创建项目向导。选择Application项目集,创建Qt Widgets Application项目,设置项目名称和保存位置。

4.png

2.导入厂家提供的相关函数库及头文件。

(1) 将zmotion.h和zmcaux.h、zmcaux.cpp以及libzmotion.so库复制到新建的项目文件夹中。

5.png

(2) 在Qt Creator选择新建的Qt项目右击选择“添加库...”→“外部库”点击下一步,将刚才复制到项目文件夹上的libzmotion.so库文件导入到项目中。

6.png

(3) 在Qt Creator下右击新建的Qt项目,选择“添加现有文件...”,将之前复制到项目文件下的头文件zmotion.h以及zmcaux.cpp和zmcaux.h添加到项目中。

7.png

(4) 函数库添加成功后,打开pro文件可以看到相关的函数库和头文件信息。此时已经将例程需要用到的函数库和头文件都加入到项目中了,接下来开始实现例程。

8.png

03 自定义图形标刻流程以及相关函数介绍

1.自定义图形标刻流程图

9.png

2.相关函数介绍

(1)连接控制器


10.png

(2)通用命令执行接口


11.png

(3)三次文件初始化


12.png

(4)生成空移字符串


13.png

(5)生成开光字符串


14.png

(6)生成关光字符串


15.png

(7)生成标刻点字符串


16.png

(8)下载三次文件


17.png

(9)设置输出口状态


18.png

(10)设置模拟量输出


19.png

(11)设置pwm占空比


20.png

(12)设置pwm频率


21.png

04 自定义图形标刻的实现例程

自定义图形标刻例程主要是通过选择简单图形来生成标刻的三次文件,控制器运行三次文件标刻对应的图形,例程中的三次文件主要通过字符串追加的形式生成,在将所有图形的绘制过程生成三次文件后下载到控制器即可。

1.建立控制器连接,设置相关的振镜和工艺参数,可以通过设置模拟量口和pwm以及激光器使能信号,可以打开或者关闭激光。

void MainWindow::on_ip_open_clicked()
{
    char * tmp_buff = new char[16];
    QString str = ui->ip_Address->text();
    QByteArray ba = str.toLatin1();
    tmp_buff = ba.data();
    if(0 != g_handle)
    {
        ZAux_Close(g_handle);
    }
    int32 iresult= ZMC_FastOpen(ZMC_CONNECTION_ETH,tmp_buff,1000,&g_handle);
    if( 0 != iresult)
    {
        QMessageBox::warning(this,"提示","连接失败");
        return;
    }
    ZAux_Direct_SetDA(g_handle,markPara.PowerDA,markPara.Power);   //设置模拟量
    ZAux_Direct_SetPwmDuty(g_handle,markPara.PwmIo,0.5);   //设置占空比
    ZAux_Direct_SetPwmFreq(g_handle,markPara.PwmIo,markPara.PwmFreq);   //设置频率
    ZAux_Direct_SetOp(g_handle,io_value.emit_io,0);   //关闭激光输出口
    ZAux_Direct_SetOp(g_handle,io_value.enable_io,0);  //关闭激光器使能
}

2.生成初始化的三次文件字符串

可以将标刻过程中初始化的部分写到相关的函数里面,包括设置初始化的激光器参数、标刻起点、延时参数等,方便在标刻自定义图形的过程中直接使用。三次文件字符串本质是将basic指令进行拼接处理,将所有指令拼接完成后,可以直接写入控制器中执行。

void MainWindow::LaserScan_z3p_Init()
{
    strFile3.clear();
    strFile3 += QString("BASE(%1,%2)\n").arg(4).arg(5); //设置轴号
    strFile3 += "ATYPE = 21,21\n"; //设置轴类型
    strFile3 += "UNITS = 100,100\n"; //设置脉冲当量
    strFile3 += "AXIS_ZSET = 3,3\n"; // 开启精准输出
    strFile3 += "MERGE = 1,1\n"; //开启连续插补
    strFile3 += QString("OP(%1,ON)\n").arg(io_value.enable_io);
    strFile3+=QString("MOVE_AOUT(%1,%2)\n").arg(markPara.PowerDA).arg(static_cast(markPara.Power * 255 / 100));           
    strFile3+=QString("MOVE_PWM(%1,0.5,%2)\n").arg(markPara.PwmIo).arg(markPara.PwmFreq);
    strFile3 +=QString("DECEL_ANGLE= %1,%2\n").arg(15.0/180.0*M_PI).arg(15.0/180.0*M_PI);
    strFile3 += QString("STOP_ANGLE = %1,%2\n").arg(90.0/180.0*M_PI).arg(90.0/180.0*M_PI);
    strFile3 += QString("ZSMOOTH= %1,%2\n").arg(markPara.CorDelay).arg(markPara.CorDelay); //拐角延时时间
    strFile3 += QString("FORCE_SPEED = %1\n").arg(markPara.JumpSpeed); //空移速度
    strFile3 += "MOVESCANABS(0,0)\n"; //移动到 0 位
}

3.生成标刻自定义图形的三次文件字符串

自定义图形本质上可以分解为线段进行绘制,在进行激光标刻时也是采用线段的形式,在生成自定义图形时,只需要控制每一条线段的起始点和结束点位置,同时在起始点和结束点的位置控制延时参数,最后在完成绘制时关闭激光和使能即可。下面是部分生成三次文件字符串以及下载的代码。

void MainWindow::on_create_File3_clicked()
{
    LaserScan_z3p_Init(strFile3);
    ListNode *ps = layers->next;
    do
    {
        Coordinate * pData = ps->data;
        if(ps->type == 1)//标刻点
        {
            LaserScan_z3p_EmptyMove(strFile3,pData->next->x,pData->next->y,markPara.JumpSpeed,markPara.JumpDelay);
            LaserScan_z3p_OpenLight(strFile3,io_value.emit_io,markPara.OpenDelay,markPara.MarkSpeed);
            LaserScan_z3p_MarkPoint(strFile3,pData->next->x,pData->next->y);
            LaserScan_z3p_CloseLight(strFile3,io_value.emit_io,markPara.CloseDelay,markPara.JumpDelay);
        }
        else if(ps->type == 2)//标刻直线
        {
            LaserScan_z3p_EmptyMove(strFile3,pData->next->x,pData->next->y,markPara.JumpSpeed,markPara.JumpDelay);
            LaserScan_z3p_OpenLight(strFile3,io_value.emit_io,markPara.OpenDelay,markPara.MarkSpeed);
            LaserScan_z3p_MarkPoint(strFile3,pData->next->x2,pData->next->y2);
            LaserScan_z3p_CloseLight(strFile3,io_value.emit_io,markPara.CloseDelay,markPara.JumpDelay);
         }
        else if(ps->type == 3)//标刻圆弧
        {
            LaserScan_z3p_Arc(pData->next->x + ps->radius,pData->next->y - ps->radius,ps->radius,ps->angle,ps->radian,0,0);
        }
        else if(ps->type == 4)//标刻整圆
        {
            LaserScan_z3p_Arc(pData->next->x + ps->radius,pData->next->y - ps->radius,ps->radius,0,360,0,0);
        }
        ......        //标刻其他类型
        ps = ps->next;
    }while(ps != layers);
}

4.设置运行任务号,启动任务进行标刻

三次文件已经下载到控制器中,这个时候可以通过ZMC_Execute函数输入命令去运行生成的三次文件,完成图形的标刻。下面的启动任务,进行标刻的部分实现代码。

void MainWindow::on_but_Mark_clicked()
{
    if( 0 == g_handle)
    {
        QMessageBox::warning(this,"提示","控制器未连接!");
        return;
    }
    QString Cmd;
    char Response[1024];
    //设置启动任务号,执行Zmc_polyline.z3p
    ZMC_Execute(g_handle,"FILE3_RUN  \"Zmc_polyline.z3p\",7 ",500,Response,1024);
}

5.设置配置文件信息,保留配置参数

通过生成ini配置文件信息,在程序加载时读取文件,程序关闭时将配置数据写到ini配置文件中,以此实现保留最后一次的使用参数,方便下一次加载使用。通过使用内部函数库QSettings实现的,下面是部分的实现代码。

void MainWindow::saveINI()
{
    //保存配置数据信息
    QSettings *iniWrite = new QSettings("config.ini",QSettings::IniFormat);
    iniWrite->setValue("laserType",ui->laser_List->currentIndex());
    .....
    delete iniWrite;
}
void MainWindow::readINI()
{
    //读取配置文件数据
    QSettings *iniRead = new QSettings("config.ini",QSettings::IniFormat);
    int laserType = iniRead->value("laserType").toInt();
    ui->laser_List->setCurrentIndex(laserType);
    .....
    delete iniRead;
}

05 自定义图形标刻的实现效果

1. 打开Qt绘制的基本图形界面,设置基本的激光器参数和运动参数。

22.png

2. 添加想要标刻的自定义图形,设置图形参数,选择添加图形,例程中添加的图形为点、矩形、整圆、圆弧、直线,点击生成三次文件后,查看三次文件的内容。

23.png

3. 点击标刻即可完成已选自定义图形的标刻。

4.分析生成的三次文件信息,下面是生成三次文件的部分内容,三次文件的开头都是对轴参数加工参数的设置,当移动到运动起始点时,设置开光参数和延时参数,在轨迹完成时设置关光延时和关光操作。

BASE(4,5)
ATYPE = 21,21
UNITS = 100,100
AXIS_ZSET = 3,3
MERGE = 1,1
OP(47,ON)
MOVE_AOUT(3,127)
MOVE_PWM(11,0.5,4000)
DECEL_ANGLE = 0.261799,0.261799
STOP_ANGLE = 1.5708,1.5708
ZSMOOTH = 1000,1000
FORCE_SPEED = 1000
MOVESCANABS(0,0)
FORCE_SPEED = 1000
MOVESCANABS(0.00000,0.00000)
MOVE_DELAY(0.2,1)
FORCE_SPEED = 500
MOVEOP_DELAY = -0.1
MOVE_OP(44,ON)
MOVESCANABS(0.00000,0.00000)
MOVEOP_DELAY = 0
MOVE_DELAY(1)
MOVE_OP(44,OFF)
FORCE_SPEED = 1000
MOVESCANABS(-5.00000,5.00000)
MOVE_DELAY(200,1)
FORCE_SPEED = 500
MOVEOP_DELAY = -0.1
MOVE_OP(44,ON)
MOVESCANABS(5.00000,5.00000)
MOVESCANABS(5.00000,-5.00000)
MOVESCANABS(-5.00000,-5.00000)
MOVESCANABS(-5.00000,5.00000)
MOVEOP_DELAY = 0
MOVE_DELAY(1)
MOVE_OP(44,OFF)

06 激光标刻过程

激光标刻的过程,初始化、空移、开光、标刻、关光都封装成函数接口,在进行标刻时,调用相关的函数接口即可生成对应的三次文件字符串。

24.png

完整代码获取地址

25.png

本次,正运动技术开放式激光振镜运动控制器在Ubuntu+Qt下自定义图形标刻,就分享到这里。

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

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

企业微信截图_20240321153031.png

正运动技术专注于运动控制技术研究和通用运动控制软硬件产品的研发,是国家级高新技术企业。正运动技术汇集了来自华为、中兴等公司的优秀人才,在坚持自主创新的同时,积极联合各大高校协同运动控制基础技术的研究,是国内工控领域发展最快的企业之一,也是国内少有、完整掌握运动控制核心技术和实时工控软件平台技术的企业。

版权所有 中华工控网 Copyright©2024 Gkong.com, All Rights Reserved