超高性价比运动控制卡快速入门

2025-10-04 02:54:06

1、a.ECI1408控制卡本体支持4轴,通过连扩展模块,最多支持6轴运动控制。

b.脉冲输出模式:方向/脉冲或双脉冲。

c.支持手轮输入模式。

d.每轴最大输出脉冲频率5MHz

e.通过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库。上位机软件编程参考《ZMotion PC函数库编程手册》。

超高性价比运动控制卡快速入门

2、使用PC上位机软件开发的程序无法下载到控制器,通过dll动态库连接到控制器。调试时可以把ZDevelop软件同时连接到控制器,方便观察程序运行情况。

ECI1408控制卡也通过ZDevelop开发环境来调试,不过程序空间较小,不能写过多的代码。

ZDevelop是一个很方便的编程、编译和调试环境。ZDevelop可以通过串口、485、USB或以太网与控制器建立连接。

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.选择开发语言为“Visual C++”和程序类型“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.h

1)先右击头文件,接着依次选择:“添加”→“现有项”。

超高性价比运动控制卡快速入门

15、接上:2)在弹出的窗口中依次添加静态库和相关头文件。

超高性价比运动控制卡快速入门

16、接上:3)声明用到的头文件和定义控制器连接句柄。至此项目新建完成。

超高性价比运动控制卡快速入门

17、B.查看PC函数手册,了解PC函数用法。

       a.PC函数手册也在光盘资料里面,具体路径如下:

超高性价比运动控制卡快速入门

18、接上:b.   PC编程,一般先根据控制器连接方式选择对应的连接函数连接控制器,返回控制器句柄。接着用返回的控制器句柄,实现对控制器的控制。

          c.比如通过网口连接控制器,先使用ZAux_OpenEth()链接控制器,获取控制器句柄handle。

          

 

超高性价比运动控制卡快速入门

超高性价比运动控制卡快速入门

19、接上:d.通过获取到的控制器句柄handle,对控制器进行单轴运动控制。

超高性价比运动控制卡快速入门

20、接上:e.通过获取到的控制器句柄handle,对控制器进行多轴运动控制。

//多轴运动

int  axislist[4] = { 0,1,2,3 };     //运动BASE轴列表

float dislist[4] = { 100,100,100,100 };   //运动距离列表

ZAux_Direct_Move(g_handle, 4, axislist, dislist); //多轴运动

超高性价比运动控制卡快速入门

1、例程以建立板卡的连接,执行3段连续轨迹的加工为目标。

超高性价比运动控制卡快速入门

2、例程简易流程图。

// 相关函数

 

ZAux_OpenEth(IP_buffer, &g_handle);//连接控制器

 

ZAux_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按钮事件处理函数

void CMergeDlg::OnBnClickedButtonLink()

{

char   buffer[256];

int32 iresult;

//如果之前有连接控制器着先断开连接

if (NULL != g_handle)

{

ZAux_Close(g_handle);

g_handle = NULL;

}

//从IP下拉框中获取IP

GetDlgItemText(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 (int i = 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的位置信息和速度信息。

//定时器

void CMergeDlg::OnTimer(UINT_PTR nIDEvent)

{

if (NULL == g_handle)

{

MessageBox(_T("链接断开"));

return;

}

switch (nIDEvent)

{

case 1: //更新控制器轴0-3的位置信息和速度信息  

CString Xpos, Xmspeed;

CString Ypos, Ymspeed;

CString Zpos, Zmspeed;

CString Upos, Umspeed;

float showpos[4] = { 0 };

float    mspeed[4] = { 0 };

int  status = 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、通过启动按钮的事件处理函数来启动连续插补运动。

//启动按钮

void CMergeDlg::OnBnClickedButtonRun()

{

if (NULL == g_handle)

{

MessageBox(_T("链接断开"));

return;

}

UpdateData(true);//刷新参数

int corner_mode = 0;

int axislist[4] = { 0,1,2,3 };  //运动BASE轴列表

float dislist1[4] = { 0 };    //运动距离列表

float dislist2[4] = { 0 };

float dislist3[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与endmovespeed

ZAux_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、通过停止按钮的事件处理函数来停止插补运动。

//停止按钮

void CMergeDlg::OnBnClickedButtonStop()

{

if (NULL == g_handle)

{

MessageBox(_T("链接断开"));

return;

}

ZAux_Direct_Single_Cancel(g_handle, 0, 2);        //停止主轴 BASE的一个轴

}

7、轴坐标清零。

//坐标清零

void CMergeDlg::OnBnClickedButtonClear()

{

if (NULL == g_handle)

{

MessageBox(_T("链接断开"));

return;

}

for (int i = 0; i<4; i++)

{

ZAux_Direct_SetDpos(g_handle, i, 0);        //DPOS设为零

}

}

8、编译运行演示。

1)编译运行示教例程。

超高性价比运动控制卡快速入门

9、2)同时通过ZDevelop软件连接同一个控制器,对运动控制的轴参数进行监控。

     

     A.连续插补加自动倒角的位置波形。

超高性价比运动控制卡快速入门

10、接上:B.不开启连续插补的速度波形。

超高性价比运动控制卡快速入门

超高性价比运动控制卡快速入门

超高性价比运动控制卡快速入门

11、接上:C.连续插补加合适的拐角减速的速度波形。

超高性价比运动控制卡快速入门

超高性价比运动控制卡快速入门

超高性价比运动控制卡快速入门

声明:本网站引用、摘录或转载内容仅供网站访问者交流或参考,不代表本站立场,如存在版权或非法内容,请联系站长删除,联系邮箱:site.kefu@qq.com。
猜你喜欢