开放式激光振镜+运动控制器(二):振镜填充

点击上方正运动小助手,随时关注新动态!

今天,正运动小助手大家分享一下运动控制器之ZMC420SCAN的控制振镜运动。

ZMC420SCAN硬件介绍


1.功能介绍

ZMC420SCAN总线控制器支持ECAT/RTEX总线连接,支持最多达20轴运动控制,支持直线插补、任意圆弧插补、空间圆弧、螺旋插补、电子凸轮、电子齿轮、同步跟随、虚拟轴设置等;采用优化的网络通讯协议可以实现实时的运动控制。 ZMC420SCAN总线控制器支持脉冲轴/总线轴/振镜轴混合插补。

ZMC420SCAN系列运动控制器支持以太网,RS232通讯接口和电脑相连,接收电脑的指令运行,可以通过CAN总线去连接各个扩展模块,从而扩展输入输出点数或运动轴。

ZMC420SCAN系列运动控制卡的应用程序可以使用VC,VB,VS,C++,C#等软件来开发,程序运行时需要动态库zmotion.dll。调试时可以把ZDevelop软件同时连接到控制器,从而方便调试、方便观察。

2.硬件接口

通用输入口电路

通用输出口电路

本地脉冲轴说明

本地振镜轴接口说明

3.振镜控制过程

激光振镜是一种专门用于激光加工领域的特殊的运动器件,激光振镜头内包含的主要元件是激光发生器,两个电机和两个振镜片,它靠两个电机分别控制两个振镜片X和Y反射激光,形成XY平面的运动,这两个电机使用控制器上的振镜轴接口控制。

激光振镜不同于一般的电机,激光振镜具有非常小的惯量,且在运动的过程中负载非常小,只需要带动反射镜片,系统的响应非常快。

振镜工作

ZMC420SCAN支持XY2-100振镜协议,支持运动控制与振镜联合插补运动。上位机通过网口与控制器相连,通过XY2-100振镜协议进行控制振镜轴的运动,通过总线协议或者脉冲模式控制伺服轴运动。

使用ZMC420SCAN控制器的振镜轴接口连接激光振镜头,每个振镜轴接口内包含两路振镜通道信号,分别控制振镜片X、Y的偏转,从而控制了激光打到工件的位置。

4.控制器PWM模拟量介绍

ZMC420SCAN的外部通用输出口0-11都具有PWM输出功能,PWM输出受正常输出功能的控制,只有输出口状态ON的时候PWM才能实际输出,这样可以用来控制激光能量。

ZMC420SCAN控制器存在两路模拟量输入输出,可进行控制激光器能量输出,模拟量精度为12位。

5.控制器基本信息

轴0-3为普通脉冲轴,振镜0为轴4、轴5控制振镜XY,振镜1为轴6、轴7控制XY。


C++进行振镜+运动控制开发




1.新建MFC项目并添加函数库

(1)在VS2015菜单“文件”→“新建”→ “项目”,启动创建项目向导。
(2)选择开发语言为“Visual C++”和程序类型“MFC应用程序”。

(3)点击下一步即可。

(4)选择类型为“基于对话框”,下一步或者完成。
(5)找到厂家提供的光盘资料,路径如下(64位库为例)。

A.进入厂商提供的光盘资料找到“8.PC函数”文件夹,并点击进入。

B.选择“函数库2.1”文件夹。

C.选择“Windows平台”文件夹。

D.根据需要选择对应的函数库这里选择64位库。

E.解压C++的压缩包,里面有C++对应的函数库。

F.函数库具体路径如下。

(6)将厂商提供的C++的库文件和相关头文件复制到新建的项目里面。
(7)在项目中添加静态库和相关头文件。

A.先右击项目文件,接着依次选择:“添加”→“现有项”。

B.在弹出的窗口中依次添加静态库和相关头文件。

(8)声明用到的头文件和定义控制器连接句柄。

至此项目新建完成,可进行MFC项目开发。

2.查看PC函数手册,熟悉相关函数接口
(1)PC函数手册也在光盘资料里面,具体路径如下:“光盘资料\8.PC函数\函数库2.1\ZMotion函数库编程手册 V2.1.pdf”


(2)链接控制器,获取链接句柄。

ZAux_OpenEth()接口说明:

指令7

ZAux_OpenEth

指令原型

int32  __stdcall  ZAux_OpenEth(char  *ipaddr, ZMC_HANDLE  * phandle)

指令说明

以太网链接控制器。

输入参数

输入参数1个,详细见下面说明。

ipaddr

链接的IP地址。

输出参数

输出参数1个,详细见下面说明。

Phandle

返回的链接句柄。

返回值

详细见错误码说明。

(3)振镜运动打包接口。
指令

ZAux_Scan_3FileRamGetRemainSpace

指令原型

int32 __stdcall ZAux_Scan_3FileRamGetRemainSpace  ( ZMC_HANDLE handle, uint32 *premainbyte)

指令说明

获取控制器能下载的最大文件大小

输入参数

输入参数1个,详细见下面说明。

ZMC_HANDLE 

连接句柄

输出参数

输出参数1个,详细见下面说明。

premainbyte

获取下载的最大文件内容大小

指令

ZAux_Scan_3FileRamDownBegin

指令原型

int32 __stdcall ZAux_Scan_3FileRamDownBegin(ZMC_HANDLE handle, uint32 *premainbyte)

指令说明

开启文件下载到控制器的功能

输入参数

输入参数2个,详细见下面说明。

ZMC_HANDLE 

连接句柄

premainbyte

下载到控制器的最大文件内容大小

输出参数

指令

ZAux_Scan_Motion3FileMem

指令原型

int32 __stdcall ZAux_Scan_Motion3FileMem(ZMC_HANDLE handle, const char* pbuffer, uint32 buffsize)

指令说明

打包字符串下载到控制器中

输入参数

输入参数3个,详细见下面说明。

ZMC_HANDLE 

连接句柄

pbuffer

Basic指令的字符串内容,下载到控制器执行

buffsize

下载的字符串长度

输出参数

指令

ZAux_Scan_Motion3FileRun

指令原型

int32 __stdcall ZAux_Scan_Motion3FileRun(ZMC_HANDLE handle, int32 itasknum)

指令说明

运行下载到控制器的字符串文件

输入参数

输入参数2个,详细见下面说明。

ZMC_HANDLE 

连接句柄

itasknum

文件运行任务号

输出参数

指令

ZAux_Scan_3FileRamDownEnd

指令原型

int32 __stdcall ZAux_Scan_3FileRamDownEnd(ZMC_HANDLE handle)

指令说明

结束整个下载文件过程

输入参数

输入参数1个,详细见下面说明。

ZMC_HANDLE 

连接句柄

输出参数

为了使得振镜运动能够高速的执行,采用打包所有文件下载到控制器的方式,提高振镜的运动速度,保证过程中振镜速度得到有效的提升,不会因为上位机下发过程跟不上控制器运动的情况,导致中间出现运动停止。

3.MFC开发控制器振镜运动例程

(1)例程界面如下。

(2)链接按钮的事件处理函数中调用链接控制器的接口函数ZAux_OpenEth(),与控制器进行链接,链接成功后启动定时器1监控控制器状态。

//网口链接控制器void CSingle_move_Dlg::OnOpen(){    char   buffer[256];     int32 iresult;    //如果已经链接,则先断开链接    if(NULL != g_handle)    {        ZAux_Close(g_handle);        g_handle = NULL;    }    //从IP下拉框中选择获取IP地址    GetDlgItemText(IDC_IPLIST,buffer,255);    buffer[255] = '\0';    //开始链接控制器    iresult = ZAux_OpenEth(buffer, &g_handle);    if(ERR_SUCCESS != iresult)    {        g_handle = NULL;        MessageBox(_T("链接失败"));        SetWindowText("未链接");        return;    }    //链接成功开启定时器1    SetWindowText("已链接");    SetTimer( 1, 100, NULL );  }

(3)通过定时器控控制器状态,以及运行过程所用时间

