百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术分析 > 正文

EtherCAT运动控制卡开发教程之Qt(中):小线段连续轨迹加工

liebian365 2025-02-18 12:17 6 浏览 0 评论

今天,正运动小助手给大家分享一下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)

第一步:添加函数库1

第二步:添加函数库2

第三步:添加函数库3

4.添加函数库相关的头文件到项目中。

5.声明相关头文件,并定义连接句柄。


二、PC函数介绍


1.PC函数手册也在光盘资料里面,具体路径如下:“光盘资料\8.PC函数\函数库2.1\ZMotion函数库编程手册 V2.1.pdf”。

2.PC编程,一般如果网口对控制器和工控机进行链接。网口链接函数接口是ZAux_OpenEth();如果链接成功,该接口会返回一个链接句柄。通过操作这个链接句柄可以实现对控制器的控制。

ZAux_OpenEth()接口说明:


3.连续插补和S曲线设置相关指令介绍。

4.拐角模式设置相关指令介绍。







三、Qt开发实现小线段轨迹连续加工、暂停与继续


1.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);

}

}


3.通过定时器更新控制器各个轴的位置和速度信息。


//定时器事件

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);

}

}


4.连续小线段的加工。

(1)通过ZCADToMore2.0导图工具将“dxf”格式的CAD图纸导成“Z3P”文件的格式并下载到控制器里面。(点击控制器→发送到控制器按钮,即可把代码显示窗口中的代码发送到控制器中,在控制器中的文件名为:ZCAD.z3p)

(2)搜索控制器里面的Z3P文件。


//搜索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()<

}


(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)小线段轨迹加工的速度波形图。(连续插补未打开拐角减速)

(3)小线段轨迹加工的速度波形图。(连续插补设置拐角减速)


本次,正运动技术EtherCAT运动控制卡开发教程之Qt(中):小线段连续轨迹加工、暂停与继续,就分享到这里。

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

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

相关推荐

C#夯实基础-Lambda在List中的使用

在C#中基本类型比如List,Dictionary,数组等都有委托来实现相关的操作。此时Lambda表达式就可以使用了.实例1,查找字符串List的包含a的元素...

在C#中,如何实现对集合中元素的自定义排序?

在C#中,可以通过多种方式实现对集合中元素的自定义排序,主要包括:...

C++11 新特性面试题_c++ 11 面试题

1、C++11中引入了哪些新的智能指针类型?请描述它们的用法和区别。C++11中引入了三种新的智能指针类型:std::unique_ptr,std::shared_ptr,和std::weak_...

为什么要使用lambda表达式?原来如此,涨知识了

为什么要使用Lambda表达式先看几段Java8以前经常会遇到的代码:创建线程并启动...

[编程基础] Python lambda函数总结

Pythonlambda函数教程展示了如何在Python中创建匿名函数。Python中的匿名函数是使用lambda关键字创建的。...

硬核!Java 程序员必须掌握的 10 个 简化代码的 Lambda 表达式!

大家好,我是一位在架构师道路上狂奔的码农,今天给大家介绍一下程序员必须掌握的10个Lambda表达式,这些表达式几乎涵盖了在实际编程中经常用到的常见场景。相信通过这10个Lambda表...

一文读懂lambda表达式_lambda表达式由来

作者:youngyan,腾讯PCG数据工程工程师...

Java基础知识 - lambda 表达式_javalambda表达式用法

1、表达式语法1)lambda的命名采用的是数学符号λ;...

Python学习笔记 | 匿名函数lambda、映射函数map和过滤函数filter

什么是匿名函数?定义:没有函数名的自定义函数场景:函数体非常简单,使用次数很少,没有必要声明函数,通常搭配高阶函数使用。...

Java Lambda表达式详解(非常全面)

JavaLambda表达式是JDK8引入的,是一个比较重要的特性。@mikechenLambda表达式简介...

Python函数—lambda表达式_python中lambda函数的用法讲解

目录...

了解 Lambda:Python 中的单个表达式函数

Python中的lambda关键字提供了声明小型匿名函数的快捷方式。Lambda函数的行为与使用...

在C#中使用Lambda编写一个排序算法,比较其与传统排序算法的优劣

使用Lambda表达式编写排序算法在C#中,Lambda表达式可以用来简化排序逻辑的编写,尤其是在需要自定义排序规则时非常方便。以下示例展示了如何用Lambda表达式实现排序,并与传统排...

一日一技:python中的匿名函数 lambda用法

匿名函数lambda,语法如下:lambdaarguments:expression...

《回炉重造》——Lambda表达式_回炉重造是贬义词吗

前言Lambda表达式(LambdaExpression),相信大家对Lambda肯定是很熟悉的,毕竟我们数学上经常用到它,即λ。不过,感觉数学中的Lambda和编程语言中的Lamb...

取消回复欢迎 发表评论: