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

在正式学习之前,我们先了解一下正运动技术的运动控制卡ECI2418和ECI2618。这两款产品分别是4轴,6轴运动控制卡。

ECI2418支持4轴脉冲输入与编码器反馈,板载24点输入,16点输出,2AD,2DA,支持手轮接口,其中特定输出口支持高速PWM控制。ECI2618支持6轴脉冲输入与编码器反馈,板载24点输入,16点输出,2AD,2DA,支持手轮接口,其中特定输出口支持高速PWM控制。

ECI2418,ECI2618均使用同一套API函数,均支持C、C++、C#、LabVIEW、Python、Delphi等开发语言,支持VC6.0、VB6.0、Qt、.Net等平台,支持Windows、Linux、WinCE、iMac等操作系统。一新建Qt项目 添加函数库

1.新建Qt项目:点击“New Project”→“Qt Widgets Application”→“Choose”。

图1 新建Qt项目

2.找到正运动技术光盘资料里面的Linux系统的函数库。

图2 Linux系统64位库路径

3.将上面路径下的所有文件通过共享文件夹复制到刚刚新建的Qt项目中。

图3 复制函数库相关文件

4.在Qt项目中添加函数库。

A.右键项目,接着点击添加库。

图4 添加库1

B.选择外部库,接着点击下一步。

图5 添加库2

C.点击浏览,找到刚刚复制到项目中的库文件libzmotio.so,然后点击下一步直到完成。

图6 添加库3

5.在Qt项目中添加相关头文件和源文件(zmotion.h、zmcaux.h、zmcaux.cpp)。

A.右键Headers/Sources文件夹,点击添加现有文件。

图7 添加头文件

B.在弹出的界面中找到相关文件,并依次添加。

图8 选择文件

6.在mainwindow.h中添加#include “zmotion.h”、#include “zmcux.h”和定义控制器的连接句柄g_handle,至此,项目新进完成。

图9 声明头文件二查看PC函数手册 了解其用法

我们在PC项目开发的过程中,经常用到PC函数库,因此,需要查看PC函数手册来了解新函数的用法。

比如在接下来的项目实战中,会用到一些新的函数接口。我们先来看一下这些函数接口的用法。

1.连续连续插补指令的用法。

图10 连续插补指令用法

2.拐角模式设置指令的用法。

注意:这里的拐角模式设置,只是设置了一个模式。像拐角减速设置,还需要设置开始减速角度和结束减速角度等具体使用方法请参考下面的例程讲解。

图11 拐角模式设置指令用法

3.获取控制器缓冲区剩余的缓冲数量指令的用法。

注意:在发送插补指令前,需要先判断缓冲区是否有剩余,这样才能保证运动指令发送成功。

图12 拐角模式设置指令用法三项目实操连续插补例程

1.例程以建立板卡的连接,执行运动距离数组“destdis[120][5]”里面的120段点位运动为加工目标。

图13 连续插补例程

图14 destdis数组

2.例程流程图。

图15 例程流程图

3.通过连接按钮的槽函数去调用“ZAux_OpenEth()”连接控制器,获取控制器连接句柄,连接成功后并对轴参数初始化。//链接按钮槽函数void MainWindow::on_Open_clicked(){int32 iresult;char * tmp_buff = new char[16];QString str;QString str_title;//从下拉框中获取IP地址str = ui->comboBox_IP->currentText();QByteArray ba = str.toLatin1();tmp_buff = ba.data();//链接控制器iresult = ZAux_OpenEth(tmp_buff,&g_handle);if(0 == iresult){str_title += tmp_buff;setWindowTitle(str_title);}else{setWindowTitle('no link!');return ;}//开起定时器id1=startTimer(100);id2=startTimer(50);//初始化轴参数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); //减速度}}

