產品分類

      當前位置: 首頁 > 傳感測量產品 > 數據采集產品 > 運動控制卡

      類型分類:
      科普知識
      數據分類:
      運動控制卡

      EtherCAT運動控制卡的總線軸參數設置和軸運動

      發布日期:2022-10-09 點擊率:110

      • 關鍵詞:正運動技術,EtherCAT,運動控制卡


      • 摘要:今天,正運動技術為大家分享一下《EtherCAT運動控制卡的總線軸參數設置和軸運動》。在正式學習之前,我們先了解一下正運動技術的運動控制卡ECI2618和ECI2828。這兩款產品分別是6軸,8軸運動控制卡。


      image.png


      今天,正運動技術為大家分享一下《EtherCAT運動控制卡的總線軸參數設置和軸運動》。在正式學習之前,我們先了解一下正運動技術的運動控制卡ECI2618和ECI2828。這兩款產品分別是6軸,8軸運動控制卡。


      image.png


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


      image.png


      ECI2828支持8軸總線型輸入與編碼器反饋,板載24點輸入,16點輸出,2路AD,2路DA,支持手輪接口,其中特定輸出口支持高速PWM控制。 


      ECI2618,ECI2828均使用同一套API函數,均支持C、C++、C#、LabVIEW、Python、Delphi等開發語言,支持VC6.0、VB6.0、Qt、.Net等平臺,支持Windows、Linux、WinCE、iMac等操作系統。


      接下來,進入正題。本節我們主要給大家分享一下EtherCAT運動控制卡之ECI2820如何使用C#進行EtherCAT總線軸運動和軸參數設置。


      一ECI2828運動控制卡硬件介紹


      ECI2828系列運動控制卡支持多達 16 軸直線插補、任意圓弧插補、空間圓弧、螺旋插補、電子凸輪、電子齒輪、同步跟隨、虛擬軸、機械手指令等;采用優化的網絡通訊協議可以實現實時的運動控制。


      ECI2828系列運動運動控制卡支持以太網,232 通訊接口和電腦相連,接收電腦的指令運行,可以通過EtherCAT總線和CAN總線去連接各個擴展模塊,從而擴展輸入輸出點數或運動軸。


      ECI2828系列運動控制卡的應用程序可以使用 VC,VB,VS,C++,C#等軟件來開發,程序運行時需要動態庫 zmotion.dll。調試時可以把ZDevelop軟件同時連接到控制器,從而方便調試、方便觀察。


      image.png


      二C#語言進行運動控制開發


      1.新建WinForm項目并添加函數庫


      (1)在VS2015菜單“文件”→“新建”→ “項目”,啟動創建項目向導。


      image.png


      (2)選擇開發語言為“Visual C#”和.NET framework 4以及Windows 窗體應用程序。


      image.png


      (3)找到廠家提供的光盤資料里面的C#函數庫,路徑如下(64位庫為例):


      A、進入廠商提供的光盤資料找到“8.PC函數”文件夾,并點擊進入。


      image.png


      B、選擇“函數庫2.1”文件夾。


      C、選擇“Windows平臺”文件夾。


      D、根據需要選擇對應的函數庫這里選擇64位庫。


      E、解壓C#的壓縮包,里面有C#對應的函數庫。


      image.png


      F、函數庫具體路徑如下。


      image.png


      (4)將廠商提供的C#的庫文件以及相關文件復制到新建的項目中。


      A、將zmcaux.cs文件復制到新建的項目里面中。


      image.png


      B、將zaux.dll和zmotion.dll文件放入bindebug文件夾中。


      image.png


      (5)用vs打開新建的項目文件,在右邊的解決方案資源管理器中點擊顯示所有,然后鼠標右鍵點擊zmcaux.cs文件,點擊包括在項目中。 


      image.png


      (6)雙擊Form1.cs里面的Form1,出現代碼編輯界面,在文件開頭寫入 using cszmcaux,并聲明控制器句柄g_handle。


      image.png


      至此項目新建完成,可進行C#項目開發。


      2.PC函數介紹


      A、PC函數手冊也在光盤資料里面,具體路徑如下:“光盤資料8.PC函數函數庫2.1Motion函數庫編程手冊 V2.1.pdf”。


      image.png


      B、PC編程,一般如果網口對控制器和工控機進行鏈接。網口鏈接函數接口是ZAux_OpenEth();如果鏈接成功,該接口會返回一個鏈接句柄。通過操作這個鏈接句柄可以實現對控制器的控制。


      ZAux_OpenEth()接口說明:


      image.png


      項目應用截圖:


      image.png


      C、我們會提供EtherCAT總線初始化的basic代碼,可以通過指令ZAux_BasDown()將總線初始化的basic代碼下載到控制器中,從而實現EtherCAT總線軸的初始化。 


      image.png


      D、使用PC函數庫里面的相關的函數接口,通過操作鏈接句柄“g_handle”,對控制器進行軸參數的設置和獲取。


      軸參數設置相關函數接口:


      image.png


      軸運動速度設置接口說明: 


      image.png


      E、使用ZAux_BusCmd_SDORead()和ZAux_BusCmd_SDOWrite()接口,實現對總線驅動器SDO參數的讀寫。 


      image.png

       image.png


      3、C#開發實現EtherCAT總線軸運動


      (1)EtherCAT總線軸運動控制例程界面如下。


      image.png


      (2)例程簡易流程圖。


      image.png


      (3)EtherCAT總線初始化Basic程序介紹,先將該程序下載到控制器中,PC再調用下面的總線初始化函數,即可完成總線初始化。


      '********************ECAT總線初始化****************

      global ConST BUS_TYPE = 0        '總線類型。

      global ConST MAX_AXISNUM = 16      '最大軸數

      global ConST Bus_Slot  = 0        '槽位號0

      global ConST Bus_AxisStart   = 0    '總線軸起始軸號


      global Bus_InitStatus      '總線初始化完成狀態

      Bus_InitStatus = -1

      global  Bus_TotalAxisnum      '檢查掃描的總軸數

      delay(3000)            '延時3S等待驅動器上電

      Ecat_Init()

      end


      global sub Ecat_Init()

        '初始化還原軸類型

        for i=0 to MAX_AXISNUM - 1              

          AXIS_ENABLE(i) = 0

          ATYPE(i)=0  

        next

        '掃描總線  

        Bus_InitStatus = -1

        Bus_TotalAxisnum = 0  

        SLOT_STOP(Bus_Slot)

        DELAY(200)

        SLOT_SCAN(Bus_Slot)

        '如果掃描成功                      

        if return then 

          

          ?"總線掃描成功","連接設備數:"NODE_COUNT(Bus_Slot)

          ?

          ?"開始映射軸號"

          '遍歷總線下所有從站節點

          for i=0 to NODE_COUNT(Bus_Slot)-1            

            '判斷當前節點是否有電機

            if NODE_AXIS_COUNT(Bus_Slot,i) <>0 then      

              for j=0 to NODE_AXIS_COUNT(Bus_Slot,i)-1

                '映射軸號

                AXIS_ADDRESS(Bus_AxisStart+i)=Bus_TotalAxisnum+1

                '設置控制模式 65-位置 66-速度 67-轉矩       

                ATYPE(Bus_AxisStart+i)=65

                '設置PROFILE功能                

                DRIVE_PROFILE(Bus_AxisStart+i)= 4

                '每軸單獨分組            

                DISABLE_GROUP(Bus_AxisStart+i)              

                '映射驅動器上的IO起始地址

                DRIVE_IO(Bus_AxisStart+i) = 128 + (Bus_AxisStart+i)*16  

                '設置限位信號

                REV_IN(Bus_AxisStart+i) = 128 + (Bus_AxisStart+i)*16 

                FWD_IN(Bus_AxisStart+i) = 129 + (Bus_AxisStart+i)*16

                DATUM_IN(Bus_AxisStart+i) = 130 + (Bus_AxisStart+i)*16

                INVERT_IN(128 + (Bus_AxisStart+i)*16,off)

                INVERT_IN(129 + (Bus_AxisStart+i)*16,off)

                INVERT_IN(130 + (Bus_AxisStart+i)*16,off)

                '總軸數+1

                Bus_TotalAxisnum=Bus_TotalAxisnum+1              

              next

            endif

            

          next

          

          ?"軸號映射完成","連接總軸數:"Bus_TotalAxisnum

          WA 2000

          '啟動總線

          SLOT_START(Bus_Slot)            

          if return then 

            ?"總線開啟成功"

            

            ?"開始清除驅動器錯誤(根據驅動器數據字典設置)"

            for i= Bus_AxisStart to Bus_AxisStart + Bus_TotalAxisnum - 1 

              

              DRIVE_CONTROLWORd(i)=128          '根據驅動器數據字典

              wa 100

              DRIVE_CONTROLWORd(i)=6

              wa 100

              DRIVE_CONTROLWORd(i)=15

              wa 100

            next

            

            ?"驅動器錯誤清除完成"

            wa 100


            ?"清除控制器錯誤"

            DATUM(0)

            DRIVE_CLEAR(0)

            ?"控制器錯誤清除完成"

            wa 100

                  

            ?"軸使能準備"

            for i= Bus_AxisStart to Bus_AxisStart + Bus_TotalAxisnum - 1

              base(i)

              AXIS_ENABLE=1

            next

            '使能總開關

            WDOG=1                      

            Bus_InitStatus  = 1

            ?"軸使能完成"

          else

            ?"總線開啟失敗"

            Bus_InitStatus = 0

          endif

          

        else

          ?"總線掃描失敗"

          Bus_InitStatus = 0

        endif

      end sub



      (4)在連接按鈕的事件處理函數中調用接口ZAux_OpenEth(),實現與控制器的連接。


      //網口連接控制器

      private void C_Open_Eth_Click(object sender, EventArgs e)

      {

            zmcaux.ZAux_OpenEth(C_Ip_Address.Text, out g_handle);

            if (g_handle != (IntPtr)0)

            {

                 this.Text = "已連接";

                 timer1.Enabled = true;

            }

      }



      (5)通過定時器更新控制器軸參數和總線軸初始化情況。


      //定時器

      private void timer1_Tick(object sender, EventArgs e)

      {

          int ret = 0;

          float[] f_AxisPara = new float[10];

          int[] i_AxisPara = new int[10];

          if (g_handle != (IntPtr)0)

          {

              //獲取軸參數,軸狀態

              m_axisnum = Convert.ToInt32(C_Move_Axis.Text);

              ret += zmcaux.ZAux_Direct_GetAxisEnable(g_handle, m_axisnum, ref i_AxisPara[0]);

              ret += zmcaux.ZAux_Direct_GetMpos(g_handle, m_axisnum, ref f_AxisPara[0]);

              ret += zmcaux.ZAux_Direct_GetDpos(g_handle, m_axisnum, ref f_AxisPara[1]);

              ret += zmcaux.ZAux_Direct_GetAxisStatus(g_handle, m_axisnum, ref i_AxisPara[1]);

              ret += zmcaux.ZAux_Direct_GetIfIdle(g_handle, m_axisnum, ref i_AxisPara[2]);

              if (ret == 0)

              {    

                  C_AxisEnable.Text = (i_AxisPara[0] == 0) ? "off" : "on";

                  C_AxisMpos.Text = f_AxisPara[0].ToString();

                  C_AxisDpos.Text = f_AxisPara[1].ToString();

                  C_AxisStatus.Text = i_AxisPara[1].ToString();

                  C_AxisIdle.Text = i_AxisPara[2].ToString();

              }

              //如果已經加載文件并且正在初始化---讀取總線初始化狀態

              if (g_basflag && g_InitStatus == -1)

              {

                    float tempstatus = -1;

                    int m_BusNodeNum = 0;

                    float m_BusAxisNum = 0;

                    ret += zmcaux.ZAux_Direct_GetUserVar(g_handle, "BUS_TYPE", ref Bus_type);            //讀取BAS文件中的變量判斷總線類型

                    ret += zmcaux.ZAux_Direct_GetUserVar(g_handle, "Bus_InitStatus", ref tempstatus);        //讀取BAS文件中的變量判斷總線初始化完成狀態

                    ret += zmcaux.ZAux_BusCmd_GetNodeNum(g_handle, 0, ref m_BusNodeNum);              //讀取槽位0上節點個數。

                    ret += zmcaux.ZAux_Direct_GetUserVar(g_handle, "Bus_TotalAxisnum", ref m_BusAxisNum);      //讀取BAS文件中的變量判斷掃描的總軸數

                    g_InitStatus = (int)tempstatus;

                    if (ret == 0 && g_InitStatus != -1)

                   {

                        C_Bus_Status.Text = (g_InitStatus == 1) ? "初始化成功" : "初始化失敗";

                        C_NodeNum.Text = m_BusNodeNum.ToString();

                        C_AxisNum.Text = m_BusAxisNum.ToString();

                   }

               }

           }

      }



      (6)通過BAS文件下載按鈕的事件處理函數,調用BAS文件下載接口將廠商提供的EtherCAT總線初始化的Basic代碼下載到控制器中。


      //下載總線初始化的BAS文件到控制器

      private void C_Download_Click(object sender, EventArgs e)

      {

            if (g_handle == (IntPtr)0)

            {

                  MessageBox.Show("未鏈接到控制器!", "提示");

            }

            else

            {

                  int ret = 0;

                  string strFilePath;

                  OpenFileDialog openFileDialog1 = new OpenFileDialog();

                  openFileDialog1.InitialDirectory = "";

                  openFileDialog1.Filter = "配置文件(*.bas)|*.bas";

                  openFileDialog1.RestoreDirectory = true;

                  openFileDialog1.FilterIndex = 1;

                  //打開配置文件

                  if (openFileDialog1.ShowDialog() == DialogResult.OK)            

                  {

                      strFilePath = openFileDialog1.FileName;

                      C_BasFile.Text = strFilePath;

                     //下載到ROM

                      ret = zmcaux.ZAux_BasDown(g_handle, strFilePath, 1);               

                      if (ret != 0)

                      {

                           MessageBox.Show("文件下載失敗!", "提示");

                      }

                      else

                      {

                            MessageBox.Show("文件下載成功", "提示");

                      }    

                   }

            }

      }


      (7)通過總線初始化按鈕的事件處理函數調用運行basic程序里的總線初始化函數進行總線初始化。


      //總線初始化,下載ROM時程序會自動初始化一次

      private void C_BusInit_Click(object sender, EventArgs e)

      {

          if (g_handle == (IntPtr)0)

          {

              MessageBox.Show("未鏈接到控制器!", "提示");

          }

          else

          {

              int ret;

              if (g_basflag && (g_InitStatus != -1))

              {

                  g_InitStatus = -1;

                  StringBuilder buffer = new StringBuilder(10240);

                  C_Bus_Status.Text = "初始化未完成";

                  //調用basic程序中的總線初始化函數Ecat_Init()

                  ret = zmcaux.ZAux_Execute(g_handle, "RUNTASK 1,Ecat_Init", buffer, 0);

              }  

           }

      }



      (8)通過設置按鈕的事件處理函數來設置軸參數。


      //軸參數設置按鈕

      private void AxisParaSet_Click(object sender, EventArgs e)

      {

          int ret = 0;

          ret = zmcaux.ZAux_Direct_SetUnits(g_handle, m_axisnum, Convert.ToSingle(C_AxisUnits.Text));

          ret = zmcaux.ZAux_Direct_SetSpeed(g_handle, m_axisnum, Convert.ToSingle(C_AxisSpeed.Text));

          ret = zmcaux.ZAux_Direct_SetAccel(g_handle, m_axisnum, Convert.ToSingle(C_AxisAcc.Text));

      }




      (9)通過運動按鈕的事件處理函數來控制軸運動。


      //持續正轉運動

      private void C_Button_Fwd_Click(object sender, EventArgs e)

      {

          int ret = 0;

          //更新軸參數

          ret = zmcaux.ZAux_Direct_SetUnits(g_handle, m_axisnum, Convert.ToSingle(C_AxisUnits.Text));

          ret = zmcaux.ZAux_Direct_SetSpeed(g_handle, m_axisnum, Convert.ToSingle(C_AxisSpeed.Text));

          ret = zmcaux.ZAux_Direct_SetAccel(g_handle, m_axisnum, Convert.ToSingle(C_AxisAcc.Text));

          //持續正方向運動

          ret = zmcaux.ZAux_Direct_Single_Vmove(g_handle, m_axisnum, 1);

      }

      //反轉

      private void C_Button_Rev_Click(object sender, EventArgs e)

      {

          //更新軸參數

          int ret = 0;

          ret = zmcaux.ZAux_Direct_SetUnits(g_handle, m_axisnum, Convert.ToSingle(C_AxisUnits.Text));

          ret = zmcaux.ZAux_Direct_SetSpeed(g_handle, m_axisnum, Convert.ToSingle(C_AxisSpeed.Text));

          ret = zmcaux.ZAux_Direct_SetAccel(g_handle, m_axisnum, Convert.ToSingle(C_AxisAcc.Text));

          //持續負方向運動

          ret = zmcaux.ZAux_Direct_Single_Vmove(g_handle, m_axisnum,-1);

      }


      (10)通過SDO讀寫按鈕的事件處理函數來讀寫驅動器的SDO參數。


      private void C_Sdo_Read_Click(object sender, EventArgs e)       //ETHERCAT讀取

      {

          if (g_handle == (IntPtr)0)

          {

              MessageBox.Show("未鏈接到控制器!", "提示");

              return;

          }

          int ret = 0;

          string str;

          uint m_sdo_node2 = Convert.ToUInt32(C_SdoNode1.Text);

          str = Convert.ToString(C_SdoReg1.Text);

          uint m_sdo_index2 = uint.Parse(str, System.Globalization.NumberStyles.AllowHexSpecifier);

          uint m_sdo_sub2 = Convert.ToUInt32(C_SdoIsub1.Text);

          uint m_sdo_type2 = Convert.ToUInt32(C_SdoType1.SelectedIndex.ToString()) + 1;

          int m_sdo_data2 = 0;

          if (Bus_type == 0)

          {

              ret = zmcaux.ZAux_BusCmd_SDORead(g_handle, 0, m_sdo_node2, m_sdo_index2, m_sdo_sub2, m_sdo_type2, ref m_sdo_data2);

              if (ret != 0)

              {

                  MessageBox.Show("讀取失敗");

                  return;

              }

              C_Sdodata1.Text = m_sdo_data2.ToString();

          }

          else

          {

              MessageBox.Show("非ETHERCAT模塊");

              return;

          }


      }


      private void C_Sdo_Write_Click(object sender, EventArgs e)      //ETHERCAT寫

      {

          if (g_handle == (IntPtr)0)

          {

              MessageBox.Show("未鏈接到控制器!", "提示");

              return;

          }

          int ret = 0;

          string str;

          uint m_sdo_node1 = Convert.ToUInt32(C_SdoNode0.Text);

          str = Convert.ToString(C_SdoReg0.Text);

          uint m_sdo_index1 = uint.Parse(str, System.Globalization.NumberStyles.AllowHexSpecifier);

          uint m_sdo_sub1 = Convert.ToUInt32(C_SdoIsub0.Text);

          uint m_sdo_type1 = Convert.ToUInt32(C_SdoType0.SelectedIndex.ToString()) + 1;

          int m_sdo_data1 = Convert.ToInt32(C_Sdodata0.Text);

          if (Bus_type == 0)

          {

              ret = zmcaux.ZAux_BusCmd_SDOWrite(g_handle, 0, m_sdo_node1, m_sdo_index1, m_sdo_sub1, m_sdo_type1, m_sdo_data1);

              if (ret != 0)

              {

                  MessageBox.Show("寫入失敗");

                  return;

              }

          }

          else

          {

              MessageBox.Show("非ETHERCAT模塊");

              return;

          }

      }



      4.調試與監控


      編譯運行例程,同時連接ZDevelop軟件進行調試,對運動控制的軸參數和運動情況進行監控。


      (1)連接ZDevelop軟件,對軸參數和軸狀態進行監控。


      image.png

      image.png


      (2)總線軸運動與軸參數設置演示


      image.png


      本次,正運動技術EtherCAT運動控制卡的總線軸參數設置和軸運動,就分享到這里。


      更多精彩內容請關注“正運動小助手”公眾號,需要相關開發環境與例程代碼,請咨詢正運動技術銷售工程師:400-089-8936。


      本文由正運動技術原創,歡迎大家轉載,共同學習,一起提高中國智能制造水平。文章版權歸正運動技術所有,如有轉載請注明文章來源。


      下一篇: PLC、DCS、FCS三大控

      上一篇: VPLC系列機器視覺運動

      推薦產品

      更多
      主站蜘蛛池模板: 亚洲日本一区二区一本一道| 精品日韩在线视频一区二区三区| 精品欧洲AV无码一区二区男男| 少妇精品无码一区二区三区| 国产成人一区二区三区精品久久| 亚洲国产精品自在线一区二区| 精品免费AV一区二区三区| 日本免费电影一区二区| 亚洲熟女少妇一区二区| 高清在线一区二区| 精品国产一区二区三区在线| 亚洲福利视频一区二区三区| 国产人妖视频一区二区| 任你躁国产自任一区二区三区| av在线亚洲欧洲日产一区二区| 国产大秀视频一区二区三区| 精品人妻无码一区二区色欲产成人| 日韩精品一区二区亚洲AV观看| 中文字幕在线观看一区| 日本在线观看一区二区三区| 后入内射国产一区二区| 日韩经典精品无码一区| 日本一区二区在线不卡| www一区二区三区| 亚洲国产av一区二区三区| 日韩一区二区在线观看| 日本视频一区二区三区| 亚洲男人的天堂一区二区| 亚洲视频在线一区二区| 久久se精品一区二区影院| 亚洲国产一区视频| 天码av无码一区二区三区四区 | 一区二区三区福利视频| 精品一区二区三区在线播放| 国产一区美女视频| 亚洲乱码一区二区三区在线观看| 成人无码AV一区二区| 99精品一区二区三区| 色综合久久一区二区三区| 影院无码人妻精品一区二区| 日韩精品无码一区二区三区AV |