今天,正运动小助手给大家分享一下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的机械手仿真效果图。
本次,正运动技术ethercat运动控制卡开发教程之qt(下):scara机械手正反解的建立,就分享到这里。
看看你是否上榜,兰和智能锁帮你解决!
历时24个月,300人研发团队,vivo发布VI ISP芯片!手机摄影进入硬件级算法时代
海尔生物业绩持续改善 成功“圆梦”科创板
2018年12月破产清算后首次发布新品,预示着金立即将“复活”?
UPS电源的运作框图
Qt开发实现SCARA机械手正反解的建立
人工智能产业标准化制定要来了
日本未来十年高达10GW的太阳能将为农业供电
2019Q2印度智能手机份额:小米依然领跑,三星位列第二
OPPO公布全新子品牌Reno宣传海报 Logo将换新
新能源汽车推荐 看看有没有你喜欢的款式吧
芯明天压电宏微复合运动平台的组成及特点
小米6处理器已确定?小米6处理器终极曝光
台积电:规划1万亿晶体管芯片封装策略
PCB Layout and SI设计问答集锦
MEMS市场简报:2013磁力计营业收入今年劲增16%
使用VFC制作简单的电容表
德尔福的新工厂将专门生产电动车电子零部件
如何在安防大数据时代让视频监控脱颖而出
关于FinFET与集成电路的对比分析介绍