广工数控课设:平面凸轮的数控加工程序的编制



1.前言

网上数控课设多采用的是VB6.0编程的,感觉VB6.0已经好老的,软件的设计界面也不好看,设计逻辑感觉也是非常的脑残。所以分享一份基于QT的平面凸轮的数控课设(虽然QT是C++,但我基本上还是用了很多C编程)。完整的工程代码见文末。

2.软件界面

程序主界面
用户可以选择凸轮是什么类型的推杆,然后输入凸轮参数,选择保存参数,在选择凸轮的运动规律,点击生成轮廓就可以绘制出凸轮的曲线了,点击生成数控代码,就可以在代码生成区中生成凸轮的数控代码。

2.主程序设计与分析

2.1参数输入控件

效果就是在主界面上输入参数,然后点击按钮,将参数保存进来。
按钮用的是pushButton控件,然后要怎么建立ui文件和cpp文件之间的联系呢?这就要涉及到QT的信号与槽函数之间的关系了,具体实现方式如下:Qt七种信号与槽关联方式小结
按钮控件我用的是第四种方式。

参数输入的控件用的textline,支持一行文本的输入,传入的参数为字符串型的变量,所以我用QString类来传递和转换输入进来的参数。具体效果如下:
当然咯,你在使用某个类的时候,一定要在前面加上它的头文件#include <qstring.h>

//按下保存按钮获取各个参数
void MainWindow::on_pushButton_clicked()
{
    /*****数据读取*****/
    //推程运动角
    QString str1 =ui->tsport_angle->text();
    sport_angle =str1.toInt();
    //远休止角
    QString str2 =ui->far_angle->text();
    far_angle =str2.toInt();
    //回程运动角
    QString str3 =ui->hsort_angle->text();
    hsport_angle=str3.toInt();
    //近休止角
    QString str4=ui->near_angle->text();
    near_angle=str4.toInt();
    //基圆半径
    QString str5=ui->yradius->text();
    yradius=str5.toInt();
    //偏距
    QString str6=ui->offset->text();
    offset =str6.toInt();
    //滚子半径
    QString str7=ui->gradius->text();
    gradius=str7.toInt();
    //行程
    QString str8=ui->journey->text();
    journey =str8.toInt();
    qDebug() << "成功写入参数";
    QMessageBox::information(this, tr("成功"), tr("成功保存凸轮参数!"));
}

2.2生成凸轮轮廓

凸轮的运动规律选择有5种,具体可以看机械原理课本,分别是等速运动、等加速等减速、五次多项式、余弦加速度和正弦加速度。这里我选择的是5种都做出来。不同的运动规律的选择,我用的是comboBox控件,可以读取当前的判断选择的是那个运动的规律。
然后具体的实现过程也是利用转到槽建立槽函数,comboBox里面的内容改变了就会进入一次槽函数,然后在槽函数读取,这里我设定了两个个全局变量tui和hui,用来标定用户的凸轮推程和回程分别选择的是什么运动规律。


//推程算法选择(可以不用写的)直接在计算那获取索引值
void MainWindow::on_comboBox_currentIndexChanged(int index)
{
    qDebug() << "%d";
    if( ui->comboBox->currentIndex() == 0)
    {
        tui=0;
    }
    else if( ui->comboBox->currentIndex()==1)
    {
        tui=1;
    }
    else if( ui->comboBox->currentIndex()==2){
        tui=2;
    }
    else if( ui->comboBox->currentIndex()==3){
        tui=3;
    }
    else if( ui->comboBox->currentIndex()==4)
    {
        tui=4;
    }
}


//回程运动规律(可以不用写的)直接在计算那获取索引值
void MainWindow::on_comboBox_2_currentIndexChanged(int index)
{
     qDebug("%d",tui);
    if(ui->comboBox_2->currentIndex()== 0)
    {
        hui=0;
    }
    else if(ui->comboBox_2->currentIndex()==1)
    {
        hui=1;
    }
    else if(ui->comboBox_2->currentIndex()==2){
        hui=2;
    }
    else if(ui->comboBox_2->currentIndex()==3){
        hui=3;
    }
    else if(ui->comboBox_2->currentIndex()==4)
    {
        hui=4;
    }
}

然后就要生成理论廓线和实际工作廓线。具体的方法用的方法是凸轮的解析法,按照选择的运动规律,计算推杆的行程s和s对角度的微分(自己求导,然后用公式在程序里面表达出来)。具体的步骤可以参照机械原理课本的案例,照着它来一步一步的编程序,先写一个运动规律,其余的运动规律也会很好写了。

实现过程如下:

  1. 使用pushButton控件,然后建立槽函数
//计算各个参数并生成轮廓曲线的槽函数
void MainWindow::on_pushButton_3_clicked()
{
}
  1. 数据读取
    为了防止用户没有点击上面的保存参数按钮,而是直接点击生成轮廓按钮,导致出现了错误,所以我在这在读取一遍数据,代码跟上面的一样就行了。

  2. 行程s的计算
    利用for循环不断的计算对应角度的s,还有ds,这里我推程角,远休止角,回程角和近休止角都是从0开始算到最大值的。
    放在槽函数的程序如下,利用switch语句来判断选择的是哪种运动规律:

float x[360],y[360],x1[360],y1[360];

    float s1[360],s2[360],s3[360],s4[360];
    float dx1[360],dx2[360],dx3[360],dx4[360];
    float dy1[360],dy2[360],dy3[360],dy4[360];
    float ds1[360],ds2[360],ds3[360],ds4[360]; //对心平底凸轮


    s0=sqrt(yradius*yradius-offset*offset); //计算s0

    //推程的算法计算
    switch (tui) {
    case 0:
        qDebug()<<"推程运动规律:等速运动";
        for (int k=0;k<sport_angle;k++) {
              s1[k]=((k*pi) /(sport_angle*pi))*journey;
              ds1[k]=journey/(sport_angle*pi);
              dx1[k]=(journey/(sport_angle*pi))*sin(k*pi)+(s0+s1[k])*cos(k*pi);
              dy1[k]=(journey/(sport_angle*pi))*cos(k*pi)-(s0+s1[k])*sin(k*pi);
        }
        break;
    case 1:
        qDebug()<<"推程运动规律:等加速等减速";
        for (int k=0;k<sport_angle;k++) {
            if(k < sport_angle/2){
                s1[k]=(pow((k*pi),2)/pow((sport_angle*pi),2))*2*journey;
                ds1[k]=4*journey*(k*pi)/pow(sport_angle*pi,2);
                dx1[k]=(4*journey*(k*pi)/pow(sport_angle*pi,2))*sin(k*pi)+(s0+s1[k])*cos(k*pi);
                dy1[k]=(4*journey*(k*pi)/pow(sport_angle*pi,2))*cos(k*pi)-(s0+s1[k])*sin(k*pi);
            }
            else {
                s1[k]=journey-(pow((sport_angle*pi-k*pi),2)/pow((sport_angle*pi),2))*2*journey;
                ds1[k]=4*journey*(sport_angle*pi-k*pi)/pow(sport_angle*pi,2);
                dx1[k]=(4*journey*(sport_angle*pi-k*pi)/pow(sport_angle*pi,2))*sin(k*pi)+(s0+s1[k])*cos(k*pi);
                dy1[k]=(4*journey*(sport_angle*pi-k*pi)/pow(sport_angle*pi,2))*cos(k*pi)-(s0+s1[k])*sin(k*pi);
            }
        }
        break;
    case 2: qDebug()<<"推程运动规律:五次多项式";
        for (int k=0;k<sport_angle;k++) {
              s1[k]=(10*journey*pow((k*pi),3))/(pow((sport_angle*pi),3))-15*journey*pow((k*pi),4)/pow((sport_angle*pi),4)+6*journey*pow((k*pi),5)/pow((sport_angle*pi),5);
              ds1[k]=30*journey*pow(k*pi,2)/pow((sport_angle*pi),3)-60*journey*pow(k*pi,3)/pow((sport_angle*pi),4)+30*journey*pow(k*pi,4)/pow((sport_angle*pi),5);
              dx1[k]=(30*journey*pow(k*pi,2)/pow((sport_angle*pi),3)-60*journey*pow(k*pi,3)/pow((sport_angle*pi),4)+30*journey*pow(k*pi,4)/pow((sport_angle*pi),5))*sin(k*pi)+(s0+s1[k])*cos(k*pi);
              dy1[k]=(30*journey*pow(k*pi,2)/pow((sport_angle*pi),3)-60*journey*pow(k*pi,3)/pow((sport_angle*pi),4)+30*journey*pow(k*pi,4)/pow((sport_angle*pi),5))*cos(k*pi)-(s0+s1[k])*sin(k*pi);
        }
        break;
    case 3:
        qDebug()<<"推程运动规律:余弦加速度";
        for (int k=0;k<sport_angle;k++) {
              s1[k]=(1-(cos(3.14*(k*pi)/(sport_angle*pi))))*journey/2;
              ds1[k]=3.14159*journey*(sin(3.14*(k*pi)/(sport_angle*pi)))/(2*sport_angle*pi);
              dx1[k]=(3.14159*journey*(sin(3.14*(k*pi)/(sport_angle*pi)))/(2*sport_angle*pi))*sin(k*pi)+(s0+s1[k])*cos(k*pi);
              dy1[k]=(3.14159*journey*(sin(3.14*(k*pi)/(sport_angle*pi)))/(2*sport_angle*pi))*cos(k*pi)-(s0+s1[k])*sin(k*pi);
        }
        break;
    case 4:
        qDebug()<<"推程运动规律:正弦加速度";
        for (int k=0;k<sport_angle;k++) {
              s1[k]=((k*pi)/(sport_angle*pi)-sin(2*3.14159*(k*pi)/(sport_angle*pi))/(2*3.14159))*journey;
              ds1[k]=journey*(1-cos(2*k*pi))/(sport_angle*pi);
              dx1[k]=(journey*(1-cos(2*k*pi))/(sport_angle*pi))*sin(k*pi)+(s0+s1[k])*cos(k*pi);
              dy1[k]=(journey*(1-cos(2*k*pi))/(sport_angle*pi))*cos(k*pi)-(s0+s1[k])*sin(k*pi);
        }
        break;
    default:
        break;
    }

    //远休止算法计算
    for (int k=0;k<far_angle;k++) {
        s2[k]=journey;
        ds2[k]=0;
        dx2[k]=(yradius+s2[k])*cos(sport_angle*pi+k*pi);
        dy2[k]=-(yradius+s2[k])*sin(sport_angle*pi+k*pi);
    }


   //回程的算法计算
    switch (hui) {
    case 0:
        qDebug()<<"回程运动规律:等速运动";
        for (int k=0;k<hsport_angle;k++) {
            s3[k]=journey*(1-(k*pi)/(hsport_angle*pi));
            ds3[k]=-journey/(hsport_angle*pi);
            dx3[k]=(-journey/(hsport_angle*pi))*sin(sport_angle*pi+far_angle*pi+k*pi)+(s0+s3[k])*cos(sport_angle*pi+far_angle*pi+k*pi);
            dy3[k]=(-journey/(hsport_angle*pi))*cos(sport_angle*pi+far_angle*pi+k*pi)-(s0+s3[k])*sin(sport_angle*pi+far_angle*pi+k*pi);
        }
        break;
    case 1:
        qDebug()<<"回程运动规律:等加速等减速";
        for (int k=0;k<hsport_angle;k++) {
            if(k< hsport_angle/2){
                s3[k]=journey-(pow((k*pi),2)/pow((hsport_angle*pi),2))*2*journey;
                ds3[k]=-4*journey*(k*pi)/pow(hsport_angle*pi,2);
                dx3[k]=(-4*journey*(k*pi)/pow(hsport_angle*pi,2))*sin(sport_angle*pi+far_angle*pi+k*pi)+(s0+s3[k])*cos(sport_angle*pi+far_angle*pi+k*pi);
                dy3[k]=(-4*journey*(k*pi)/pow(hsport_angle*pi,2))*cos(sport_angle*pi+far_angle*pi+k*pi)-(s0+s3[k])*sin(sport_angle*pi+far_angle*pi+k*pi);
            }
            else {
                s3[k]=(pow((hsport_angle*pi-k*pi),2)/pow((hsport_angle*pi),2))*2*journey;
                ds3[k]=-4*journey*(hsport_angle*pi-k*pi)/pow(hsport_angle*pi,2);
                dx3[k]=(-4*journey*(hsport_angle*pi-k*pi)/pow(hsport_angle*pi,2))*sin(sport_angle*pi+far_angle*pi+k*pi)+(s0+s3[k])*cos(sport_angle*pi+far_angle*pi+k*pi);
                dy3[k]=(-4*journey*(hsport_angle*pi-k*pi)/pow(hsport_angle*pi,2))*cos(sport_angle*pi+far_angle*pi+k*pi)-(s0+s3[k])*sin(sport_angle*pi+far_angle*pi+k*pi);
            }
        }
        break;
    case 2:
        qDebug()<<"回程运动规律:五次多项式";
        for (int k=0;k<hsport_angle;k++) {
            s3[hsport_angle-1-k]=(10*journey*pow((k*pi),3))/(pow((hsport_angle*pi),3))-15*journey*pow((k*pi),4)/pow((hsport_angle*pi),4)+6*journey*pow((k*pi),5)/pow((hsport_angle*pi),5);
        }
        for (int k=0;k<hsport_angle;k++) {
            ds3[k]=30*journey*pow(k*pi,2)/pow((hsport_angle*pi),3)-60*journey*pow(k*pi,3)/pow((hsport_angle*pi),4)+30*journey*pow(k*pi,4)/pow((hsport_angle*pi),5);
            dx3[k]=(30*journey*pow(k*pi,2)/pow((hsport_angle*pi),3)-60*journey*pow(k*pi,3)/pow((hsport_angle*pi),4)+30*journey*pow(k*pi,4)/pow((hsport_angle*pi),5))*sin(sport_angle*pi+far_angle*pi+k*pi)+(yradius+s3[k])*cos(sport_angle*pi+far_angle*pi+k*pi);
            dy3[k]=(30*journey*pow(k*pi,2)/pow((hsport_angle*pi),3)-60*journey*pow(k*pi,3)/pow((hsport_angle*pi),4)+30*journey*pow(k*pi,4)/pow((hsport_angle*pi),5))*cos(sport_angle*pi+far_angle*pi+k*pi)-(yradius+s3[k])*sin(sport_angle*pi+far_angle*pi+k*pi);
        }
        break;
    case 3:
        qDebug()<<"回程运动规律:余弦加速度";
        for (int k=0;k<hsport_angle;k++) {
            s3[k]=(1+(cos(3.14159*(k*pi)/(hsport_angle*pi))))*journey/2;
            ds3[k]=-3.14159*journey*(sin(3.14*(k*pi)/(hsport_angle*pi)))/(2*hsport_angle*pi);
            dx3[k]=(-3.14159*journey*(sin(3.14*(k*pi)/(hsport_angle*pi)))/(2*hsport_angle*pi))*sin(sport_angle*pi+far_angle*pi+k*pi)+(s0+s3[k])*cos(sport_angle*pi+far_angle*pi+k*pi);
            dy3[k]=(-3.14159*journey*(sin(3.14*(k*pi)/(hsport_angle*pi)))/(2*hsport_angle*pi))*cos(sport_angle*pi+far_angle*pi+k*pi)-(s0+s3[k])*sin(sport_angle*pi+far_angle*pi+k*pi);
        }
        break;
    case 4:
        qDebug()<<"回程运动规律:正弦加速度";
        for (int k=0;k<hsport_angle;k++) {
            s3[k]=(1-(k*pi)/(hsport_angle*pi)+sin(2*3.14159*(k*pi)/(hsport_angle*pi))/(2*3.14159))*journey;
            ds3[k]=-journey*(1-cos(2*k*pi))/(hsport_angle*pi);
            dx3[k]=(-journey*(1-cos(2*k*pi))/(hsport_angle*pi))*sin(sport_angle*pi+far_angle*pi+k*pi)+(s0+s3[k])*cos(sport_angle*pi+far_angle*pi+k*pi);
            dy3[k]=(-journey*(1-cos(2*k*pi))/(hsport_angle*pi))*cos(sport_angle*pi+far_angle*pi+k*pi)-(s0+s3[k])*sin(sport_angle*pi+far_angle*pi+k*pi);
        }
        break;
    default:
        break;
    }

    //近休止算法计算
    for (int k=0;k<near_angle;k++) {
        s4[k]=0;
        ds4[k]=0;
        dx4[k]=(yradius+s4[k])*cos(sport_angle*pi+far_angle*pi+hsport_angle*pi+k*pi);
        dy4[k]=-(yradius+s4[k])*sin(sport_angle*pi+far_angle*pi+hsport_angle*pi+k*pi);
    }
  1. 理论廓线和实际廓线的计算
    这个按照书本的解析法来写,从0到360°,不过写的时候要注意过渡点的计算,我的程序是不计算的最大角度,而是最大角度作为下一段的初始角度,这样就能够实现均匀的过度了。
        //计算理论廓线
        for (int i=0;i<=360;i++) {
           if(i>=0 &&i<sport_angle)
            {
                x[i]=(s0+s1[i])*sin(i*pi)+offset*cos(i*pi);
                y[i]=(s0+s1[i])*cos(i*pi)-offset*sin(i*pi);

            }
            else if ((i>=sport_angle) && i<(sport_angle+far_angle)) {
                x[i]=(yradius+s2[i-sport_angle])*sin(i*pi);
                y[i]=(yradius+s2[i-sport_angle])*cos(i*pi);
            }
            else if (i>=(sport_angle+far_angle) && i<(sport_angle+far_angle+hsport_angle)) {
                x[i]=(yradius+s3[i-sport_angle-far_angle])*sin(i*pi);
                y[i]=(yradius+s3[i-sport_angle-far_angle])*cos(i*pi);
            }
            else{
                x[i]=(yradius+s4[i-sport_angle-far_angle-hsport_angle])*sin(i*pi);
                y[i]=(yradius+s4[i-sport_angle-far_angle-hsport_angle])*cos(i*pi);
            }
           points[i]=QPointF(x[i]*3, -y[i]*3);
          }

        //计算工作廓线
        for (int i=0;i<=360;i++) {
            if(i>=0 && i<sport_angle)
            {
                x[0]=0;
                x1[i]=x[i]-(-dy1[i]/sqrt(pow(dx1[i],2)+pow(dy1[i],2)))*gradius;
                y1[i]=y[i]-(dx1[i]/sqrt(pow(dx1[i],2)+pow(dy1[i],2)))*gradius;
    //           qDebug("x%d:%f", i,x[0]);
    //           qDebug("y%d:%f", i,y[0]);
            }
            else if (i>=sport_angle && i<(sport_angle+far_angle)) {
                x1[i]=x[i]-gradius*(-dy2[i-sport_angle]/sqrt(pow(dx2[i-sport_angle],2)+pow(dy2[i-sport_angle],2)));
                y1[i]=y[i]-gradius*(dx2[i-sport_angle]/sqrt(pow(dx2[i-sport_angle],2)+pow(dy2[i-sport_angle],2)));
            }
            else if (i>=(sport_angle+far_angle) && i<(sport_angle+far_angle+hsport_angle)) {
                x1[i]=x[i]-gradius*(-dy3[i-sport_angle-far_angle]/sqrt(pow(dx3[i-sport_angle-far_angle],2)+pow(dy3[i-sport_angle-far_angle],2)));
                y1[i]=y[i]-gradius*(dx3[i-sport_angle-far_angle]/sqrt(pow(dx3[i-sport_angle-far_angle],2)+pow(dy3[i-sport_angle-far_angle],2)));
            }
            else{
                int k=i-sport_angle-far_angle-hsport_angle;
                x1[i]=x[i]-gradius*(-dy4[k]/sqrt(pow(dx4[k],2)+pow(dy4[k],2)));
                y1[i]=y[i]-gradius*(dx4[k]/sqrt(pow(dx4[k],2)+pow(dy4[k],2)));
            }
            kx1[i]=x1[i];
            ky1[i]=y1[i];
            points2[i]=QPointF(x1[i]*3, -y1[i]*3);
        }
  1. 凸轮曲线的绘制
    曲线的绘制利用的是QT中的 QPainter类,具体的使用可以参考这个:QPainter详解
    我设置的是两个画家,后来发现可以不用的,一个就行了,Qpen设置画笔,因为理论廓线是用虚线画的。整个图像的白色画布直接画了个矩形,然后根据事假的更新来控制绘画。

// 画图设置
void MainWindow::paintEvent(QPaintEvent *event)
{
    QPainter painter(this);
    QPainter painter2(this);
    QPixmap pixmap;
    QPen pen;

    painter.setRenderHint(QPainter::Antialiasing); // 启用抗锯齿效果
    painter.translate(568, 243); // 把坐标原点移动到 widget 的中心
//    qDebug("%d",width()/2+30);
//    qDebug("%d",height()/2-70);
    painter2.setRenderHint(QPainter::Antialiasing); // 启用抗锯齿效果
    painter2.translate(568, 243); // 把坐标原点移动到 widget 的中心

    //绘制画布,为避免刷新只启用一次
     painter.fillRect(QRect(-172, -172,390,400), QBrush(Qt::white));
     painter.drawRect(QRect(-172, -172,390,400));

     pixmap.load("D:/qt project/shukong/shukongsheji/1.bmp");
     painter.drawPixmap(120, 250,100, 100, pixmap);

     if(huabu==0)
     {
        huitu=1;
     }
     if(huabu==1)
     {
        huitu=0;
     }
    if(huitu==1){
        painter.save();
        pen.setStyle(Qt::DashLine);
        painter.setPen(pen);
        painter.drawPolygon(points, 360);
        painter.restore();
        painter.drawPolygon(points2, 360);
        huitu=0;
    }
    else {

    }
}

2.2数控代码的生成

利用的是按钮控件和textEdit控件,点击按钮然后在textEdit上输出数控代码,具体的代码如下:
这里的代码会有的长,一开始想字符串的拼接,但是嫌麻烦懒得搞了。然后后面知道了可以利用Qstring类来进行字符串的拼接和处理。有想法的可以试一下。

//数控代码生成按钮函数
void MainWindow::on_pushButton_4_clicked()
{ 

    ui->textEdit->clear(); //清空原有数据
    qDebug("%d",daobu);


    QInputDialog *inputDialog = new QInputDialog(this);
    bool getInfo;
    QString down = inputDialog->getText(this,"输入","请输入加工凸轮厚度",QLineEdit::Normal,"",&getInfo,Qt::WindowFlags(0),Qt::ImhNone);
    if(getInfo){
        houdu=down.toInt();
    }
        qDebug("%d",houdu);
    //机床启动代码
    ui->textEdit->insertPlainText("%0010\n");
    ui->textEdit->insertPlainText("G90 MO3 S"); //绝对坐标编程
    ui->textEdit->insertPlainText(QString::number(Spindle_speed));
    ui->textEdit->insertPlainText("\n");
    ui->textEdit->insertPlainText("G54 ");
    if(daobu==1){
     ui->textEdit->insertPlainText("G01 G41 X0 Y0 D01 Z10 F");
     ui->textEdit->insertPlainText(QString::number(Feed_rate));
     ui->textEdit->insertPlainText("\n");
     //走刀坐标输出
     //工件移动置加工起点,下刀
     ui->textEdit->insertPlainText("G01 X");
     ui->textEdit->insertPlainText(QString::number(kx1[0]));
     ui->textEdit->insertPlainText(" Y");
     ui->textEdit->insertPlainText(QString::number(ky1[0]));
     ui->textEdit->insertPlainText("\n");
     ui->textEdit->insertPlainText("Z-");
     ui->textEdit->insertPlainText(QString::number(houdu));
     ui->textEdit->insertPlainText("\n");

     //推程段的非圆曲线逼近
     for (int i=1;i<sport_angle;i++) {
          ui->textEdit->insertPlainText("G01 X");
          ui->textEdit->insertPlainText(QString::number(kx1[i]));
          ui->textEdit->insertPlainText(" Y");
          ui->textEdit->insertPlainText(QString::number(ky1[i]));
          ui->textEdit->insertPlainText("\n");
     }
     //远休止段的圆形加工,采用R指令
          ui->textEdit->insertPlainText("G02 X");
          ui->textEdit->insertPlainText(QString::number(kx1[180]));
          ui->textEdit->insertPlainText(" Y");
          ui->textEdit->insertPlainText(QString::number(ky1[180]));
          ui->textEdit->insertPlainText(" R");
          ui->textEdit->insertPlainText(QString::number(yradius+journey));
          ui->textEdit->insertPlainText("\n");
     //回程段的非圆曲线逼近
     for (int i=(sport_angle+far_angle);i<(sport_angle+far_angle+hsport_angle);i++) {
          ui->textEdit->insertPlainText("G01 X");
          ui->textEdit->insertPlainText(QString::number(kx1[i]));
          ui->textEdit->insertPlainText(" Y");
          ui->textEdit->insertPlainText(QString::number(ky1[i]));
          ui->textEdit->insertPlainText("\n");
      }
     //近休止段的圆形加工,采用R指令
          ui->textEdit->insertPlainText("G02 X");
          ui->textEdit->insertPlainText(QString::number(kx1[0]));
          ui->textEdit->insertPlainText(" Y");
          ui->textEdit->insertPlainText(QString::number(ky1[0]));
          ui->textEdit->insertPlainText(" R");
          ui->textEdit->insertPlainText(QString::number(yradius));
          ui->textEdit->insertPlainText("\n");
    } //右刀补
    else if(daobu==2){
        qDebug("右");
        ui->textEdit->insertPlainText("G01 G42 X0 Y0 D01 Z10 F");
        ui->textEdit->insertPlainText(QString::number(Feed_rate));
        ui->textEdit->insertPlainText("\n");
        //走刀坐标输出
        //工件移动置加工起点,下刀,默认加工深度为10
        ui->textEdit->insertPlainText("G01 X");
        ui->textEdit->insertPlainText(QString::number(kx1[0]));
        ui->textEdit->insertPlainText(" Y");
        ui->textEdit->insertPlainText(QString::number(ky1[0]));
        ui->textEdit->insertPlainText("\n");
        ui->textEdit->insertPlainText("Z-");
        ui->textEdit->insertPlainText(QString::number(houdu));
        ui->textEdit->insertPlainText("\n");
        //近休止段的圆形加工,采用R指令
        ui->textEdit->insertPlainText("G03 X");
        ui->textEdit->insertPlainText(QString::number(kx1[sport_angle+far_angle+hsport_angle]));
        ui->textEdit->insertPlainText(" Y");
        ui->textEdit->insertPlainText(QString::number(ky1[sport_angle+far_angle+hsport_angle]));
        ui->textEdit->insertPlainText(" R");
        ui->textEdit->insertPlainText(QString::number(yradius));
        ui->textEdit->insertPlainText("\n");
        //回程段的非圆曲线逼近
        for (int i=(sport_angle+far_angle+hsport_angle);i>(sport_angle+far_angle);i--) {
             ui->textEdit->insertPlainText("G01 X");
             ui->textEdit->insertPlainText(QString::number(kx1[i]));
             ui->textEdit->insertPlainText(" Y");
             ui->textEdit->insertPlainText(QString::number(ky1[i]));
             ui->textEdit->insertPlainText("\n");
         }
        //远休止段的圆形加工,采用R指令
        ui->textEdit->insertPlainText("G03 X");
        ui->textEdit->insertPlainText(QString::number(kx1[sport_angle]));
        ui->textEdit->insertPlainText(" Y");
        ui->textEdit->insertPlainText(QString::number(ky1[sport_angle]));
        ui->textEdit->insertPlainText(" R");
        ui->textEdit->insertPlainText(QString::number(yradius+journey));
        ui->textEdit->insertPlainText("\n");
        //推程段的非圆曲线逼近
        for (int i=sport_angle;i>0;i--) {
             ui->textEdit->insertPlainText("G01 X");
             ui->textEdit->insertPlainText(QString::number(kx1[i]));
             ui->textEdit->insertPlainText(" Y");
             ui->textEdit->insertPlainText(QString::number(ky1[i]));
             ui->textEdit->insertPlainText("\n");
        }
    }
    //解除刀补
    ui->textEdit->insertPlainText("G40 X0 Y0 Z10");
    ui->textEdit->insertPlainText("\n");
    //机床停止运行代码
    ui->textEdit->insertPlainText("M05 M30");
}

