今天,正运动小助手给大家分享一下EtherCAT运动控制卡开发教程之Qt,主要介绍一下SCARA机械手正反解的建立。

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.机械手逆解指令ZAux_Direct_Connframe介绍。

4.机械手正解指令ZAux_Direct_Connreframe介绍。3.机械手逆解指令ZAux_Direct_Connframe介绍。

三、Qt开发实现Scara机械手的正逆解

1.SCARA机械手正逆解例程界面如下。

2.SCARA机械手模型如下。

3.在构造函数里面调用链接控制器的接口ZAux_OpenEth(),与控制器进行链接,链接成功后启动定时器监控控制器的轴信息。

MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow){int rint=0;//初始化窗体ui->setupUi(this);//定义按钮组并进行绑定btnGroup = new QButtonGroup(this);btnGroup->addButton(ui->ManualRev1,1);btnGroup->addButton(ui->ManualFwd1,2);btnGroup->addButton(ui->ManualRev2,3);btnGroup->addButton(ui->ManualFwd2,4);btnGroup->addButton(ui->ManualRev3,5);btnGroup->addButton(ui->ManualFwd3,6);btnGroup->addButton(ui->ManualRev4,7);btnGroup->addButton(ui->ManualFwd4,8);connect(btnGroup, SIGNAL(buttonPressed(int)), this, SLOT(ManualRev1_pressed(int)));connect(btnGroup, SIGNAL(buttonReleased(int)), this, SLOT(ManualRev1_released(int)));//系统启动自动连接控制器rint = ZAux_OpenEth("127.0.0.1", &g_handle);//如果链接成功则启动定时器if(rint==0){startTimer(50);}}

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

//定时器事件void MainWindow::timerEvent(QTimerEvent *event){QString Str;float TempData;//获取J1的位置数据ZAux_Direct_GetMpos(g_handle, ui->AxisIdJ1->text().toInt(), &TempData);Str = QString("%1").arg(TempData);ui->DposJ1->setText(Str);//获取J2的位置数据ZAux_Direct_GetMpos(g_handle, ui->AxisIdJ2->text().toInt(), &TempData);Str = QString("%1").arg(TempData);ui->DposJ2->setText(Str);//获取Ju的位置数据ZAux_Direct_GetMpos(g_handle, ui->AxisIdJu->text().toInt(), &TempData);Str = QString("%1").arg(TempData);ui->DposJu->setText(Str);//获取Jz的位置数据ZAux_Direct_GetMpos(g_handle, ui->AxisIdJz->text().toInt(), &TempData);Str = QString("%1").arg(TempData);ui->DposJz->setText(Str);//获取x的位置数据ZAux_Direct_GetMpos(g_handle, ui->AxisIdX->text().toInt(), &TempData);Str = QString("%1").arg(TempData);ui->DposX->setText(Str);//获取y的位置数据ZAux_Direct_GetMpos(g_handle, ui->AxisIdY->text().toInt(), &TempData);Str = QString("%1").arg(TempData);ui->DposY->setText(Str);//获取U的位置数据ZAux_Direct_GetMpos(g_handle, ui->AxisIdU->text().toInt(), &TempData);Str = QString("%1").arg(TempData);ui->DposU->setText(Str);//获取Z的位置数据ZAux_Direct_GetMpos(g_handle, ui->AxisIdZ->text().toInt(), &TempData);Str = QString("%1").arg(TempData);ui->DposZ->setText(Str);}

5.通过正逆解切换按钮实现Scara机械手正逆解的切换。

//建立机械手模型void MainWindow::on_ManipulModel_clicked(){int JogAxislist[4]={ui->AxisIdJ1->text().toInt(),ui->AxisIdJ2->text().toInt(),ui->AxisIdJu->text().toInt(),ui->AxisIdJz->text().toInt()};int AxisList[4]={ui->AxisIdX->text().toInt(),ui->AxisIdY->text().toInt(),ui->AxisIdU->text().toInt(),ui->AxisIdZ->text().toInt()};int MtypeJ=0,MtypeX=0;//初始化机械手参数ManipulParaInit();ZAux_Direct_GetMtype(g_handle,ui->AxisIdJ1->text().toInt(),&MtypeJ);ZAux_Direct_GetMtype(g_handle,ui->AxisIdX->text().toInt(),&MtypeX);//停止轴运动ZAux_Direct_Rapidstop(g_handle,2);if(MtypeJ == 33){ZAux_Direct_Base(g_handle,4,AxisList);ZAux_Direct_Connreframe(g_handle ,4 , AxisList, 1, 0, 4,JogAxislist);ui->ManipulModel->setText("正解模式");//修改手动按钮的文本信息ui->ManualRev1->setText("J1-");ui->ManualRev2->setText("J2-");ui->ManualRev3->setText("Ju-");ui->ManualRev4->setText("Jz-");ui->ManualFwd1->setText("J1+");ui->ManualFwd2->setText("J2+");ui->ManualFwd3->setText("Ju+");ui->ManualFwd4->setText("Jz+");}else{ZAux_Direct_Base(g_handle,4,JogAxislist);ZAux_Direct_Connframe(g_handle ,4 , JogAxislist, 1, 0, 4,AxisList);ui->ManipulModel->setText("逆解模式");ui->ManualRev1->setText("X-");ui->ManualRev2->setText("Y-");ui->ManualRev3->setText("U-");ui->ManualRev4->setText("Z-");ui->ManualFwd1->setText("X+");ui->ManualFwd2->setText("Y+");ui->ManualFwd3->setText("U+");ui->ManualFwd4->setText("Z+");}}

6.通过手动按钮,根据当前的机械手模式进行手动运动。
//按钮1按下

void MainWindow::ManualRev1_pressed(int Id){int MtypeJ,MtypeX;ZAux_Direct_GetMtype(g_handle,ui->AxisIdJ1->text().toInt(),&MtypeJ);ZAux_Direct_GetMtype(g_handle,ui->AxisIdX->text().toInt(),&MtypeX);//如果是逆解if(MtypeJ == 33){switch (Id){case 1: ZAux_Direct_Single_Vmove(g_handle,ui->AxisIdX->text().toInt(),-1);break;case 2: ZAux_Direct_Single_Vmove(g_handle,ui->AxisIdX->text().toInt(),1);break;case 3: ZAux_Direct_Single_Vmove(g_handle,ui->AxisIdY->text().toInt(),-1);break;case 4: ZAux_Direct_Single_Vmove(g_handle,ui->AxisIdY->text().toInt(),1);break;case 5: ZAux_Direct_Single_Vmove(g_handle,ui->AxisIdU->text().toInt(),-1);break;case 6: ZAux_Direct_Single_Vmove(g_handle,ui->AxisIdU->text().toInt(),1);break;case 7: ZAux_Direct_Single_Vmove(g_handle,ui->AxisIdZ->text().toInt(),-1);break;case 8: ZAux_Direct_Single_Vmove(g_handle,ui->AxisIdZ->text().toInt(),1);break;default:break;}}//如果是正解else if(MtypeX == 34){switch (Id){case 1: ZAux_Direct_Single_Vmove(g_handle,ui->AxisIdJ1->text().toInt(),-1);break;case 2: ZAux_Direct_Single_Vmove(g_handle,ui->AxisIdJ1->text().toInt(),1);break;case 3: ZAux_Direct_Single_Vmove(g_handle,ui->AxisIdJ2->text().toInt(),-1);break;case 4: ZAux_Direct_Single_Vmove(g_handle,ui->AxisIdJ2->text().toInt(),1);break;case 5: ZAux_Direct_Single_Vmove(g_handle,ui->AxisIdJu->text().toInt(),-1);break;case 6: ZAux_Direct_Single_Vmove(g_handle,ui->AxisIdJu->text().toInt(),1);break;case 7: ZAux_Direct_Single_Vmove(g_handle,ui->AxisIdJz->text().toInt(),-1);break;case 8: ZAux_Direct_Single_Vmove(g_handle,ui->AxisIdJz->text().toInt(),1);break;default:break;}}}//按钮1松开void MainWindow::ManualRev1_released(int Id){int MtypeJ,MtypeX;ZAux_Direct_GetMtype(g_handle,ui->AxisIdJ1->text().toInt(),&MtypeJ);ZAux_Direct_GetMtype(g_handle,ui->AxisIdX->text().toInt(),&MtypeX);//如果是逆解if(MtypeJ == 33){switch (Id){case 1: ZAux_Direct_Single_Cancel(g_handle,ui->AxisIdX->text().toInt(),2);break;case 2: ZAux_Direct_Single_Cancel(g_handle,ui->AxisIdX->text().toInt(),2);break;case 3: ZAux_Direct_Single_Cancel(g_handle,ui->AxisIdY->text().toInt(),2);break;case 4: ZAux_Direct_Single_Cancel(g_handle,ui->AxisIdY->text().toInt(),2);break;case 5: ZAux_Direct_Single_Cancel(g_handle,ui->AxisIdU->text().toInt(),2);break;case 6: ZAux_Direct_Single_Cancel(g_handle,ui->AxisIdU->text().toInt(),2);break;case 7: ZAux_Direct_Single_Cancel(g_handle,ui->AxisIdZ->text().toInt(),2);break;case 8: ZAux_Direct_Single_Cancel(g_handle,ui->AxisIdZ->text().toInt(),2);break;default:break;}}//如果是正解else if(MtypeX == 34){ZAux_Direct_Single_Cancel(g_handle,ui->AxisIdJ1->text().toInt(),2);switch (Id){case 1: ZAux_Direct_Single_Cancel(g_handle,ui->AxisIdJ1->text().toInt(),2);break;case 2: ZAux_Direct_Single_Cancel(g_handle,ui->AxisIdJ1->text().toInt(),2);break;case 3: ZAux_Direct_Single_Cancel(g_handle,ui->AxisIdJ2->text().toInt(),2);break;case 4: ZAux_Direct_Single_Cancel(g_handle,ui->AxisIdJ2->text().toInt(),2);break;case 5: ZAux_Direct_Single_Cancel(g_handle,ui->AxisIdJu->text().toInt(),2);break;case 6: ZAux_Direct_Single_Cancel(g_handle,ui->AxisIdJu->text().toInt(),2);break;case 7: ZAux_Direct_Single_Cancel(g_handle,ui->AxisIdJz->text().toInt(),2);break;case 8: ZAux_Direct_Single_Cancel(g_handle,ui->AxisIdJz->text().toInt(),2);break;default:break;}}}

四、例程移植到Linux设备上

1.Linux对应架构的库复制到项目文件夹里面。

2.向新建的项目里面添加函数库的静态库。(libzmotion.so)

添加函数库1

添加函数库2

添加函数库3

3.重新编译即可运行。

效果运行图

五、调试与监控

编译运行例程,同时连接ZDevelop软件进行调试,对运动控制的轴参数和运动情况进行监控。

同时可以通过机械手仿真工具ZRobotView,对机械手进行仿真测试。

1.ZDevelop软件监控机械手参数。

(1)例程效果图。

(2)关节轴Mtype=33,表示机械手为逆解模式。

(3)虚拟轴Mtype=34,表示机械手为正解模式。

2.ZRobotView的机械手仿真效果图。

3.操作真演示视频。

EtherCAT运动控制卡开发教程之Qt(下):SCARA机械手正反解的建立

本次,正运动技术EtherCAT运动控制卡开发教程之Qt(下):SCARA机械手正反解的建立,就分享到这里。

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

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

EtherCAT运动控制卡开发教程之Qt(下):SCARA机械手正反解的建立相关推荐

  1. EtherCAT运动控制卡开发教程之Qt(中):小线段连续轨迹加工、暂停与继续

    今天,正运动小助手给大家分享一下EtherCAT运动控制卡开发教程之Qt,主要介绍一下如何通过Qt编程实现小线段轨迹连续加工,暂停与继续. ECI2828运动控制卡的硬件介绍 ECI2828系列控制卡 ...

  2. EtherCAT运动控制卡开发教程之python

    众所周知,Python作为一门面向对象的新兴开发语言,具有非常完善的基础代码库,更注重实用,同时代码可读极强,编写完程序即可直接运行,被越来越多的人广泛将它用于机器视觉和自动化控制. 今天正运动技术与 ...

  3. 运动控制卡的函数库与Linux,运动控制卡应用开发教程之ROS(下)

    在正式学习之前,我们先了解一下正运动技术的运动控制卡ECI2418和ECI2618.这两款产品分别是4轴,6轴运动控制卡. ECI2418支持4轴脉冲输入与编码器反馈,板载24点输入,16点输出,2A ...

  4. python 运动控制卡_运动控制卡应用开发教程之Linux

    今天,正运动技术为大家分享一下运动控制卡应用开发教程之Linux.我们将从新建Qt项目,添加函数库讲起,再详细讲解函数的用法,最后通过一个连续插补例程讲解来了解项目实操. 在正式学习之前,我们先了解一 ...

  5. 运动控制卡应用开发教程之VC6.0

    今天,我们来讲解一下正运动技术运动控制卡应用开发教程之VC6.0. 在正式学习之前,我们先了解一下正运动技术的运动控制卡ECI2418和ECI2618.这两款产品分别是4轴,6轴运动控制卡. ECI2 ...

  6. 运动控制卡应用开发教程之MATLAB

    今天,正运动小助手给大家分享一下运动控制卡应用开发教程之MATLAB.  一 ECI2828硬件介绍 ECI2828系列运动控制卡支持多达16 轴直线插补.任意圆弧插补.空间圆弧.螺旋插补.电子凸轮. ...

  7. wince 开发_正运动技术运动控制卡应用开发教程之Python

    众所周知,Python作为一门面向对象的新兴开发语言,具有完善的基础代码库,实用性与代码可读性强,被越来越多的人应用于智能装备的运动控制. 今天正运动技术与大家分享一下运动控制卡应用开发教程之Pyth ...

  8. 运动控制卡应用开发教程之LabVIEW

    今天,我们来讲解一下正运动技术运动控制卡应用开发教程之LabVIEW. 在正式学习之前,我们先了解一下正运动技术的运动控制卡ECI2418和ECI2618.这两款产品分别是4轴,6轴运动控制卡. EC ...

  9. ​Unity 2D游戏开发教程之2D游戏的运行效果

    ​Unity 2D游戏开发教程之2D游戏的运行效果 2D游戏的运行效果 本章前前后后使用了很多节的篇幅,到底实现了怎样的一个游戏运行效果呢?或者说,游戏中的精灵会不会如我们所想的那样运行呢?关于这些疑 ...

  10. iOS 9应用开发教程之ios9的视图

    iOS 9应用开发教程之ios9的视图 了解IOS9的视图 在iPhone或者iPad中,用户看到的和摸到的都是视图.视图是用户界面的重要组成元素.本节将主要讲解ios9视图的添加.删除以及位置和大小 ...

最新文章

  1. 通过构建城市来解释HTML,CSS和JavaScript之间的关系
  2. 算法---------搜索旋转排序数组
  3. C# 通用Clone
  4. python调用Shell脚本:os.system(cmd)或os.popen(cmd),
  5. 吃透了这些Redis知识点,面试官一定觉得你很NB
  6. Oracle分页排序数据混乱原因及解决
  7. 10个可以快速用Python进行数据分析的小技巧
  8. php curl实现get请求,PHP中使用curl实现Get和Post请求 | 严佳冬
  9. dev控件swiftplot图滚动方法_无限轮播图使用Scroller就这么简单
  10. hadoop:Secondary NameNode 它究竟有什么作用?
  11. 不要时刻忘记保持微笑
  12. Apache Calcite介绍
  13. 没做好这些准备,千万不要婚前同居!!
  14. 如何写linux软件专利,Linux之父:软件专利和方法专利都挺扯淡
  15. SWUST#954: 单链表的链接
  16. 当你半夜失眠时,玩手机越玩越精神怎么办
  17. 亚马逊的规则你知道多少
  18. 虚拟机Linux系统无法联网的解决方法
  19. python做用友财务报表_用友财务软件怎样生成财务报表?
  20. python学习——廖雪峰网站

热门文章

  1. wsimport命令生成webService java客户端代码
  2. 你离技术大牛就只差这10个优质公众号!
  3. JAVA 解析json字符串常用方法
  4. Vue2.0 Vue组件库
  5. ydui时间组件报错nvalid prop: custom validator check failed for prop “startDate“.
  6. ArcGIS使用DEM数据划定汇水区具体步骤过程
  7. JanusGraph概述
  8. 考UCPM产品经理证书是否值得?
  9. 最全的国内外电子书籍网站合集
  10. 中国的KNX 智能家居系统,将实现最高级别的安全保障!