ECI是正运动技术推出的网络运动控制卡型号简缍硫赔笏称。ECI1408控制卡支持多达4轴实时的运动控制,可连接轴扩展模块,最多扩展至6轴。迨藻悃顼没有控制器的场合可以连接仿真器在PC上直接仿真运行。控制卡不包含脉冲DB头,脉冲输出采用专用的输出端子,如下图右下角端子。编码器反馈信号接在输入口IN上。安装使用方便,不需要工控机卡槽,功能全面,性能稳定,高性价比,广泛应用在电子半导体、点胶设备、流水线等4轴以内的脉冲应用场合。如您需要购买运动控制器或运动控制卡,欢迎咨询正运动技术销售工程师。接下来依次介绍ECI1408的特点与如何使用。
工具/原料
ECI1408控制器ECI1408
windows,linux,Mac,Android,wince各种操作系统12.0.01
ZDevelopV3.10.03Alpha2
一、产品特点
1、a.苇质缵爨ECI1408控制卡本体支持4轴,通过连扩展模块,最多支持6轴运动控制。b.脉冲输出模式:方向/脉冲或双脉冲。c.支持手轮输入模式。d.足饶戽沸每轴最大输出脉冲频率5MHze.通过CAN总线,最多可扩展到512个隔离输入或输出口。f.轴正负限位信号口/原点信号口可以随意配置为任何输入口,也可以采用出厂默认配置的信号。g.输出口最大输出电流可达300mA,可直接驱动部分电磁阀。h.支持最多达6轴直线插补、任意圆弧插补、螺旋插补,电子凸轮、电子齿轮、位置锁存、同步跟随、虚拟轴等功能。i.多种程序加密手段,保护客户的知识产权。
二、通讯接口
1、运动控制器上带的通讯接口:232接口、EtherNET网口、CAN接口。板上自带36个通用输入口IN,12个通用输出口OUT,通过CAN总线可以连接各个扩展模块,在控制器自身IO点数不够用的时候,扩展输入输出点数或脉冲轴。
2、ECI网络运动控制卡支持以太网、232通讯接署孢颜匈口和电脑相连,接收电脑的指令运行。通用输入口IN配置为编码器反馈:例如:IN18-20配置一邗锒凳审个编码器,对应的编码器轴号是1,意味着编码器输入信号将在AXIS1上,如果将轴1的走类型配置为3或6,ATYPE(1)=3/6,此时做编码器输入,ATYPE(1)=0,则为通用输入口。原点、正负限位信号已经做好了定义,例如,下图24-26已经配置为轴0-2的原点输入信号,用户也可以使用DATUM_IN映射原点输入信号指令重新定义原点信号。
三、开发环境
1、ECI1408控制卡的应用程序建议使用VC,VB,VS,C++Builder,C#,等软件来开发,控制器支持windows,linux,Mac,Android,wince各种操作系统下的开发,提供vc,c#,vb.net,labview等各种环境的dll库。上位机软件编程参考《ZMotionPC函数库编程手册》。
2、使用PC上位机软件开发的程序无法下载到控制器,通过dll动态库连接到控制器。调试时可以把ZDevelop软件同时连接到控制器,方便观察程序运行情况。ECI1408控制卡也通过ZDevelop开发环境来调试,不过程序空间较小,不能写过多的代码。ZDevelop是一个很方便的编程、编译和调试环境。ZDevelop可以通过串口、48USB或以太网与控制器建立连接。
四、控制器使用
1、控制器使用基础流程:第一步:硬件接线参考控制器系蕙蝤叼翕统架构图,接入主电源(控制器采用24V直流电源供电),驱动设备,IO设备,触摸屏、扩展模块等。第二步:系统配置设就女蒿鸳置伺服驱动器的参数,配置PC与控制器连接所需的串口或网口参数等。第三步:连接控制器采用串口或网口连接PC与控制器,建立通讯连接。第四步:编程开发选择一种开发方式,本例子采用VS平台的C++开发。第五步:程序调试调试程序,通过动态库连接到控制器使用,控制器收到命令后执行运动控制,没有控制器的场合连接到仿真器调试。第六步:运行程序运行程序观察效果能否满足需求。
2、工具&材料准备:(1)硬件A.ECI1408控制器一台。B驱动器+电机一套C.电脑一台。D.带屏蔽层网线一根。E.24V直流电源一个。F.接线端子与连接线若干。(2)软件A.安装下载VS软件所需的库文件联系正运动技术获取。
3、VS下的C++开发主要介绍应用C++开发一个多段连续插补的运动控制应用。我们主要从新建MFC项目,添加函数库讲起,再了解PC函数用,最后通过项目实战——连续插补运动例程讲解,来让大家熟悉它的项目开发。A.新建MFC项目,添加函数库。a.在VS2015菜单“文件”→“新建”→“项目”,启动创建项目向导。
4、接上:b.选择开发语言为“VisualC++”和程序类型“MFC应用程序”。
5、接上:c.点击下一步即可。
6、接上:d.选择类型为“基于对话框”,下一步或者完成。下一步则往后继续配置,完成就直接完成即可。这里就不需要再配置了,无关紧要的,只要这个类型选好就行,其他的可以在项目中编辑。
7、接上:e.找到厂家提供的光盘资料,路径如下(64位库为例):1)进入光盘资料找到PC函数文件夹。
8、接上:2)选择函数库2.1。
9、接上:3)Windows平台。
10、接上:4)根据需要选择对应的函数库这里选择64位库。
11、接上:5)解压C++的压缩包,里面有C++对应的函数库。
12、接上:6)函数库具体路径如下。
13、接上:f.将厂商提供的C++的库文件和相关头文件复制到新建的项目里面。
14、接上:g.在项目中添加静态库和相关头文件。静态库:zauxdll.lib,zmotion.lib相关头文件:zauxdll2.h,zmotion.h1)先右击头文件,接着依次选择:“添加”→“现有项”。
15、接上:2)在弹出的窗口中依次添加静态库和相关头文件。
16、接上:3)声明用到的头文件和定义控制器连接句柄。至此项目新建完成。
17、B.查看PC函数手册,了解PC函数用法。a.PC函数手册也在光盘资料里面,具体路径如下:
18、接上:b.PC编程,一般先根据控制器连接方式选择对应的连接函数连接控制器,返回控制器句柄。接着用返回的控制器句柄,实现对控制器的控制。c.比如通过网口连接控制器,先使用ZAux_OpenEth()链接控制器,获取控制器句柄handle。
19、接上:d.通过获取到的控制器句柄handle,对控制器进行单轴运动控制。
20、接上:e.通过获取到的控制器句柄handle水貔藻疽,对控制器进行多轴运动控制。//多轴运动intaxislist[4]={惺绅寨瞀0,1,2,3};//运动BASE轴列表floatdislist[4]={100,100,100,100};//运动距离列表ZAux_Direct_Move(g_handle,4,axislist,dislist);//多轴运动
五、项目实战之连续插补运动例程讲解。
1、例程以建立板卡的连接,执行3段连续轨迹的加工为目标。
2、例程简易流程图。//相关脑栲葱蛸函数ZAux_OpenEth(IP_buffer,&g_handle);//连接控制器ZA锇栀劐箨ux_Direct_GetAllAxisPara(g_handle,"DPOS",4,showpos);//获取当前轴位ZAux_Direct_GetAllAxisPara(g_handle,"MSPEED",4,mspeed);//更新轴速度ZAux_Direct_Single_Cancel(g_handle,0,2);//停止主轴运动ZAux_Direct_Move(g_handle,4,axislist,dislist1);//第1段多轴插补指令ZAux_Direct_Move(g_handle,4,axislist,dislist2);//第2段多轴插补指令ZAux_Direct_Move(g_handle,4,axislist,dislist3);//第3段多轴插补指令ZAux_Close(g_handle);//断开连接
3、通过网口连接控制器,获取控制器连接句柄。//Link按鸵晚簧柢钮事件处理函数voidCMergeDlg::OnBnClickedButtonLink(){charbuffer[256];int32i鸡堕樱陨result;//如果之前有连接控制器着先断开连接if(NULL!=g_handle){ZAux_Close(g_handle);g_handle=NULL;}//从IP下拉框中获取IPGetDlgItemText(IDC_COMBOX_IP,buffer,255);buffer[255]='\0';//通过PC函数库提供的连接控制器的函数接口(API),连接控制器iresult=ZAux_OpenEth(buffer,&g_handle);if(ERR_SUCCESS!=iresult){g_handle=NULL;MessageBox(_T("链接失败"));SetWindowText("未链接");return;}SetWindowText("已链接");//启动定时器SetTimer(1,100,NULL);SetTimer(2,100,NULL);//初始化轴参数for(inti=0;i<4;i++){ZAux_Direct_SetAtype(g_handle,i,1);//轴类型ZAux_Direct_SetUnits(g_handle,i,1000);//脉冲当量ZAux_Direct_SetSpeed(g_handle,i,100);//速度ZAux_Direct_SetAccel(g_handle,i,1000);//加速度ZAux_Direct_SetDecel(g_handle,i,1000);//减速度ZAux_Direct_SetSramp(g_handle,i,100);//S曲线时间}}
4、通过定时器1更新控制器轴0-3的位置信息和速度信息。/漆虱忧甘/定时器voidCMergeDlg::OnTimer(UINT_PTRnIDEvent){if(NULL==g_handle){Mess锾攒揉敫ageBox(_T("链接断开"));return;}switch(nIDEvent){case1://更新控制器轴0-3的位置信息和速度信息CStringXpos,Xmspeed;CStringYpos,Ymspeed;CStringZpos,Zmspeed;CStringUpos,Umspeed;floatshowpos[4]={0};floatmspeed[4]={0};intstatus=0;//获取当前轴位置ZAux_Direct_GetAllAxisPara(g_handle,"DPOS",4,showpos);Xpos.Format("X:%.2f",showpos[0]);Ypos.Format("Y:%.2f",showpos[1]);Zpos.Format("Z:%.2f",showpos[2]);Upos.Format("U:%.2f",showpos[3]);GetDlgItem(IDC_XPOS)->SetWindowText(Xpos);GetDlgItem(IDC_YPOS)->SetWindowText(Ypos);GetDlgItem(IDC_ZPOS)->SetWindowText(Zpos);GetDlgItem(IDC_UPOS)->SetWindowText(Upos);//判断主轴状态(即BASE的第一个轴)ZAux_Direct_GetIfIdle(g_handle,0,&status);if(status==-1){GetDlgItem(IDC_RUNSTATUS)->SetWindowText("运动状态:停止中");}else{GetDlgItem(IDC_RUNSTATUS)->SetWindowText("运动状态:运动中");}//更新轴速度ZAux_Direct_GetAllAxisPara(g_handle,"MSPEED",4,mspeed);Xmspeed.Format("X轴速度:%.2f",mspeed[0]);Ymspeed.Format("Y轴速度:%.2f",mspeed[1]);Zmspeed.Format("Z轴速度:%.2f",mspeed[2]);Umspeed.Format("U轴速度:%.2f",mspeed[3]);GetDlgItem(IDC_SPEED_X)->SetWindowText(Xmspeed);GetDlgItem(IDC_SPEED_Y)->SetWindowText(Ymspeed);GetDlgItem(IDC_SPEED_Z)->SetWindowText(Zmspeed);GetDlgItem(IDC_SPEED_U)->SetWindowText(Umspeed);break;}CDialogEx::OnTimer(nIDEvent);}
5、通过启动按钮的事件处理函数来启动连续插补运动。//启动岳蘖氽颐按钮voidCMergeDlg::OnBnClickedBut墉掠载牿tonRun(){if(NULL==g_handle){MessageBox(_T("链接断开"));return;}UpdateData(true);//刷新参数intcorner_mode=0;intaxislist[4]={0,1,2,3};//运动BASE轴列表floatdislist1[4]={0};//运动距离列表floatdislist2[4]={0};floatdislist3[4]={0};//选择参与运动的轴,第一个轴为主轴,插补参数全用主轴参数ZAux_Direct_SetSpeed(g_handle,axislist[0],M_Speed);//速度ZAux_Direct_SetAccel(g_handle,axislist[0],M_Accel);//加速度ZAux_Direct_SetDecel(g_handle,axislist[0],M_Decel);//减速度ZAux_Direct_SetSramp(g_handle,axislist[0],M_SRAMP);//S曲线时间//设置拐角模式if(m_mode1==1){corner_mode=corner_mode+2;}if(m_mode2==1){corner_mode=corner_mode+8;}if(m_mode3==1){corner_mode=corner_mode+32;}ZAux_Direct_SetCornerMode(g_handle,axislist[0],corner_mode);//设置连续插补ZAux_Direct_SetMerge(g_handle,axislist[0],m_mode);//设置SP速度ZAux_Direct_SetForceSpeed(g_handle,axislist[0],SP_Speed);//设置开始.结束减速角度,转换为弧度ZAux_Direct_SetDecelAngle(g_handle,axislist[0],StartAngle*3.14/180);ZAux_Direct_SetStopAngle(g_handle,axislist[0],StopAngle*3.14/180);//设置小圆限速半径ZAux_Direct_SetFullSpRadius(g_handle,axislist[0],SP_Radius);//设置拐角半径ZAux_Direct_SetZsmooth(g_handle,axislist[0],CornerRadius);//SP指令中自动拐角模式中设置一个较大的startmovespeed与endmovespeedZAux_Direct_SetStartMoveSpeed(g_handle,axislist[0],10000);ZAux_Direct_SetEndMoveSpeed(g_handle,axislist[0],10000);//更新运动数据dislist1[0]=DPOS_X_1;dislist1[1]=DPOS_Y_1;dislist1[2]=DPOS_Z_1;dislist1[3]=DPOS_U_1;dislist2[0]=DPOS_X_2;dislist2[1]=DPOS_Y_2;dislist2[2]=DPOS_Z_2;dislist2[3]=DPOS_U_2;dislist3[0]=DPOS_X_3;dislist3[1]=DPOS_Y_3;dislist3[2]=DPOS_Z_3;dislist3[3]=DPOS_U_3;//开始运动ZAux_Direct_Move(g_handle,4,axislist,dislist1);ZAux_Direct_Move(g_handle,4,axislist,dislist2);ZAux_Direct_Move(g_handle,4,axislist,dislist3);}
6、通过停止按钮的事件处理函数来停止插补运动。//停止按钮voidCMergeDlg::OnBnClickedButtonStop(){if(NULL==g_handle){MessageBox(_T("链接断开"));return;}ZAux_Direct_Single_Cancel(g_handle,0,2);//停止主轴BASE的一个轴}
7、轴坐标清零。//坐标清零voidCMergeDlg::OnBnClickedButtonClear(){if(NULL==g_handle){MessageBox(_T("链接断开"));return;}for(inti=0;i<4;i++){ZAux_Direct_SetDpos(g_handle,i,0);//DPOS设为零}}
8、编译运行演示。1)编译运行示教例程。
9、2)同时通过ZDevelop软件连接同一个控制器,对运动控制的轴参数进行监控。A.连续插补加自动倒角的位置波形。
10、接上:B.不开启连续插补的速度波形。
11、接上:C.连续插补加合适的拐角减速的速度波形。