Zmotion快速入門之EtherCAT通信


新閣教育-喜科堂付工原創文章

本案例采用Zmotion運動控制卡與伺服驅動器進行EtherCAT通信,從而實現對伺服電機的相關控制。

硬件連接

因為采用總線的原因,所以基本上不用接線,硬件原理圖如下所示:

 

 

將PC通過Ethernet連接至運動控制卡,然后運動控制卡的EtherCAT接至伺服驅動器,伺服驅動器與伺服電機之間通過配套電纜進行連接。

快速上手

第一次使用時,最好的方式就是看編程手冊,並結合官方提供的案例來學習使用。

Zmotion廠家提供的配套資料,我會傳到公眾號里,需要的小伙伴,可以后台回復 Zmotion 獲取

在保證硬件沒有問題的前提下(這里主要是指伺服驅動器,至少能夠手動轉起來),打開 ZMC光盤資料\8.PC編程相關\函數庫2.1\windows平台\64位庫\C#\例程\例程8-總線控制運動 中的源程序,運行起來如下所示:

 

 

這里有兩個地方要注意,不然是運行不起來的。

  • 案例中提供的ECAT初始化.bas文件,最大軸數是32,需要根據實際情況修改,否則會報錯,我這里改成16。

 

 如果伺服沒有接限位開關,軸狀態應該是30H,表示正負限位報警,需要將正負限位禁用掉,具體操作是通過ZDevelop將FWD_IN和REV_IN設置為-1,當然后續可以通過代碼實現。

 

 

這兩點注意,伺服電機就應該可以動起來了。

軟件開發

后續的軟件開發主要就是封裝應用,Zmotion的使用會涉及到兩個dll庫(zauxdll.dll和zmotion.dll)和一個Zmcaux.cs類文件,提前將這兩個dll庫復制到根目錄下,然后手動將Zmcaux.cs類添加到你的項目中。

創建一個新的Zmotion.cs類,對Zmcaux.cs中的一些方法進行二次封裝,便於后續項目的應用。

二次封裝的方式每個人都會根據自己的編碼習慣,進行不同程度的封裝,下面我僅列舉部分我的封裝方法,僅供參考:

建立連接:EtherCAT連接之前需要執行一個bas文件,根據案例中的代碼封裝如下:

 /// <summary>
        /// 初始化卡
        /// </summary>
        /// <param name="ipAddress">IP地址</param>
        /// <param name="file">BAS文件</param>
        /// <param name="tempstatus">總線初始化完成狀態</param>
        /// <param name="m_BusNodeNum">節點數</param>
        /// <returns>操作結果</returns>
        public OperationResult InitCard(string ipAddress, string file, ref float tempstatus, ref int m_BusNodeNum)
        {
            int error = 0;
            error = zmcaux.ZAux_OpenEth(ipAddress, out zhandle);
            if (error == 0)
            {
                error = zmcaux.ZAux_BasDown(zhandle, file, 1);
                if (error == 0)
                {
                    //執行初始化
                    StringBuilder buffer = new StringBuilder(10240);
                    //任務1重新運行BAS中的初始化函數
                    error = zmcaux.ZAux_Execute(zhandle, "RUNTASK 1,Ecat_Init", buffer, 0);
                    if (error != 0)
                    {
                        return new OperationResult()
                        {
                            IsSuccess = true,
                            ErrorMsg = "初始化失敗"
                        };
                    }
                    IEC_Timer_TON ton = new IEC_Timer_TON(5000);
                    ton.Input = true;
                    while (true)
                    {
                        int ret = 0;
                        float Bus_type = 0.0f;
                        float m_BusAxisNum = 0.0f;
                        //讀取BAS文件中的變量判斷總線類型
                        ret += zmcaux.ZAux_Direct_GetUserVar(zhandle, "BUS_TYPE", ref Bus_type);
                        // 讀取BAS文件中的變量判斷總線初始化完成狀態
                        ret += zmcaux.ZAux_Direct_GetUserVar(zhandle, "Bus_InitStatus", ref tempstatus);
                        ret += zmcaux.ZAux_BusCmd_GetNodeNum(zhandle, 0, ref m_BusNodeNum);
                        ret += zmcaux.ZAux_Direct_GetUserVar(zhandle, "Bus_TotalAxisnum", ref m_BusAxisNum);
                        bool completed = ret == 0;
                        completed &= tempstatus == 1;
                        completed &= m_BusNodeNum > 0;
                        bool output = ton.Output;
                        if (completed)
                        {
                            break;
                        }
                        else if (!output)
                        {
                            continue;
                        }
                        else
                        {
                            if (tempstatus == -1)
                            {
                                return new OperationResult()
                                {
                                    IsSuccess = false,
                                    ErrorMsg = "正在初始化"
                                };
                            }
                            else
                            {
                                return new OperationResult()
                                {
                                    IsSuccess = false,
                                    ErrorMsg = "初始化失敗"
                                };
                            }
                        }
                    }
                    initedOK = true;
                    return OperationResult.CreateSuccessResult();
                }
                return new OperationResult()
                {
                    IsSuccess = true,
                    ErrorMsg = "文件下載失敗"
                };
            }
            return new OperationResult()
            {
                IsSuccess = true,
                ErrorMsg = "以太網連接失敗"
            };
        }

點位運動:點位運動主要就是根據軸號、速度、加速度、脈沖當量進行正轉或反轉,代碼如下:

  public OperationResult Move(int axisNo, float scale, float vel, float acc, bool dir)
       {
           int error = 0;
           error += zmcaux.ZAux_Direct_SetUnits(zhandle, axisNo, scale);
           error += zmcaux.ZAux_Direct_SetSpeed(zhandle, axisNo, vel);
           error += zmcaux.ZAux_Direct_SetAccel(zhandle, axisNo, acc);
           error += zmcaux.ZAux_Direct_Single_Vmove(zhandle, axisNo, dir ? 1 : -1);

           if (error > 0)
           {
               return OperationResult.CreateFailResult();
           }
           else
           {
               return OperationResult.CreateSuccessResult();
           }
       }

停止運動:停止運動比較簡單,調用ZAux_Direct_Single_Cancel指令即可。

public OperationResult Stop(int axisNo)
       {
           int error = 0;
           error = zmcaux.ZAux_Direct_Single_Cancel(zhandle, axisNo, 2);

           if (error > 0)
           {
               return OperationResult.CreateFailResult();
           }
           else
           {
               return OperationResult.CreateSuccessResult();
           }
       }

開發界面

這里做了一個簡單的控制界面,實現了基本的板卡連接、點動、連續運動、伺服使能等基本控制功能。

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM