技術(shù)頻道

娓娓工業(yè)
您現(xiàn)在的位置: 中國傳動網(wǎng) > 技術(shù)頻道 > 技術(shù)百科 > 運動控制卡應(yīng)用開發(fā)教程之C++

運動控制卡應(yīng)用開發(fā)教程之C++

時間:2020-11-27 16:03:12來源:正運動技術(shù)

導(dǎo)語:?我們主要從新建MFC項目,添加函數(shù)庫講起,再了解PC函數(shù)用法,最后通過項目實戰(zhàn)——連續(xù)插補運動例程講解,來讓大家熟悉C++的項目開發(fā)。

  今天,正運動技術(shù)為大家分享一下應(yīng)用C++開發(fā)一個多段連續(xù)插補的運動控制應(yīng)用。

  我們主要從新建MFC項目,添加函數(shù)庫講起,再了解PC函數(shù)用法,最后通過項目實戰(zhàn)——連續(xù)插補運動例程講解,來讓大家熟悉C++的項目開發(fā)。

  在正式學(xué)習(xí)之前,我們先了解一下正運動技術(shù)的運動控制卡ECI2418和ECI2618。這兩款產(chǎn)品分別是4軸,6軸運動控制卡。

  

  1.jpg

  

  ECI2418支持4軸脈沖輸入與編碼器反饋,板載24點輸入,16點輸出,2AD,2DA,支持手輪接口,其中特定輸出口支持高速PWM控制。

  

  2.jpg

  

  ECI2618支持6軸脈沖輸入與編碼器反饋,板載24點輸入,16點輸出,2AD,2DA,支持手輪接口,其中特定輸出口支持高速PWM控制。

  

  3.jpg

  

  ECI2418,ECI2618均使用同一套API函數(shù),均支持C、C++、C#、LabVIEW、Python、Delphi等開發(fā)語言,支持VC6.0、VB6.0、Qt、.Net等平臺,支持Windows、Linux、WinCE、iMac等操作系統(tǒng)。

   以下是C++

   開發(fā)流程

    01 新建MFC項目,添加函數(shù)庫。

    1、在VS2015菜單“文件”→“新建”→ “項目”,啟動創(chuàng)建項目向?qū)А?/strong>

  

  4.jpg

  

    2、選擇開發(fā)語言為“Visual C++”和程序類型“MFC應(yīng)用程序”。

  

  5.jpg

  

    3、下一步即可。

  

  6.jpg

  

    4、選擇類型為“基于對話框”,下一步或者完成。

  下一步則往后繼續(xù)配置,完成就直接完成即可。這里就不需要再配置了,無關(guān)緊要的,只要這個類型選好就行,其他的可以在項目中編輯。

  

  7.jpg

  

    5、找到廠家提供的光盤資料,路徑如下(64位庫為例)。

  1)進(jìn)入光盤資料找到PC函數(shù)文件夾。

  

  8.jpg

  

  2)選擇函數(shù)庫2.1。

  

  9.jpg

  

  3)Windows平臺。

  

  10.jpg

  

  4)根據(jù)需要選擇對應(yīng)的函數(shù)庫這里選擇64位庫。

  

  11.jpg

  

  5)解壓C++的壓縮包,里面有C++對應(yīng)的函數(shù)庫。

  

  12.jpg

  

  6)函數(shù)庫具體路徑如下。

  

  13.jpg

  

    6、將廠商提供的C++的庫文件和相關(guān)頭文件復(fù)制到新建的項目里面。

  

  14.jpg

  

    7、在項目中添加靜態(tài)庫和相關(guān)頭文件。

  靜態(tài)庫:zauxdll.lib, zmotion.lib

  相關(guān)頭文件:zauxdll2.h, zmotion.h

  1)先右擊頭文件,接著依次選擇:“添加”→“現(xiàn)有項”。

  

  15.jpg

  

  

  2)在彈出的窗口中依次添加靜態(tài)庫和相關(guān)頭文件。

  

  16.jpg

  

  3)聲明用到的頭文件和定義控制器連接句柄。

  

  17.jpg

  

  至此項目新建完成。

  

    02 查看PC函數(shù)手冊,了解其用法。

  

    1、PC函數(shù)手冊也在光盤資料里面。

  具體路徑如下:

  

  18.jpg

  

    2、PC編程

  先根據(jù)控制器連接方式選擇對應(yīng)的連接函數(shù)連接控制器,返回控制器句柄。接著用返回的控制器句柄,實現(xiàn)對控制器的控制。

  比如通過網(wǎng)口連接控制器,先使用ZAux_OpenEth()鏈接控制器,獲取控制器句柄handle。

  

  19.jpg

  

  通過獲取到的控制器句柄handle,對控制器進(jìn)行單軸運動控制。

  

  20.jpg

  

  通過獲取到的控制器句柄handle,對控制器進(jìn)行多軸運動控制。

  

  21.jpg

  

  //多軸運動

    intaxislist[  4] = {   0,  1,  2,  3 };                                              //運動BASE軸列表

    floatdislist[  4] = {  100,100,100,100};                            //運動距離列表

  ZAux_Direct_Move(g_handle,  4, axislist, dislist);           //多軸運動

  

    03 項目實戰(zhàn)之連續(xù)插補運動例程講解

  

    1、例程以建立板卡的連接,執(zhí)行3段連續(xù)軌跡的加工為目標(biāo)。

  

  22.jpg

  

    2、例程簡易流程圖。

  

  23.jpg

  

  // 相關(guān)函數(shù)

  ZAux_OpenEth(IP_buffer, &g_handle);                                            //連接控制器

  ZAux_Direct_GetAllAxisPara(g_handle, "  DPOS", 4, showpos);        //獲取當(dāng)前軸位

  ZAux_Direct_GetAllAxisPara(g_handle, "  MSPEED", 4, mspeed);     //更新軸速度

  ZAux_Direct_Single_Cancel(g_handle, 0, 2); //停止主軸運動

  ZAux_Direct_Move(g_handle, 4, axislist, dislist1);                            //第1段多軸插補指令

  ZAux_Direct_Move(g_handle, 4, axislist, dislist2);                            //第2段多軸插補指令

  ZAux_Direct_Move(g_handle, 4, axislist, dislist3);                            //第3段多軸插補指令

  ZAux_Close(g_handle);//斷開連接

  

    3、通過網(wǎng)口連接控制器,獲取控制器連接句柄。

  

  //Link按鈕事件處理函數(shù)

    voidCMergeDlg::OnBnClickedButtonLink()

  {

        charbuffer[256];

      int32 iresult;

      //如果之前有連接控制器著先斷開連接

        if(NULL != g_handle)

      {

      ZAux_Close(g_handle);

      g_handle = NULL;

      }

      //從IP下拉框中獲取IP

      GetDlgItemText(IDC_COMBOX_IP, buffer, 255);

      buffer[255] = '\0';

      //通過PC函數(shù)庫提供的連接控制器的函數(shù)接口(API),連接控制器

      iresult = ZAux_OpenEth(buffer, &g_handle);

        if(ERR_SUCCESS != iresult)

      {

      g_handle = NULL;

      MessageBox(_T("  鏈接失敗"));

      SetWindowText("  未鏈接");

        return;

  }

  SetWindowText("  已鏈接");

  //啟動定時器

  SetTimer(1, 100, NULL);

  SetTimer(2, 100, NULL);

  //初始化軸參數(shù)

    for(  inti = 0; i<4; i++)

  {

      ZAux_Direct_SetAtype(g_handle, i, 1); //軸類型

      ZAux_Direct_SetUnits(g_handle, i, 1000); //脈沖當(dāng)量

      ZAux_Direct_SetSpeed(g_handle, i, 100); //速度

      ZAux_Direct_SetAccel(g_handle, i, 1000); //加速度

      ZAux_Direct_SetDecel(g_handle, i, 1000); //減速度

  ZAux_Direct_SetSramp(g_handle, i, 100); //S曲線時間

      }

  }

  

    4、通過定時器1更新控制器軸0-3的位置信息和速度信息。

  

  //定時器

  void CMergeDlg::OnTimer(UINT_PTR nIDEvent)

  {

      if (NULL == g_handle)

      {

          MessageBox(_T("  鏈接斷開"));

          return;

      }

      switch (nIDEvent)

      {

      case 1: //更新控制器軸0-3的位置信息和速度信息

          CString Xpos, Xmspeed;

          CString Ypos, Ymspeed;

          CString Zpos, Zmspeed;

          CString Upos, Umspeed;

          float showpos[4] = { 0 };

          float mspeed[4] = { 0 };

  int         status = 0;

          //獲取當(dāng)前軸位置

          ZAux_Direct_GetAllAxisPara(g_handle, "  DPOS", 4, showpos);

          Xpos.Format("  X: %.2f", showpos[0]);

          Ypos.Format("  Y: %.2f", showpos[1]);

          Zpos.Format("  Z: %.2f", showpos[2]);

          Upos.Format("  U: %.2f", showpos[3]);

          GetDlgItem(IDC_XPOS)->SetWindowText(Xpos);

          GetDlgItem(IDC_YPOS)->SetWindowText(Ypos);

          GetDlgItem(IDC_ZPOS)->SetWindowText(Zpos);

          GetDlgItem(IDC_UPOS)->SetWindowText(Upos);

          //判斷主軸狀態(tài)(即BASE的第一個軸)

          ZAux_Direct_GetIfIdle(g_handle, 0, &status);

          if (status == -1)

          {

              GetDlgItem(IDC_RUNSTATUS)->SetWindowText("  運動狀態(tài):停止中");

          }

          else

          {

              GetDlgItem(IDC_RUNSTATUS)->SetWindowText("  運動狀態(tài):運動中");

          }

          //更新軸速度

          ZAux_Direct_GetAllAxisPara(g_handle, "  MSPEED", 4, mspeed);

          Xmspeed.Format("  X軸速度: %.2f", mspeed[0]);

          Ymspeed.Format("  Y軸速度: %.2f", mspeed[1]);

          Zmspeed.Format("  Z軸速度: %.2f", mspeed[2]);

          Umspeed.Format("  U軸速度: %.2f", mspeed[3]);

          GetDlgItem(IDC_SPEED_X)->SetWindowText(Xmspeed);

          GetDlgItem(IDC_SPEED_Y)->SetWindowText(Ymspeed);

          GetDlgItem(IDC_SPEED_Z)->SetWindowText(Zmspeed);

          GetDlgItem(IDC_SPEED_U)->SetWindowText(Umspeed);

          break;

      }

      CDialogEx::OnTimer(nIDEvent);

  }

  

    5、通過啟動按鈕的事件處理函數(shù)來啟動連續(xù)插補運動。

  

  //啟動按鈕

  void CMergeDlg::OnBnClickedButtonRun()

  {

      if (NULL == g_handle)

      {

          MessageBox(_T(  "鏈接斷開"));

          return;

      }

      UpdateData(true);//刷新參數(shù)

      int corner_mode = 0;

      int axislist[4] = { 0,1,2,3 }; //運動BASE軸列表

      float dislist1[4] = { 0 }; //運動距離列表

      float dislist2[4] = { 0 };

      float dislist3[4] = { 0 };

      //選擇參與運動的軸,第一個軸為主軸,插補參數(shù)全用主軸參數(shù)

      ZAux_Direct_SetSpeed(g_handle, axislist[0], M_Speed); //速度

      ZAux_Direct_SetAccel(g_handle, axislist[0], M_Accel); //加速度

      ZAux_Direct_SetDecel(g_handle, axislist[0], M_Decel); //減速度

  ZAux_Direct_SetSramp(g_handle, axislist[0], M_SRAMP); //S曲線時間

      //設(shè)置拐角模式

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

      //設(shè)置連續(xù)插補

      ZAux_Direct_SetMerge(g_handle, axislist[0], m_mode);

      //設(shè)置SP速度

      ZAux_Direct_SetForceSpeed(g_handle, axislist[0], SP_Speed);

      //設(shè)置開始.結(jié)束減速角度,轉(zhuǎn)換為弧度

      ZAux_Direct_SetDecelAngle(g_handle, axislist[0], StartAngle * 3.14 / 180);

      ZAux_Direct_SetStopAngle(g_handle, axislist[0], StopAngle * 3.14 / 180);

      //設(shè)置小圓限速半徑

      ZAux_Direct_SetFullSpRadius(g_handle, axislist[0], SP_Radius);

      //設(shè)置拐角半徑

      ZAux_Direct_SetZsmooth(g_handle, axislist[0], CornerRadius);

      //SP指令中自動拐角模式中設(shè)置一個較大的startmovespeed與endmovespeed

      ZAux_Direct_SetStartMoveSpeed(g_handle, axislist[0], 10000);

      ZAux_Direct_SetEndMoveSpeed(g_handle, axislist[0], 10000);

      //更新運動數(shù)據(jù)

      dislist1[0] = DPOS_X_1; dislist1[1] = DPOS_Y_1;

      dislist1[2] = DPOS_Z_1; dislist1[3] = DPOS_U_1;

      dislist2[0] = DPOS_X_2; dislist2[1] = DPOS_Y_2;

      dislist2[2] = DPOS_Z_2; dislist2[3] = DPOS_U_2;

      dislist3[0] = DPOS_X_3; dislist3[1] = DPOS_Y_3;

      dislist3[2] = DPOS_Z_3; dislist3[3] = DPOS_U_3;

      //開始運動

      ZAux_Direct_Move(g_handle, 4, axislist, dislist1);

      ZAux_Direct_Move(g_handle, 4, axislist, dislist2);

      ZAux_Direct_Move(g_handle, 4, axislist, dislist3);

  }

  

    6、通過停止按鈕的事件處理函數(shù)來停止插補運動。

  

  //停止按鈕

  void CMergeDlg::OnBnClickedButtonStop()

  {

      if (NULL == g_handle)

      {

          MessageBox(_T("鏈接斷開"));

          return;

      }

      ZAux_Direct_Single_Cancel(g_handle, 0, 2); //停止主軸 BASE的一個軸

  }

  

   7、軸坐標(biāo)清零。

  

  //坐標(biāo)清零

  void CMergeDlg::OnBnClickedButtonClear()

  {

      if (NULL == g_handle)

      {

          MessageBox(_T("鏈接斷開"));

          return;

      }

      for (int i = 0; i<4; i++)

      {

          ZAux_Direct_SetDpos(g_handle, i, 0); //DPOS設(shè)為零

      }

  }

  

    8、編譯運行演示。

  

  1)編譯運行示教例程。

  

  24.jpg

  

  2)同時通過ZDevelop軟件連接同一個控制器,對運動控制的軸參數(shù)進(jìn)行監(jiān)控。

      A、連續(xù)插補加自動倒角的位置波形。

  

  25.jpg

  

      B、不開啟連續(xù)插補的速度波形。

  

  26.jpg

  28.jpg

  

  

      C、連續(xù)插補加合適的拐角減速的速度波形。

  

  28.jpg

  29.jpg

  30.jpg

  


  正運動技術(shù)C++開發(fā)就講到這里。更多學(xué)習(xí)視頻及圖文請關(guān)注我們的公眾號“正運動小助手”。

  本文由正運動小助手原創(chuàng),歡迎大家轉(zhuǎn)載,共同學(xué)習(xí),一起提高中國智能制造水平。文章版權(quán)歸正運動技術(shù)所有,如有轉(zhuǎn)載請注明文章來源。

