Zmotion快速入門之EtherCAT通信
本案例采用Zmotion運動控制卡與伺服驅(qū)動器進行EtherCAT通信,從而實現(xiàn)對伺服電機的相關控制。
硬件連接
因為采用總線的原因,所以基本上不用接線,硬件原理圖如下所示:

將PC通過Ethernet連接至運動控制卡,然后運動控制卡的EtherCAT接至伺服驅(qū)動器,伺服驅(qū)動器與伺服電機之間通過配套電纜進行連接【文章末尾有視頻介紹】。
快速上手
第一次使用時,最好的方式就是看編程手冊,并結(jié)合官方提供的案例來學習使用。
Zmotion廠家提供的配套資料,我會傳到公眾號里,需要的小伙伴,可以后臺回復?Zmotion?獲取
在保證硬件沒有問題的前提下(這里主要是指伺服驅(qū)動器,至少能夠手動轉(zhuǎn)起來),打開 ZMC光盤資料\8.PC編程相關\函數(shù)庫2.1\windows平臺\64位庫\C#\例程\例程8-總線控制運動 中的源程序,運行起來如下所示:

這里有兩個地方要注意,不然是運行不起來的。
案例中提供的ECAT初始化.bas文件,最大軸數(shù)是32,需要根據(jù)實際情況修改,否則會報錯,我這里改成16。

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

這兩點注意,伺服電機就應該可以動起來了。
軟件開發(fā)
后續(xù)的軟件開發(fā)主要就是封裝應用,Zmotion的使用會涉及到兩個dll庫(zauxdll.dll和zmotion.dll)和一個Zmcaux.cs類文件,提前將這兩個dll庫復制到根目錄下,然后手動將Zmcaux.cs類添加到你的項目中。
創(chuàng)建一個新的Zmotion.cs類,對Zmcaux.cs中的一些方法進行二次封裝,便于后續(xù)項目的應用。
二次封裝的方式每個人都會根據(jù)自己的編碼習慣,進行不同程度的封裝,下面我僅列舉部分我的封裝方法,僅供參考:
建立連接:EtherCAT連接之前需要執(zhí)行一個bas文件,根據(jù)案例中的代碼封裝如下:
/// <summary>
/// 初始化卡
/// </summary>
/// <param name="ipAddress">IP地址</param>
/// <param name="file">BAS文件</param>
/// <param name="tempstatus">總線初始化完成狀態(tài)</param>
/// <param name="m_BusNodeNum">節(jié)點數(shù)</param>
/// <returns>操作結(jié)果</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)
{
//執(zhí)行初始化
StringBuilder buffer = new StringBuilder(10240);
//任務1重新運行BAS中的初始化函數(shù)
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文件中的變量判斷總線初始化完成狀態(tài)
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 = "以太網(wǎng)連接失敗"
};
}
點位運動:點位運動主要就是根據(jù)軸號、速度、加速度、脈沖當量進行正轉(zhuǎn)或反轉(zhuǎn),代碼如下:
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();
}
}
停止運動:停止運動比較簡單,調(diào)用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();
}
}
開發(fā)界面
這里做了一個簡單的控制界面,實現(xiàn)了基本的板卡連接、點動、連續(xù)運動、伺服使能等基本控制功能。