4.通过定时器1和2更新控制器轴信息和运动状态。//定时器void MainWindow::timerEvent(QTimerEvent *event){//定时器1:获取并更新轴位置信息if(event->timerId() == id1){QString Xpos1,Ypos1,Zpos1,Upos1;QString Curspeed;float showpos[4] ={0};float curspeed =0;ZAux_Direct_GetDpos( g_handle,0,&showpos[0]);ZAux_Direct_GetDpos( g_handle,1,&showpos[1]);ZAux_Direct_GetDpos( g_handle,2,&showpos[2]);ZAux_Direct_GetDpos( g_handle,3,&showpos[3]);ZAux_Direct_GetVpSpeed( g_handle,0,&curspeed);Xpos1=Xpos1.sprintf('X:%.2f',showpos[0]);Ypos1=Ypos1.sprintf('Y:%.2f',showpos[1]);Zpos1=Zpos1.sprintf('Z:%.2f',showpos[2]);Upos1=Upos1.sprintf('U:%.2f',showpos[3]);Curspeed=Curspeed.sprintf('%.2f',curspeed);ui->Xpos->setText(Xpos1);ui->Ypos->setText(Ypos1);ui->Zpos->setText(Zpos1);ui->Upos->setText(Upos1);ui->Curspeed->setText(Curspeed);}//定时器2:获取并更新轴运动信息if(event->timerId() == id2){int status=0, rembuff=0, curmark=0;//判断主轴状态(即BASE的第一个轴)ZAux_Direct_GetIfIdle(g_handle,0,&status);if (status == -1){ui->motion_state->setText('停止中' );}else{ui->motion_state->setText('运动中' );}QString str='';//判断存放直线的剩余缓冲ZAux_Direct_GetRemain_LineBuffer(g_handle,0,&rembuff);str=str.sprintf('%d',rembuff);ui->rem_buff->setText(str);//判断当前运动到第几条运动,ZAux_Direct_GetMoveCurmark(g_handle,0,&curmark);str=str.sprintf('%d',curmark);ui->current_mark->setText(str);}}

5.通过启动按钮的槽函数来设置拐角模式及拐角参数,设置插补运动参数,并启动定时器3来发送连续插补指令。//启动按钮槽函数void MainWindow::on_Onstart_clicked(){int corner_mode = 0;int axislist[4] = {0,1,2,3};//运动BASE轴列表QString str;//选择参与运动的轴,第一个轴为主轴,插补参数全用主轴参数ZAux_Direct_Base(g_handle,4,axislist);str = ui->m_speed->text();m_speed = str.toFloat();ZAux_Direct_SetSpeed(g_handle,axislist[0],m_speed); //速度str = ui->m_acc->text();m_acc = str.toFloat();ZAux_Direct_SetAccel(g_handle,axislist[0],m_acc); //加速度str = ui->m_dec->text();m_dec = str.toFloat();ZAux_Direct_SetDecel(g_handle,axislist[0],m_dec); //减速度//拐角模式设置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],1);//设置起始速度 ,拐角减速由 运动速度-起始速度 线性减速的str = ui->m_lspeed->text();m_lspeed = str.toFloat();ZAux_Direct_SetLspeed(g_handle,axislist[0],m_lspeed);//开始减速角度和结束减速角度,转换为弧度str = ui->m_startang->text();m_startang = str.toFloat();ZAux_Direct_SetDecelAngle(g_handle,axislist[0],m_startang*3.14/180);str = ui->m_stopang->text();m_stopang = str.toFloat();ZAux_Direct_SetStopAngle(g_handle,axislist[0],m_stopang*3.14/180);//设置小圆限速最小半径str = ui->m_fullradius->text();m_fullradius = str.toFloat();ZAux_Direct_SetFullSpRadius(g_handle,axislist[0],m_fullradius);//设置拐角半径str = ui->m_zsmooth->text();m_zsmooth = str.toFloat();ZAux_Direct_SetZsmooth(g_handle,axislist[0],m_zsmooth);//设置MARK = 0 ,来通过读取CURMARK实现判断当前执行到那里ZAux_Direct_SetMovemark(g_handle,axislist[0],0);g_curseges = 0;//打开示波器ZAux_Trigger(g_handle);id3=startTimer(100);}

6.通过定时器3来发送连续插补指令。//定时器3void MainWindow::timerEvent(QTimerEvent *event){if(event->timerId() == id3){int iresult = 0;int iremain = 2;for (int i = 0 ; i < 5; i++){if(g_curseges >= LEGS_MAX) //是否发送完所有指令{killTimer(id3);return;}iresult = ZAux_Direct_GetRemain_LineBuffer(g_handle, 0, &iremain);if(iremain > 2){//加入一段,每段可以有自己的ForceSpeedZAux_Direct_SetForceSpeed(g_handle, 0, destdis[g_curseges][4]);ZAux_Direct_MoveAbsSp(g_handle, 4, destdis[g_curseges]);g_curseges++;}}}}