31.jpg


標(biāo)簽: 運動控制

點贊

分享到:

上一篇:運動控制卡應(yīng)用開發(fā)教程之Python

下一篇:運動控制卡應(yīng)用開發(fā)教程之C#

中國傳動網(wǎng)版權(quán)與免責(zé)聲明:凡本網(wǎng)注明[來源:中國傳動網(wǎng)]的所有文字、圖片、音視和視頻文件,版權(quán)均為中國傳動網(wǎng)(m.u63ivq3.com)獨家所有。如需轉(zhuǎn)載請與0755-82949061聯(lián)系。任何媒體、網(wǎng)站或個人轉(zhuǎn)載使用時須注明來源“中國傳動網(wǎng)”,違反者本網(wǎng)將追究其法律責(zé)任。

本網(wǎng)轉(zhuǎn)載并注明其他來源的稿件,均來自互聯(lián)網(wǎng)或業(yè)內(nèi)投稿人士,版權(quán)屬于原版權(quán)人。轉(zhuǎn)載請保留稿件來源及作者,禁止擅自篡改,違者自負(fù)版權(quán)法律責(zé)任。

網(wǎng)站簡介|會員服務(wù)|聯(lián)系方式|幫助信息|版權(quán)信息|網(wǎng)站地圖|友情鏈接|法律支持|意見反饋|sitemap

傳動網(wǎng)-工業(yè)自動化與智能制造的全媒體“互聯(lián)網(wǎng)+”創(chuàng)新服務(wù)平臺

網(wǎng)站客服服務(wù)咨詢采購咨詢媒體合作

Chuandong.com Copyright ?2005 - 2024 ,All Rights Reserved 深圳市奧美大唐廣告有限公司 版權(quán)所有
粵ICP備 14004826號 | 營業(yè)執(zhí)照證書 | 不良信息舉報中心 | 粵公網(wǎng)安備 44030402000946號