The value of Zmotion is to bring customers more success!
今天,正运动小助手给大家分享一下EtherCAT运动控制卡开发教程之Qt,主要介绍一下如何通过Qt编程实现小线段轨迹连续加工,暂停与继续。
ECI2828运动控制卡的硬件介绍
ECI2828系列控制卡支持最多达16轴直线插补、任意圆弧插补、空间圆弧、螺旋插补、电子凸轮、电子齿轮、同步跟随、虚拟轴、机械手指令等;采用优化的网络通讯协议可以实现实时的运动控制。
ECI2828系列运动控制卡支持以太网,232通讯接口和电脑相连,接收电脑的指令运行,可以通过EtherCAT总线和CAN总线去连接各个扩展模块,从而扩展输入输出点数或运动轴。
ECI2828系列运动控制卡的应用程序可以使用VC、VB、VS、C++、C#等多种高级语言编程来开发,程序运行时需要动态库zmotion.dll。调试时可以把ZDevelop软件同时连接到控制器,从而方便调试、方便观察。
一、Qt进行运动控制卡开发的流程
1.新建Qt项目。
图1:新建Qt项目
图2:选择项目路径
图3:选择Qt编译套件(kits)
图4:选择基类
2.将函数库相关的文件复制到新建的项目中。
3.向新建的项目里面添加函数库的静态库。(zmotion.lib)
4.添加函数库相关的头文件到项目中。
5.声明相关头文件,并定义连接句柄。
二、PC函数介绍
2.PC编程,一般如果网口对控制器和工控机进行链接。网口链接函数接口是ZAux_OpenEth();如果链接成功,该接口会返回一个链接句柄。通过操作这个链接句柄可以实现对控制器的控制。
3.连续插补和S曲线设置相关指令介绍。
4.拐角模式设置相关指令介绍。
三、Qt开发实现小线段轨迹连续加工、暂停与继续
2.在构造函数里面调用链接控制器的接口ZAux_OpenEth(),与控制器进行链接,链接成功后启动定时器监控控制器的轴信息。
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
int rint=0;
ui->setupUi(this);
//系统启动自动连接控制器
rint = ZAux_OpenEth("192.168.0.223", &g_handle);
//如果链接成功则启动定时器
if(rint==0)
{
startTimer(50);
}
}
//定时器事件
void MainWindow::timerEvent(QTimerEvent *event)
{
QString StrText;
float AxisDpos[3]={0};
float AxisMspeed[3]={0};
if(NULL != g_handle)
{
for(int i=0;i<3;i++)
{
//获取轴0的位置信息
ZAux_Direct_GetDpos(g_handle,i,&AxisDpos[i]);
//获取轴0的速度信息
ZAux_Direct_GetMspeed(g_handle,i,&AxisMspeed[i]);
}
StrText = QString("#轴0位置:(%1) #轴1位置:(%2) #轴2位置:(%3)").arg(AxisDpos[0]).arg(AxisDpos[1]).arg(AxisDpos[2]);
ui->AxisDpos->setText(StrText);
StrText = QString("#轴0速度:(%1) #轴1速度:(%2) #轴2速度:(%3)").arg(AxisMspeed[0]).arg(AxisMspeed[1]).arg(AxisMspeed[2]);
ui->AxisMspeed->setText(StrText);
}
}
//搜索Z3P文件
void MainWindow::on_Search_clicked()
{
char Buff[1024]={"123"};
//搜索Z3P文件,结果放到VR(0) 开始的寄存器存储
ZAux_Execute(g_handle, "FILE \"FLASH_FIRST\", \".z3p\",0", NULL, 0);
//获取VR寄存器里面的文件名
ZAux_Execute(g_handle, "?vrstring(0,128)", Buff, 1024);
//去除文件名的\n
int Len = strlen(Buff);
Buff[Len-1]=0;
QString Str = QString(QLatin1String(Buff));
//更新到UI界面上
ui->lineEdit->setText(Str);
qDebug()<<Buff<<Str;
}
(3)通过启动按钮启动Z3P文件。
//启动按钮槽函数:设置拐角模式,开始运行Z3P文件
void MainWindow::on_RunButton_clicked()
{
QString Text;
int AxisList[3] = {0,1,2};
float DisList[3]={0};
//设置轴参数
for(int i=0; i<3; i++)
{
//轴类型设置为脉冲轴
ZAux_Direct_SetAtype(g_handle,i,1);
//设置脉冲当量,一般设置成机台运动1mm需要的脉冲数
ZAux_Direct_SetUnits(g_handle,i,1000);
//设置轴运动速度
ZAux_Direct_SetSpeed(g_handle,i,200);
//设置轴的加速度
ZAux_Direct_SetAccel(g_handle,i,2000);
//设置轴的减速度
ZAux_Direct_SetDecel(g_handle,i,2000);
//打开连续插补
ZAux_Direct_SetMerge(g_handle,i,1);
//设置S曲线参数
ZAux_Direct_SetSramp(g_handle,i,250);
}
//设置拐角模式
int CornerMode=0;
//是否打开自动倒角
if(ui->IsChamfer->checkState())
{
CornerMode = 32+CornerMode;
}
//是否打开拐角减速
if(ui->IsSlowDown->checkState())
{
CornerMode = 2+CornerMode;
//设置开始减速角度
Text = ui->StartAngle->toPlainText();
ZAux_Direct_SetDecelAngle(g_handle,AxisList[0],Text.toFloat()*3.14/180);
//设置停止减速角度
Text = ui->StopAngle->toPlainText();
ZAux_Direct_SetStopAngle(g_handle,AxisList[0],Text.toFloat()*3.14/180);
//设置参数速度
Text = ui->SpSpeed->toPlainText();
ZAux_Direct_SetForceSpeed(g_handle,AxisList[0],Text.toFloat());
}
//是否打开小圆限速
if(ui->IsMinCir->checkState())
{
CornerMode = 8+CornerMode;
//设置限速半径
Text = ui->CirRadius->toPlainText();
ZAux_Direct_SetFullSpRadius(g_handle,AxisList[0],Text.toFloat());
//设置参数速度
Text = ui->SpSpeed->toPlainText();
ZAux_Direct_SetForceSpeed(g_handle,AxisList[0],Text.toFloat());
}
ZAux_Direct_SetCornerMode(g_handle,AxisList[0],CornerMode);
//停止线程1
ZAux_Execute(g_handle, "STOPTASK 1", NULL, 0);
//启动Z3P文件
char CmdBuff[64];
char *str = ui->lineEdit->text().toLatin1().data();
sprintf(CmdBuff, "FILE3_RUN \"%s\",1",str);
ZAux_Execute(g_handle, CmdBuff, NULL, 0);
}
5.通过停止按钮的槽函数调用轴运动停止指令停止轴运动
//停止轴运动
void MainWindow::on_StopButton_clicked()
{
//停止线程1
ZAux_Execute(g_handle, "STOPTASK 1", NULL, 0);
//停止轴运动
ZAux_Direct_Rapidstop(g_handle,2);
}
6.小线段连续轨迹加工的暂停与继续。
//暂停运动
void MainWindow::on_Suspended_clicked()
{
//暂停轴运动
ZAux_Direct_MovePause(g_handle,0,0);
//暂停线程1
ZAux_Execute(g_handle, "PAUSETASK 1", NULL, 0);
}
//恢复运动
void MainWindow::on_Restore_clicked()
{
//恢复轴运动
ZAux_Direct_MoveResume(g_handle,0);
//恢复线程1
ZAux_Execute(g_handle, "RESUMETASK 1", NULL, 0);
}
四、例程移植到Linux设备上
1.Linux对应架构的库复制到项目文件夹里面。
2.向新建的项目里面添加函数库的静态库。(libzmotion.so)
添加函数库1
添加函数库2
添加函数库3
→至此,重新编译即可运行。
3.调试与监控。
编译运行例程,同时连接ZDevelop软件进行调试,对运动控制的轴参数和运动情况进行监控。
(1)小线段轨迹加工的X-Y位置波形图。
(2)小线段轨迹加工的速度波形图。(连续插补未打开拐角减速)
正运动技术专注于运动控制技术研究和通用运动控制软硬件产品的研发,是国家级高新技术企业。正运动技术汇集了来自华为、中兴等公司的优秀人才,在坚持自主创新的同时,积极联合各大高校协同运动控制基础技术的研究,是国内工控领域发展最快的企业之一,也是国内少有、完整掌握运动控制核心技术和实时工控软件平台技术的企业。主要业务有:运动控制卡_运动控制器_EtherCAT运动控制卡_EtherCAT控制器_运动控制系统_视觉控制器__运动控制PLC_运动控制_机器人控制器_视觉定位等等。
本次,正运动技术EtherCAT运动控制卡开发教程之Qt(中):小线段连续轨迹加工、暂停与继续,就分享到这里。
本文由正运动技术原创,欢迎大家转载,共同学习,一起提高中国智能制造水平。文章版权归正运动技术所有,如有转载请注明文章来源。