void CgalvmoveDlg::OnTimer(UINT_PTR nIDEvent){    // TODO: 在此添加消息处理程序代码和/或调用默认值    if (NULL == g_handle)    {        MessageBox(_T("链接断开"));        return;    }    if (1 == nIDEvent)    {        CString string;        float position = 0;        ZAux_Direct_GetDpos(g_handle, 4, &position);          //获取当前轴位置        string.Format("振镜X轴当前位置:%.2f", position);        GetDlgItem(IDC_CURPOS)->SetWindowText(string);        float NowSp = 0;        ZAux_Direct_GetVpSpeed(g_handle, 4, &NowSp);          //获取当前轴速度        string.Format("振镜X轴当前速度:%.2f", NowSp);        GetDlgItem(IDC_CURSPEED)->SetWindowText(string);        ZAux_Direct_GetDpos(g_handle, 5, &position);          //获取当前轴位置        string.Format("振镜Y轴当前位置:%.2f", position);        GetDlgItem(IDC_CURPOS2)->SetWindowText(string);         ZAux_Direct_GetVpSpeed(g_handle, 5, &NowSp);          //获取当前轴速度        string.Format("振镜Y轴当前速度:%.2f", NowSp);        GetDlgItem(IDC_CURSPEED2)->SetWindowText(string);           int status = 0;        ZAux_Direct_GetIfIdle(g_handle, 4, &status);           //判断当前轴状态        if (status == -1)        {            GetDlgItem(IDC_CURSTATE)->SetWindowText("当前状态:停  止");        }        else        {            GetDlgItem(IDC_CURSTATE)->SetWindowText("当前状态:运动中");        }     }    if (2 == nIDEvent)    {        int idlestatus = 0;        ZAux_Direct_GetIfIdle(g_handle, 4, &idlestatus);        if (idlestatus == -1)        {            CString string;            m_endtime = GetTickCount() - m_starttime;            string.Format("过程所用时长:%dms", m_endtime);            GetDlgItem(IDC_TIME)->SetWindowText(string);            KillTimer(2);        }            }     CDialogEx::OnTimer(nIDEvent);}
(4)通过启动按钮的事件处理函数采用打包字符串的方式进行运行振镜运动轨迹,将振镜运动的速度得到提升效果,并在文件中直接对控制器参数进行设置。
void CgalvmoveDlg::OnBnClickedStart(){    // TODO: 在此添加控件通知处理程序代码    int ret = 0    if (NULL == g_handle)    {        MessageBox(_T("链接断开状态"));        return;    }    UpdateData(true);//刷新参数    uint32 nRemain = 0;    CString str = "";    //获取控制能写入文件的最大大小    ret = ZAux_3FileRamGetRemainSpace(g_handle, &nRemain);    //启动三次文件下载    ret = ZAux_3FileRamDownBegin(g_handle, &nRemain);        //主轴号写入    str = "base(4,5)\n";    //参数写入    CString str2;    str2.Format("ATYPE = %d,%d\n", m_Atype, m_Atype);    str += str2;    str2.Format("units = %d,%d\n",m_units,m_units);    str += str2;    str2.Format("merge = 1,1\n");    str += str2;    str2.Format("speed = %f,%f\n", (float)m_speed, (float)m_speed);    str += str2;    str2.Format("force_speed = %f,%f\n", (float)m_speed, (float)m_speed);    str += str2;    str2.Format("accel = %f,%f\n", (float)m_acc, (float)m_acc);    str += str2;    str2.Format("decel = %f,%f\n", (float)m_dec, (float)m_dec);    str += str2;    str2.Format("sramp = %d,%d\n", m_sramp, m_sramp);    str += str2;      //轮廓轨迹写入    str += "movescanabs(0,0)\n";    str += "movescanabs(10,0)\n";    str += "movescanabs(10,10)\n";    str += "movescanabs(0,10)\n";    str += "movescanabs(0,0)\n";    //运动填充轨迹写入    for (int i = 0; i < 1000; i++)    {        CString str1;        float f_dis = (float)i/100.0;        str1.Format("movescanabs(10,%f)\n", f_dis);        str += str1;        str1.Format("movescanabs(0,%f)\n", f_dis);        str += str1;    }    //打包字符串下载到控制器运行    ret = ZAux_UW_Motion3FileMem(g_handle, str, str.GetLength());    //运行三次文件    ret = ZAux_UW_Motion3FileRun(g_handle, 2);    ret = ZAux_3FileRamDownEnd(g_handle);    m_starttime = GetTickCount();    SetTimer(2,100,NULL);    UpdateData(false);}
(5)通过断开按钮的事件处理函数来断开与控制卡的连接。
void CSingle_move_Dlg::OnClose()        //断开链接{    // TODO: Add your control notification handler code here    if(NULL != g_handle)    {        KillTimer(1);            //关定时器        KillTimer(2);        ZAux_Close(g_handle);        g_handle = NULL;        SetWindowText("未链接");    }}

(6)通过坐标清零按钮的事件处理函数移动振镜轴回零到中心零点位置,不直接使用dpos=0,修改振镜轴坐标。

void CSingle_move_Dlg::OnZero()          //清零坐标{    if(NULL == g_handle)    {        MessageBox(_T("链接断开状态"));        return ;    }    // TODO: Add your control notification handler code here    int axislist[2] = { 4,5 };    float dposlist[2] = { 0 };    ZAux_Direct_MoveAbs(g_handle,2,axislist,dposlist);        //设置运动回零点}

(7)通过停止运动的的事件处理函数将文件运行的任务停止,并取消当前运动,实现实时停止功能。

void CgalvmoveDlg::OnBnClickedStop(){    // TODO: 在此添加控件通知处理程序代码    if (NULL == g_handle)    {        MessageBox(_T("链接断开状态"));        return;    }    char retbuffer[2048];    ZAux_Execute(g_handle,"stoptask 2", retbuffer,2048);    Sleep(10);    ZAux_Direct_Single_Cancel(g_handle, 4, 2);       }

完整代码获取地址

调试与监控


编译运行例程同时通过ZDevelop软件连接控制器对控制器状态进行监控

1.ZDevelop软件连接控制器监控控制器的状态,查看振镜轴对应参数,并可搭配示波器检测振镜轨迹。

设置振镜轴运动,首先需要将轴类型配置成21振镜轴类型,并对应配置振镜轴的速度加减速等参数才可操作振镜进行运动。并可通过状态显示部分,查看到当前轴的位置以及运行轨迹所用时间。


2.通过ZDevelop软件的示波器监控振镜运动运行轨迹,并可监控到运行轨迹所用时间。

3.视频演示

本次,正运动技术开放式激光振镜+运动控制器(二):振镜填充,就分享到这里。
更多精彩内容请关注“正运动小助手”公众号,需要相关开发环境与例程代码,请咨询正运动技术销售工程师:400-089-8936

  END 





金十年


类似文章

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理

在线客服
在线客服
QQ客服