技術(shù)頻道

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

運動控制卡應(yīng)用開發(fā)教程之激光振鏡控制

時間:2020-12-17 17:37:26來源:正運動技術(shù)

導(dǎo)語:?今天,正運動技術(shù)為大家分享一下應(yīng)用C++開發(fā)一個激光振鏡的運動控制例程。我們主要從新建MFC項目,添加函數(shù)庫講起,最后通過項目實戰(zhàn)——激光振鏡打標例程講解,來讓大家熟悉它的項目開發(fā)。在正式學(xué)習(xí)之前,我們先了解一下正運動技術(shù)的運動控制器ZMC420SCAN。這款產(chǎn)品是20軸運動控制器。

  今天,正運動技術(shù)為大家分享一下應(yīng)用C++開發(fā)一個激光振鏡的運動控制例程。

  我們主要從新建MFC項目,添加函數(shù)庫講起,最后通過項目實戰(zhàn)——激光振鏡打標例程講解,來讓大家熟悉它的項目開發(fā)。

  在正式學(xué)習(xí)之前,我們先了解一下正運動技術(shù)的運動控制器ZMC420SCAN。這款產(chǎn)品是20軸運動控制器。

  ZMC420SCAN 總線控制器支持 ECAT/RTEX 總線連接,支持多達20軸運動控制,支持直線插補、任意圓弧插補、空間圓弧、螺旋插補、電子凸輪、電子齒輪、同步跟隨、虛擬軸設(shè)置等;采用優(yōu)化的網(wǎng)絡(luò)通訊協(xié)議可以實現(xiàn)實時的運動控制。

  ZMC420SCAN 總線控制器支持脈沖軸/總線軸/振鏡軸混合插補。

  ZMC420SCAN 支持10路脈沖輸出與編碼器反饋且支持4路振鏡軸,板載24點輸入,12點輸出,2AD,2DA,所有輸出口都支持高速PWM控制。

  接線方式如下圖1所示:

  

  圖片1.png

  

  圖1

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

  

  1608098425130178.jpg

  

  圖2

  

  圖片2.png

  

  ZMC420SCAN 的PWM 輸出受正常輸出功能的控制,輸出口“ON”狀態(tài)下才能進行PWM輸出,便于控制激光能量。

  ZMC420SCAN 的輸出0-7的具有精準輸出的功能,每個輸出的精準輸出功能相互獨立,通過MOVEOP_DELAY 與AXIS_ZSET ,來設(shè)置每個MOVE_OP 指令是否使用精準輸出以及精準輸出的延時,從而實現(xiàn)激光的PSO 控制。

  ZMC420SCAN 的輸出0-7支持精準輸出且相互獨立,通過指令:MOVE_OP,AXIS_ZSET,MOVEOP_DELAY來分別控制激光的開關(guān),精準輸出開關(guān)及延時,從而實現(xiàn)激光PSO控制。

  振鏡軸:

  

  圖片3.png

  

  ZMC420SCAN支持XY2-100振鏡協(xié)議,支持運動控制與振鏡聯(lián)合插補運動。

  上位機通過網(wǎng)口與控制器相連,獲取對應(yīng)控制器的句柄,通過XY2-100協(xié)議控制振鏡軸,通過總線協(xié)議或者脈沖模式控制伺服或步進軸。

  

  圖片4.png

  圖片5.png

  

  本地軸號4/5可以ATYPE=21 配置為第1個振鏡, 本地軸號6/7可以ATYPE=21 配置為第2個振鏡,可通過 AXIS_ADDRESS 配置軸號。

    以下是激光振鏡
        控制開發(fā)流程

     一 新建MFC項目 添加函數(shù)庫

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

  

  圖片6.png

  

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

  

  1608098593727546.png

  

  3.選擇類型為“基于對話框”,下一步或者完成。下一步則往后繼續(xù)配置,完成就直接完成即可。把類型選好,其他的可以在項目中編輯。

  

  1608098618489736.png

  

  4.找到廠家提供的光盤資料,路徑如下(64位庫為例):

  A.進入光盤資料找到PC函數(shù)文件夾。

  B.選擇函數(shù)庫2.1。

  C.Windows平臺。

  

  1608098639283917.png

  

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

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

  

  1608098656703033.png

  

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

  

  圖片14.png

  

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

  

  1608098694654893.png

  

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

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

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

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

  

  圖片16.png

  

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

  

  1608098729792842.png

  

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

  

  圖片18.png

  

  至此項目新建完成。

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

  1.PC函數(shù)手冊也在光盤資料里面,具體路徑如下:

  

  1608098772543921.png

  

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

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

  

  圖片20.png

  1608098810856477.png

  4.通過獲取到的控制器句柄handle,對控制器進行激光振鏡軸類型的設(shè)置。

  

  圖片22.png

  

  第三個參數(shù)的值有以下的模式選擇,使用振鏡軸需選擇軸類型為21的模式,設(shè)置軸為振鏡軸類型,振鏡軸類型系統(tǒng)周期與刷新周期都要比普通軸快很多。

  

  圖片23.png

  

  5.通過獲取到的控制器句柄handle,控制控制器的振鏡軸進行多軸運動控制,可以進行搭配振鏡軸與普通軸進行混合插補運動。

  

  圖片24.png

  

    三 項目實操之激光振鏡打標例程

  1.例程以建立板卡的連接,并設(shè)置振鏡軸的拐角減速以及速度參數(shù),對內(nèi)部進行設(shè)置的運動軌跡進行處理完成對圓形的打標。

  

  圖片25.png

  

  2.例程簡易流程圖。

  

  圖片26.png

  

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

  //ip連接

  void CMarkDemoDlg::OnBnClickedButton2()

  {

      // TODO:             在此添加控件通知處理程序代碼

      char     buffer[256];

      char     item[256] = {0};

      float     ftemp = 0.0;

      char     atemp[256] = {0};         //存放控制器型號

      uint32     uitemp = 0;

      int32 iresult;

      if(NULL != g_handle)

      {

          ZMC_Close(g_handle);

          g_handle = NULL;

      }

          GetDlgItemText(IDC_IP_COMBO,buffer,255);         //獲取當前框內(nèi)的IP地址

          buffer[255] = '\0';

          iresult = ZMC_OpenEth(buffer, &g_handle);         //獲取與控制器建立連接的結(jié)果

          if(ERR_SUCCESS != iresult)

      {

          g_handle = NULL;

          MessageBox(_T("Connect Failed"));

          SetWindowText(_T("ZControlTest-Connect Failed"));

          return;

      }

      SetWindowText("succse");

      //

      CComboBox *m_pEthList;

      m_pEthList = (CComboBox *)GetDlgItem(IDC_IP_COMBO);    //獲取ip地址

      if(NULL == m_pEthList)

      {

          return;

      }

      //

      if(CB_ERR != m_pEthList->FindString(0, buffer))

      {

          return;

      }

      //加入

      m_pEthList->AddString(buffer);     //將ip地址加入框內(nèi)

  }

  4.通過串口連接控制器,獲取控制器連接句柄。

  void CMarkDemoDlg::OnBnClickedButton4()

  {

      // TODO:         在此添加控件通知處理程序代碼

      int32 iresult;

      uint8 icomid;

      float ftemp = 0.0;

      char atemp[256] = {0};         //存放控制器型號

      uint32 uitemp = 0;

      int m_icombaud;

      if(NULL != g_handle)

      {

          ZMC_Close(g_handle);

          g_handle = NULL;

      }

      CComboBox         *m_pParityList;

      m_pParityList = (CComboBox *)GetDlgItem(IDC_COMBO_PARITY);

      m_icombaud = GetDlgItemInt(IDC_BAUD_COMBO);

      ZMC_SetComDefaultBaud(m_icombaud, 8, m_pParityList->GetCurSel(), ONESTOPBIT);

      icomid = GetDlgItemInt(IDC_PORT_COMBO);

      iresult = ZMC_OpenCom(icomid, &g_handle);

      if(ERR_SUCCESS != iresult)

      {

          g_handle = NULL;

          MessageBox(_T("Connect Failed"));

          return;

      }

      SetWindowText("success");

      CString Comname;

      CComboBox *m_pComList;

      m_pComList = (CComboBox *)GetDlgItem(IDC_PORT_COMBO);

      if(NULL == m_pComList)

      {

          return;

      }

      Comname.Format("%d",icomid);

      //

      if(CB_ERR != m_pComList->FindString(0, Comname))

      {

          return;

      }

      //加入

      m_pComList->AddString(Comname);

  }

  5.利用生成的句柄進行配置軸參數(shù),軸類型等。

  int axislist[2] = {4,5};

      char cbuf[32] = {};

      //設(shè)置主軸

      ZAux_Direct_Base(g_handle, 2, axislist);

      //獲取編輯框內(nèi)要設(shè)置的參數(shù)

      int MachSpeed = GetDlgItemInt(IDC_EDIT_SPEED);

      int MachAddSpeed = GetDlgItemInt(IDC_EDIT_ADDSPEED);

      int MachDecSpeed = GetDlgItemInt(IDC_EDIT_DECSPEED);

      float MachDecAngle = GetDlgItemInt(IDC_EDIT_DECANGLE) * 3.14 / 180;

      float MachStopAngle = GetDlgItemInt(IDC_EDIT_STOPANGLE) * 3.14 / 180;

      //軸初始化

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

      {

          //設(shè)置軸類型為振鏡軸類型

          ZAux_Direct_SetAtype(g_handle, i, 21);

          //設(shè)置每圈脈沖數(shù)

          ZAux_Direct_SetUnits(g_handle, i, 300);

          //設(shè)置速度

          ZAux_Direct_SetSpeed(g_handle, i, MachSpeed);

          //設(shè)置加速度

          ZAux_Direct_SetAccel(g_handle, i, MachAddSpeed);

          //設(shè)置減速度

          ZAux_Direct_SetDecel(g_handle, i, MachDecSpeed);

          //打開振鏡軸連續(xù)插補

          ZAux_Direct_SetMerge(g_handle, i, 1);

          //設(shè)置拐角減速模式以及自動倒角模式

          ZAux_Direct_SetCornerMode(g_handle, i, 32+2);

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

          ZAux_Direct_SetZsmooth(g_handle, i, 0.1);

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

          ZAux_Direct_SetFullSpRadius(g_handle, i, 20);

          //設(shè)置減速角度

          ZAux_Direct_SetDecelAngle(g_handle, i, MachDecAngle);

          //設(shè)置停止角度

          ZAux_Direct_SetStopAngle(g_handle, i, MachStopAngle);

          //設(shè)置SP速度

          ZAux_Direct_SetForceSpeed(g_handle, i, 5000);

      }

      //打開精準輸出功能

      ZAux_DirectCommand(g_handle, "AXIS_ZSET(4)=2", cbuf, 32);

      ZAux_Direct_SetOp(g_handle, 11, 1);

      ZAux_Direct_Base(g_handle, 2, axislist);

  ZAux_Direct_SetOp(g_handle, 1, 1);

  6.本例程的軌跡移動數(shù)據(jù)都是以小線段的模式自己輸入的,運行的過程中利用了多段小線段進行圓弧擬合的方式進行加快速度的處理操作。

  單個圓CAD軌跡圖:

  

  圖片27-3.png

  

  對應(yīng)部分軌跡數(shù)據(jù)以及使用代碼如下:

  //單個圓相對

  double x1[] = {-0.038000, -0.113000, -0.184000, -0.250000, -0.308000, -0.357000, -0.395000, -0.421000, -0.434000, -0.434000, -0.421000, -0.395000, -0.357000, -0.308000, -0.250000, -0.184000, -0.113000, -0.038000, 0.038000, 0.113000, 0.184000, 0.250000, 0.308000, 0.357000, 0.395000, 0.421000, 0.434000, 0.434000, 0.421000, 0.395000, 0.357000, 0.308000, 0.250000, 0.184000, 0.113000, 0.038000};

  double yh1[] = {0.434000, 0.421000, 0.395000, 0.357000, 0.308000, 0.250000, 0.184000, 0.113000, 0.038000, -0.038000, -0.113000, -0.184000, -0.250000, -0.308000, -0.357000, -0.395000, -0.421000, -0.434000, -0.434000, -0.421000, -0.395000, -0.357000, -0.308000, -0.250000, -0.184000, -0.113000, -0.038000, 0.038000, 0.113000, 0.184000, 0.250000, 0.308000, 0.357000, 0.395000, 0.421000, 0.434000};

  小線段轉(zhuǎn)圓弧函數(shù)說明:

  /*************************************************************

  Description:          //小線段變?yōu)閳A弧

  Input:                    //handle:連接的控制器句柄

                               //pXPos:線段的x坐標數(shù)組

                                                          //pYPos:線段的y坐標數(shù)組

                                                          //nMaxNum:最大點數(shù)

                                                          //nMaxFitNum:最大擬合段數(shù)(100~1000)

                                                          //nAbs:1=絕對;0=相對;表示傳入的x、y坐標數(shù)據(jù)為絕對還是相對

                                                          //refDistance:參考精度

  Output:               //

  Return:               //錯誤碼

  *************************************************************/

  int __stdcall ZGraphProcess_SegFitArc(ZMC_HANDLE handle, double *pXPos, double *pYPos, int nMaxNum, int nMaxFitNum, int nAbs, double refDistance);

  使用此函數(shù)將多段小線段擬合成圓弧簡化操作步驟,不用單獨進行每段小線段的插補運動操作。此函數(shù)為內(nèi)部函數(shù),如有需求聯(lián)系請正運動技術(shù)工程師給予支持。

  代碼中利用單個圓擬合進行橫縱循環(huán)打標陣列圓的方式進行打標。

  int axislist[2] = {4,5};

  char cbuf[32] = {};

  //設(shè)置主軸

  ZAux_Direct_Base(g_handle, 2, axislist);

  for (int k = 0; k < 1; k++)

      {

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

          {

              //移動到一個指定位置

              ZAux_DirectCommand(g_handle, "MOVE (0, -15)", cbuf, 32);

              for (int j = 0; j < 5; j++)

              {

                  ZAux_DirectCommand(g_handle, "MOVE (-15, 0)", cbuf, 32);

                  ZAux_Direct_MoveOp(g_handle, 0, 1);

                  //進行小線段轉(zhuǎn)圓弧

                  int err_seg = ZGraphProcess_SegFitArc(g_handle, x1, yh1, sizeof(x1)/sizeof(double), 1000, 0, 0.01);

                  ZAux_Direct_MoveOp(g_handle, 0, 0);

          }

          ZAux_DirectCommand(g_handle, "MOVE (75, 0)", cbuf, 32);

      }

      ZAux_DirectCommand(g_handle, "MOVE (0, 75)", cbuf, 32);

  }

  7.編譯運行演示。

  (1)編譯運行示教例程。

  

  圖片28.png

  

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

  

  圖片29.png

  

  標刻25個圓形用時以及示波器顯示圖形如下:

  

  1608099278325524.png

  

  標刻25個圓形用時以及示波器顯示圖形

  

  

  

  正運動技術(shù)激光振鏡演示實拍

  本次,正運動技術(shù)的運動控制卡應(yīng)用開發(fā)教程之激光振鏡控制就分享到這里,更多精彩內(nèi)容請關(guān)注“正運動小助手”公眾號。

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

  

  圖片25.png

  


標簽: 運動控制

點贊

分享到:

上一篇:倍福虛擬學(xué)院 | TwinCAT 3 多...

下一篇:快速入門 | 篇十九:正運動技...

中國傳動網(wǎng)版權(quán)與免責聲明:凡本網(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)將追究其法律責任。

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

網(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號