Zmotion快速入門(mén)之EtherCAT通信
新閣教育-喜科堂付工原創(chuàng)文章
本案例采用Zmotion運(yùn)動(dòng)控制卡與伺服驅(qū)動(dòng)器進(jìn)行EtherCAT通信,從而實(shí)現(xiàn)對(duì)伺服電機(jī)的相關(guān)控制。
硬件連接
因?yàn)椴捎每偩€的原因,所以基本上不用接線,硬件原理圖如下所示:

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

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

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

這兩點(diǎn)注意,伺服電機(jī)就應(yīng)該可以動(dòng)起來(lái)了。
軟件開(kāi)發(fā)
后續(xù)的軟件開(kāi)發(fā)主要就是封裝應(yīng)用,Zmotion的使用會(huì)涉及到兩個(gè)dll庫(kù)(zauxdll.dll和zmotion.dll)和一個(gè)Zmcaux.cs類(lèi)文件,提前將這兩個(gè)dll庫(kù)復(fù)制到根目錄下,然后手動(dòng)將Zmcaux.cs類(lèi)添加到你的項(xiàng)目中。
創(chuàng)建一個(gè)新的Zmotion.cs類(lèi),對(duì)Zmcaux.cs中的一些方法進(jìn)行二次封裝,便于后續(xù)項(xiàng)目的應(yīng)用。
二次封裝的方式每個(gè)人都會(huì)根據(jù)自己的編碼習(xí)慣,進(jìn)行不同程度的封裝,下面我僅列舉部分我的封裝方法,僅供參考:
建立連接:EtherCAT連接之前需要執(zhí)行一個(gè)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é)點(diǎn)數(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);
????????????????????//任務(wù)1重新運(yùn)行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文件中的變量判斷總線類(lèi)型
????????????????????????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)連接失敗"
????????????};
????????}
點(diǎn)位運(yùn)動(dòng):點(diǎn)位運(yùn)動(dòng)主要就是根據(jù)軸號(hào)、速度、加速度、脈沖當(dāng)量進(jìn)行正轉(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();
???????????}
???????}
停止運(yùn)動(dòng):停止運(yùn)動(dòng)比較簡(jiǎn)單,調(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();
???????????}
???????}
開(kāi)發(fā)界面
這里做了一個(gè)簡(jiǎn)單的控制界面,實(shí)現(xiàn)了基本的板卡連接、點(diǎn)動(dòng)、連續(xù)運(yùn)動(dòng)、伺服使能等基本控制功能。

直播間免費(fèi)領(lǐng)獎(jiǎng)品,掃碼進(jìn)入↓
