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

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

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来发送连续插补指令。

//定时器3

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

{

//加入一段,每段可以有自己的ForceSpeed

ZAux_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的一个轴

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值