7.通过停止按钮的槽函数来停止轴运动,并停止定时器3。//停止按钮插函数void MainWindow::on_stop_clicked(){if(NULL == g_handle){setWindowTitle('链接断开');return ;}killTimer(id3);ZAux_Direct_Singl_Cancel(g_handle,0,2); //停止主轴 BASE的一个轴}

8.通过清零按钮的槽函数来对各个轴的坐标进行清零。//清零按钮槽函数void MainWindow::on_pushButton_5_clicked(){for (int i=0;i<4;i++){ZAux_Direct_SetDpos(g_handle,i,0);//设置为零点}}

9.最后编译运行查看效果。

A.修改运动距离数组“destdis[120][5]”的前面4段运动参数,打开自动倒角,通过ZDevelop软件的示波器查看效果。

图16 destdis数组

图17 例程运行截图

图18 自动倒角位置波形图

B.修改运动距离数组“destdis[120][5]”的前面4段运动参数,通过示波器查看连续插补加合适的拐角减速的速度波形。

图19 destdis数组

图20 例程运行截图

图21 拐角减速的速度波形图

python 运动控制卡_运动控制卡应用开发教程之Linux相关推荐

  1. 麦语言和python区别_麦语言编程教程之二:解决两大类问题

    所有的编程都可以归结为以下三类: 第一,表达式问题.以当前视角,给出变量的计算公式.所谓的当前视角,就是不考虑位置关系,把那个位置当作是当前位置.事实上,前面那张表中任何一个方格的数据,都是把这个方格 ...

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  9. 小甲鱼python全部视频_小甲鱼全套教程之Python系列视频教程

    Python 当前位置:主页 > 编程教程 > Python > 小甲鱼全套教程之Python系列视频教程 小甲鱼全套教程之Python系列视频教程 教程大小:   发布时间:201 ...

最新文章

  1. 卷积神经网络模型解读汇总——LeNet5,AlexNet、ZFNet、VGG16、GoogLeNet和ResNet
  2. 计算机类专计算机网络基础与应用,2016年秋季学期计算机专业《计算机网络基础(专)》第一次语音答疑.ppt...
  3. python编程有哪些-Python编程开发都有哪些限制
  4. Windows下的反弹shell
  5. L1-038. 新世界
  6. ML.NET 0.10特性简介
  7. linux操作系统中查看网络信息的命令,Linux查看系统信息命令盘点
  8. 技术变革解锁人文新维度
  9. OpenStack 开放云平台
  10. 5G应用前景广泛 不止是下电影更快,还能做这些事……
  11. 如何算计算机主机地址,ip地址怎么算子网掩码_根据ip地址算子网掩码
  12. 【转】C++后台开发应该读的书
  13. win10U盘重装无法进行,一直转圈加载,不进入安装界面超过半小时
  14. ​关于百度网盘扩容的一点经验分享2022
  15. unity ,color组件
  16. Ajax请求传递中文参数
  17. 小程序为什么要办理ICP许可证
  18. Cesium 实现卫星效果
  19. 双向绑定原理(个人理解)
  20. TMB简介(肿瘤突变负荷 tumor mutation burden, 简称TMB)

热门文章

  1. 大型Solidworks装配设计与仿真工作站配置方案
  2. 雅虎高管解读财报 将在今年完成阿里资产剥离
  3. html+css(锚点的使用)
  4. ruby的DIR.pwd
  5. python 反三角函数下角度与弧度与正弦值的相互转换
  6. 华为设备流量抑制及风暴控制配置命令
  7. ESP8266-12F NodeMCU、MG90S舵机、Arduino IDE——制作家庭自用远程开关(手机遥控-仅关灯)
  8. 41-表单使用场景以及分类
  9. tcpdump manual 中文翻译
  10. Vue3.x 报 Uncaught TypeError:Object(...) is not a function( Vue3对象不是函数解决思路)