2.4一些附加功能

  1. 参数错误提示功能
//参数输入错误提示窗口
void MainWindow::onMessageBox()
{
        //含有为0的提示输入完整参数,都不为0则判断角度是否正确
       if (sport_angle==0 ||far_angle==0 || hsport_angle==0 || near_angle==0 ||yradius==0 )
       {
           QMessageBox::critical(this, "错误的参数", "请输入完整的参数",
                       QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes);
       }
       else{
           if(sport_angle+far_angle+hsport_angle+near_angle!=360){
               QMessageBox::critical(this, "错误的参数", "角度输入错误",
                           QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes);
           }
       }
}
  1. 清空功能
//清空数据
void MainWindow::on_pushButton_2_clicked()
{
     ui->textEdit->clear(); //清空数据
     huabu=1;
     update();//更新画图,重新画个白布进行填充
}
  1. 代码导出功能

用到的是QFileDialog这个类

//导出数控代码
void MainWindow::NCexport()
{

        QFileDialog dlg(this);

        //获取内容的保存路径
        QString fileName = dlg.getSaveFileName(this, tr("Save As"), "./", tr("Text File(*.txt)"));

        if( fileName == "" )
        {
            return;
        }

        //内容保存到路径文件
        QFile file(fileName);

        //以文本方式打开
        if( file.open(QIODevice::WriteOnly | QIODevice::Text) )
        {
            QTextStream out(&file); //IO设备对象的地址对其进行初始化

            out << ui->textEdit->toPlainText() << endl; //输出

            QMessageBox::information(this, tr("结束"), tr("成功保存到文件!"));

            file.close();
        }
        else
        {
            QMessageBox::warning(this, tr("错误"), tr("保存文件失败!"));
        }
}

4.代码一键复制功能
用到的是 QClipboard这个类

//一键复制到剪切板
void MainWindow::on_pushButton_5_clicked()
{
    QClipboard *clipboard = QApplication::clipboard();
    clipboard->setText( ui->textEdit->toPlainText());
    QMessageBox::information(this, tr("复制成功"), tr("代码成功复制到剪切板"));
}

3结束

感觉QT还是非常的好入门的,只要是想认真搞这个课设的,稍微花一点时间还是会很轻松的拿下的,需要用到什么功能可以参考我的博客。附上自己的整个工程的代码还有报告,里面还有个可以直接运行的程序(不用QT就可以直接运行)。直接开源。
链接:https://pan.baidu.com/s/14uK79QuovRhIZwgwpWXzOA?pwd=9zyx
提取码:9zyx
github链接

  • 6
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
平面凸轮数控铣削编程实例三: 平面凸轮零件图如图8-40所示,工件的上、下底面及内孔、端面已加工。完成凸轮轮廓的程序编制。 解:① 工艺分析。从图8-40的要求可以看出,凸轮曲线分别由几段圆弧组成,内孔为设计基准,其余表面包括4-Ф13H7孔均已加工。故取内孔和一个端面为主要定位面,在连接孔Ф13的一个孔内增加削边销,在端面上用螺母垫圈压紧。 因为孔是设计和定位的基准,所以对刀点选在孔中心线与端面的交点上,这样很容易确定刀具中心与零件的相对位置。 ② 加工调整。零件加工坐标系X、Y位于工作台中间,在G53坐标系中取X=-400,Y=-100。Z坐标可以按刀具长度和夹具、零件高度决定,如选用Ф20的立铣刀,零件上端面为Z向坐标零点,该点在G53坐标系中的位置为Z=-80处,将上述三个数值设置到G54加工坐标系中,即G54:X=-400,Y=-100,Z=-80.凸轮轮廓加工工序卡见表8-17。 表8-17 铣凸轮轮廓加工工序卡 材料 45 零件号 812 程序号 8121 操作序号 内容 主轴转速 /r.min-1 进给速度 /r.min-1 刀具 号数 类型 直径/mm 1 铣凸轮轮廓 2000 80、200 1 20mm立铣刀 20 ③ 数字处理。该凸轮加工的轮廓均为圆弧组成,因而要计算出基点坐标,才可编制程序。在加工坐标系中,各点的计算坐标如下。 弧BC的中心O1点: X=-(175+63.8)  sin8°59′=-37.28 Y=-(175+63.8)  cos8°59′=-235.86 弧EF的中心O2点: X2 + Y2= 692 (X-64)2+ Y2= 212 X=65.75,Y=20.93 解之得 弧HI的中心O4点: X=-(175+61)cos24°15′=-215.18 Y=(175+61)sin24°15′=96.93 弧DE的中心O5点: X2 + Y2= 63.72 (X-65.75)2+ (Y-20.93)2= 21.302 X=63.70,Y=-0.27 解之得 B点: X=-63.8sin8°59′=-9.96 Y=-63.8cos8°59′=-63.02 C点: X2 + Y2= 642 (X+37.28)2+ (Y+235.86)2= 1752 X=-5.57,Y=-63.76 解之得 D点: (X-63.70)2+ (Y+0.27)2= 0.32 X2 + Y2= 642 X=63.99,Y=-0.28 解之得 E点: (X-63.7)2 + (Y+0.27)2= 0.32 (X-65.75)2 + (Y-20.93)2= 212 X=63.72,Y=-0.03 解之得 F点: (X+1.07)2 + (Y-16)2= 462 (X-65.75)2 + (Y-20.93)2= 212 X=44.79,Y=-19.6 解之得 G点: (X+1.07)2 + (Y-16)2= 462 X2 + Y2= 612 X=14.79,Y=59.18 解之得 H点: X=-61cos24°15′=-55.62 Y=61sin24°15′=25.05 解之得 I点: X2 + Y2= 63.802 (X+215.18)2+(Y-96.93)2=1752 X=-63.02,Y=9.97 根据上面的数值计算,可画出凸轮加工走刀路线,如图8-41所示。 ④ 编写加工程序凸轮加工程序及说明见表8-18。 表8-18 凸轮加工程序 参数设置:H01=10;G54:X=-400,Y=-100,Z=-80 程 序 说 明 N10 G54 X0 Y0 Z40 进入加工坐标系 N20 G90 G00 G17 X-73.8 Y20 由起刀点到加工开始点 N30 M03 S1000 启动主轴,主轴正转(顺铣) N40 G00 Z0 下刀至零件上表面 N50 G01 Z-16 F200 下刀切入工件,深度为工件厚度+1mm N60 G42 G01 X-63.8 Y10 F80 H01 刀具半径右补偿 N70 G01 X-63.8 Y0 切入零件至A点 N80 G03 X-9.96 Y-63.02 R63.8 切削AB N90 G02 X-5.57 Y-63.76 R175 切削BC N100 G03 X63.99 Y-0.28 R64 切削CD N110 G03 X63.72 Y0.03 R0.3 切削DE N120 G02 X44.79 Y19.6 R21 切削EF N130 G03 X14.79 Y59.18 R46 切削FG N140 G03 X-55.26 Y25.05 R61 切削GH N150 G02

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yijianpeng

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值