91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

PC強實時運動控制(一):C#的EtherCAT總線初始化(上)

正運動技術(shù) ? 來源:正運動技術(shù) ? 作者:正運動技術(shù) ? 2025-12-19 14:23 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

今天,正運動小助手給大家分享一下強實時運動控制內(nèi)核MotionRT750下PC上位機的EtherCAT總線初始化。

PC上位機EtherCAT總線的初始化方式主要分為兩種:純上位機初始化和下載BASIC腳本初始化。本文將詳細講解如何通過純上位機的方法來實現(xiàn)PC上位機EtherCAT總線初始化。

全國產(chǎn)強實時運動控制內(nèi)核MotionRT750

MotionRT750是正運動技術(shù)首家自主自研的

x86架構(gòu)Windows系統(tǒng)或Linux系統(tǒng)下獨占確定CPU的強實時運動控制內(nèi)核。

wKgZPGlE71iAN_VdAAIoOvONu1416.webp

該方案采用獨占確定CPU內(nèi)核技術(shù)實現(xiàn)超強性能的強實時運動控制。它將核心的運動控制、機器人算法、數(shù)控(CNC)及機器視覺等強實時的任務(wù),集中運行在1-2個專用CPU核上。與此同時,其余CPU核則專注于處理Windows/Linux相關(guān)的非實時任務(wù)。

此外集成MotionRT750 Runtime實時層與操作系統(tǒng)非實時層,并利用高速共享內(nèi)存進行數(shù)據(jù)交互,顯著提升了運動控制與上層應(yīng)用間的通信效率及函數(shù)執(zhí)行速度,最終實現(xiàn)更穩(wěn)定、更高效的智能裝備控制,確保了運動控制任務(wù)的絕對實時性與系統(tǒng)穩(wěn)定性,特別適用于半導體、電子裝備等高速高精的應(yīng)用場合。

wKgZO2lE71iAL4HZAADQ7qECdI496.webp

MotionRT750應(yīng)用優(yōu)勢:

1.跨平臺兼容性:支持Windows/Linux系統(tǒng),適配不同等級CPU。

2.開發(fā)靈活性:提供多語言編程接口,便于二次開發(fā)與功能定制。

3.實時性提升:通過CPU內(nèi)核獨占機制與高效LOCAL接口,實現(xiàn)2-3us指令交互周期,較傳統(tǒng)PCI/PCIe方案提速近20倍。

4.擴展能力強化:多卡多EtherCAT通道架構(gòu)支持254軸運動控制及500usEtherCAT周期。

5.系統(tǒng)穩(wěn)定性:32軸125us EtherCAT冗余架構(gòu)消除單點故障風險,保障連續(xù)生產(chǎn)。

6.安全可靠性:不懼Windows系統(tǒng)崩潰影響,藍屏時仍可維持急停與安全停機功能有效,確保產(chǎn)線安全運行。

7.功能擴展性:實時內(nèi)核支持C語言程序開發(fā),方便功能拓展與實時代碼提升效率。

MotionRT750視頻介紹可點擊→正運動強實時運動控制內(nèi)核MotionRT750。

更多關(guān)于MotionRT750的詳情介紹與使用點擊→強實時運動控制內(nèi)核MotionRT750(一):驅(qū)動安裝、內(nèi)核配置與使用。

01 C#語言進行PC上位機的EtherCAT總線初始化項目開發(fā)

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

wKgZPGlE71iAIIT3AABa_jnb5wU29.webp

2.選擇開發(fā)語言為“C#”和Windows窗體應(yīng)用程序,點擊下一步。

wKgZO2lE71iAUN5NAABJrsKZ-_k28.webp

3.配置好項目名稱和位置,以及相應(yīng)框架,點擊創(chuàng)建。

wKgZPGlE71mANfUsAAERejuk6RM136.png

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

進入廠商提供的光盤資料,找到zauxdll.dll,zmotion.dll和Zmcaux.cs這三個庫文件。庫文件路徑:【00光盤資料】→【04PC函數(shù)】→【01PC函數(shù)庫V2.1】→【W(wǎng)indows平臺】→【C#】→【64位】→【庫文件】。

wKgZO2lE71mALI5BAACK0ENmtXg63.webp

5.使用純上位機總線初始化時需要找廠商提供ZMotionECAT.cs文件。

wKgZPGlE71mATfjlAAB8dlZNDPg21.webp

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

(1)將zmcaux.cs和ZMotionECAT.cs文件復制到新建的項目里面中。

wKgZO2lE71mALZdGAACk5LG80fE08.webp

(2)將zauxdll.dll和zmotion.dll文件放入bindebug文件夾中。

wKgZPGlE71qAIbhEAACq5O9iy3455.webp

(3)將Zmcaux.cs和ZMotionECAT.cs文件添加進項目中。右鍵項目名稱,選擇添加,再選擇現(xiàn)有項,選擇Zmcaux.cs和ZMotionECAT.cs文件。

wKgZO2lE71qAa3rAAAEC3J_tcmc08.webp

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

wKgZPGlE71qAJuF2AADFCP0FLnE08.webp

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

02 相關(guān)PC函數(shù)介紹

PC函數(shù)手冊可在光盤資料獲取,具體路徑如下:“00光盤資料3編程手冊3ZMotion PC函數(shù)庫編程手冊”。

wKgZPGlE71qAVxs8AABrYOzB17080.webp

1.上位機連接MotionRT750的接口。

wKgZO2lE71uAdp1CAABqBf99MGA929.png

2.控制器回零模式。

wKgZPGlE71uAEumRAACe0H8afOc155.png

3.驅(qū)動器回零模式。

wKgZO2lE71uAcMHoAABrz922n5o788.png

03 PC純上位機總線初始流程

wKgZPGlE71uAEqWCAABjkHGkiZA10.webp

總線初始化代碼:

///
///EtherCat 總線掃描與初始化  該接口會阻塞線程,阻塞時長為超時時間
//////句柄///槽位號,控制器的Ecat總線槽一般為0
///總線初始化信息結(jié)構(gòu)體,設(shè)置總線軸號分配情況,總線IO分配情況
///超時時間
///ActionlogCallback = null回調(diào)函數(shù) 獲取在線命令錯誤的返回字符串
///返回值,小于 0 表示錯誤,參考枚舉 EcatInitErrCode,0 表示線程初始化成功,大于0:單個或多個zaux接口錯誤碼的累加值
publicstaticintZAux_BusCmd_EcatInit(IntPtr handle,intSlotId, EcatInitInfoSet EcatInfo,intApiOutTime, Action logCallback =null)
{
intIresult=0;//接口返回值,錯誤碼
intOutTime=ApiOutTime;//保存接口的超時時間
intEcatScanOutTime=ApiOutTime;//掃描超時時間
intIdleOutTime=100;//等待停止的超時時間
floatScanNodeNum=0;//掃描到的節(jié)點數(shù)量
StringBuilderReceBuff=newStringBuilder(256);
byte[]cmdbuff=newbyte[2048];
intDrive_Vender,Drive_Device,Drive_Alias;//是否初始化Ecat初始化參數(shù)
if(EcatInfo.InitStructFlag==1)
{
//1.本地軸相關(guān)參數(shù),用于指定本地軸的起始軸號和本地軸的數(shù)目
EcatInfo.LocalAxisId=0;//本地軸起始ID[默認0],若使用則從0開始
EcatInfo.LocalAxisNum=0;//本地軸使用的軸數(shù)量[默認0],若使用則從0開始
//2.驅(qū)動軸相關(guān)參數(shù),用于指定總線驅(qū)動軸的起始軸號和總線軸的數(shù)目
EcatInfo.DriveAxisStart=0;//驅(qū)動軸起始ID[默認0],第1個驅(qū)動軸為DriveAxisStart,第2個為DriveAxisStart+1以此類推
EcatInfo.DriveAxisNum=-1;//驅(qū)動軸數(shù)量[默認-1],-1表示不指定驅(qū)動軸數(shù)量,若為0表示掃描到的軸數(shù)量,會檢查掃描到的軸數(shù)量是否一致
EcatInfo.DriveIoStara=256;//驅(qū)動IO映射到寄存器后的前一個IO起始地址
EcatInfo.DriveIoSpa=16;//一個驅(qū)動映射多少個IO端口數(shù)量
for(inti=0;i0)
{
Iresult+=zmcaux.ZAux_Direct_GetIfIdle(handle,i,refIdle);
if(Idle==-1)
{
break;
}
MyDelayMs(10,refOutTime);
IdleOutTime=IdleOutTime-10;
}
}
//2、本地軸號重映射
for(inti=0;ii映射到LocalAxisId-->LocalAxisId+i
Iresult+=zmcaux.ZAux_Direct_SetAtype(handle,EcatInfo.LocalAxisId+i,1);
}
//3、DC同步時鐘的設(shè)置
if(EcatInfo.SysClockMode==1)
{
Iresult+=zmcaux.ZAux_Execute(handle,"SYSTEM_ZSET=SET_BIT(7,SYSTEM_ZSET)",ReceBuff,256);//打開總線時鐘優(yōu)化
}
else
{
Iresult+=zmcaux.ZAux_Execute(handle,"SYSTEM_ZSET=CLEAR_BIT(7,SYSTEM_ZSET)",ReceBuff,256);//關(guān)閉總線時鐘優(yōu)化
}
if(0!=Iresult)//階段錯誤碼攔截!
{
returnIresult;
}
//用于保存SlotScan回調(diào)中的字符串
stringslotScanLog=null;
stringfirstLine=null;
//自定義回調(diào):捕獲字符串,并可選地轉(zhuǎn)發(fā)給外部
ActioncaptureCallback=(msg)=>
{
slotScanLog=msg;//捕獲回調(diào)內(nèi)容!
logCallback?.Invoke(msg);//同時通知外部(保持原有行為)
};
//4、如果前面的流程都正常,則進行第一次總線掃描,進行DC偏移時間的設(shè)置
for(intii=0;ii=0)
{
//判斷節(jié)點數(shù)目是否正確
if((int)ScanNodeNum!=EcatInfo.EcatNodeNum)
{
//節(jié)點數(shù)目不一致
return(int)EcatInitErrCode.WrongNodeNum;
}
}
//【7、總線軸個數(shù)判斷,看看軸數(shù)是否可以對上】
intBusAxisNum=0;//總線軸個數(shù)
intNodeAxisNum=0;//當前節(jié)點軸個數(shù)
if(EcatInfo.DriveAxisNum>=0)
{
for(intj=0;j5)||(ZmlInfo!=NodeInfo))
{
return(int)EcatInitErrCode.DcShiftSetFailu;//DC偏移設(shè)置失敗
}
}
//遍歷節(jié)點的各個電機
for(intj=0;j=EcatInfo.DriveIoStara)
{
Iresult+=zmcaux.ZAux_Direct_SetRevIn(handle,EcatInfo.DriveAxisStart+BusAxisNum,-1);
Iresult+=zmcaux.ZAux_Direct_SetInvertIn(handle,TempVar,0);
}
//取消正限位的設(shè)置
Iresult+=zmcaux.ZAux_Direct_GetFwdIn(handle,EcatInfo.DriveAxisStart+BusAxisNum,refTempVar);
if(TempVar>=EcatInfo.DriveIoStara)
{
Iresult+=zmcaux.ZAux_Direct_SetFwdIn(handle,EcatInfo.DriveAxisStart+BusAxisNum,-1);
Iresult+=zmcaux.ZAux_Direct_SetInvertIn(handle,TempVar,0);
}
//取消設(shè)置原點
Iresult+=zmcaux.ZAux_Direct_GetDatumIn(handle,EcatInfo.DriveAxisStart+BusAxisNum,refTempVar);
if(TempVar>=EcatInfo.DriveIoStara)
{
Iresult+=zmcaux.ZAux_Direct_SetDatumIn(handle,EcatInfo.DriveAxisStart+BusAxisNum,-1);
Iresult+=zmcaux.ZAux_Direct_SetInvertIn(handle,TempVar,0);
}
}
}
//每軸單獨分組,軸報警只停自己
CmdBuff=string.Format("DISABLE_GROUP({0})",EcatInfo.DriveAxisStart+BusAxisNum);
Iresult+=zmcaux.ZAux_Execute(handle,CmdBuff,ReceBuff,256);
//總線軸計數(shù)+1
BusAxisNum=BusAxisNum+1;
}
/***************************************************************************************
-------------------------------2:IO模塊和AIO模塊的設(shè)置------------------------------
***************************************************************************************/
//ECAT節(jié)點數(shù)字量IO起始地址的映射
if(EcatInfo.NodeIoId[i]>=32)
{
CmdBuff=string.Format("NODE_IO({0},{1})={2}",SlotId,i,EcatInfo.NodeIoId[i]);
Iresult+=zmcaux.ZAux_Execute(handle,CmdBuff,ReceBuff,256);
}
//ECAT節(jié)點模擬量IO起始地址的映射
if(EcatInfo.NodeAIoId[i]>0)
{
CmdBuff=string.Format("NODE_AIO({0},{1})={2}",SlotId,i,EcatInfo.NodeAIoId[i]);
Iresult+=zmcaux.ZAux_Execute(handle,CmdBuff,ReceBuff,256);
}
/***************************************************************************************
--------------------------------3:特殊模塊的設(shè)置----------------------------------
***************************************************************************************/
//正運動EIO24088脈沖擴展軸和EIO16084脈沖擴展軸軸類型的設(shè)置與脈沖模式的設(shè)置
if((Drive_Device==0x1AB0)&&(Drive_Vender==0x41B))
{for(intk=0;k=(EcatInfo.DriveAxisStart);Drivei--)
{
zmcaux.ZAux_Direct_SetAxisEnable(handle,Drivei,1);//總線軸通過這個指令上使能
MyDelayMs(10,refOutTime);
}
}
returnIresult;
}
else
{
//獲取在線命令返回字符串傳給主窗口
firstLine=string.IsNullOrEmpty(slotScanLog)
?string.Empty
:slotScanLog.Split(new[]{'r','n'},StringSplitOptions.RemoveEmptyEntries).FirstOrDefault();
if(!string.IsNullOrEmpty(firstLine))
{
ZMotionECAT.Instance.DoWork(firstLine);
}
return(int)EcatInitErrCode.EcatStartFailu;//總線開啟失敗
}
}
//獲取在線命令返回字符串傳給主窗口
firstLine=string.IsNullOrEmpty(slotScanLog)
?string.Empty
:slotScanLog.Split(new[]{'r','n'},StringSplitOptions.RemoveEmptyEntries).FirstOrDefault();
if(!string.IsNullOrEmpty(firstLine))
{
ZMotionECAT.Instance.DoWork(firstLine);
}
}
return(int)EcatInitErrCode.NotScanNode;
}
//////停止槽位號是SlotId的總線通訊
//////句柄///返回值zaux接口錯誤碼publicstaticintZAux_BusCmd_SlotStop(IntPtrhandle,intSlotId)
{
stringCmdBuff=string.Format("SLOT_STOP({0})",SlotId);
StringBuilderReceBuff=newStringBuilder(256);
returnzmcaux.ZAux_Execute(handle,CmdBuff,ReceBuff,256);
}
//////掃描控制器對應(yīng)槽的總線設(shè)備
//////句柄///返回值zaux接口錯誤碼///ActionlogCallback=null回調(diào)函數(shù)獲取在線命令錯誤的返回字符串
publicstaticintZAux_BusCmd_SlotScan(IntPtrhandle,intSlotId,refintOutTime,ActionlogCallback=null)
{
intScanOkFlag=0;
intIresult=0;
intEcatScanOutTime;
UInt32puiread=0;
uint8pbifExcuteDown=0;
byte[]ZmcReceBuff=newbyte[256];
EcatScanOutTime=OutTime;
//總線掃描指令的拼接
stringCmdBuff=string.Format("SLOT_SCAN({0})?RETURN",SlotId);
//定義接受緩沖器并清空
StringBuilderReceBuff=newStringBuilder(1024);
ReceBuff.Remove(0,ReceBuff.Length);
//開始掃描總線設(shè)備情況
Iresult+=zmcaux.ZAux_Execute(handle,CmdBuff,ReceBuff,1024);
//通過回調(diào)通知外部
stringresult=ReceBuff.ToString().Replace("-1n","");
logCallback?.Invoke(result);
//延時等待掃描結(jié)果
if(ReceBuff.ToString()=="-1n")
{
EcatScanOutTime=0;
ScanOkFlag=1;
returnScanOkFlag;
//Console.WriteLine("直接獲取-1,條件成功");
}elseif(ReceBuff.Length>0)//如果有其他的返回值則報未掃描到設(shè)備
{
ScanOkFlag=0;
//Console.WriteLine("直接獲取-1,條件失敗");
returnScanOkFlag;
}
else
{
MyDelayMs(500,refOutTime);
EcatScanOutTime=EcatScanOutTime-500;
}
while(EcatScanOutTime>0)
{
Array.Clear(ZmcReceBuff,0,ZmcReceBuff.Length);
//讀取在線命令的應(yīng)答,對沒有接收應(yīng)答的命令有用
Iresult+=zmcaux.ZMC_ExecuteGetReceive(handle,ZmcReceBuff,1000,refpuiread,refpbifExcuteDown);
if(ZmcReceBuff[0]!=0)
{
//返回負一表示有成功掃描到設(shè)備
if((ZmcReceBuff[0]==45)&&(ZmcReceBuff[1]==49)&&(ZmcReceBuff[2]==10))
{
ScanOkFlag=1;
//Console.WriteLine("while獲取-1,條件成功");
break;
}
else
{
ScanOkFlag=0;
//Console.WriteLine("while獲取-1,條件NG");
break;
}
}
MyDelayMs(50,refOutTime);
EcatScanOutTime=EcatScanOutTime-50;
}
returnScanOkFlag;}
/////打開總線
//////句柄///返回值zaux接口錯誤碼///ActionlogCallback=null回調(diào)函數(shù)獲取在線命令錯誤的返回字符串
publicstaticintZAux_BusCmd_SlotStart(IntPtrhandle,intSlotId,refintOutTime,ActionlogCallback=null)
{
intStartOkFlag=0;
intIresult=0;
intEcatScanOutTime;
StringBuilderReceBuff=newStringBuilder(1024);
UInt32puiread=0;
uint8pbifExcuteDown=0;
byte[]ZmcReceBuff=newbyte[256];
EcatScanOutTime=OutTime;
MyDelayMs(100,refOutTime);
stringCmdBuff=string.Format("SLOT_START({0},4)",SlotId);
Iresult+=zmcaux.ZAux_Execute(handle,CmdBuff,ReceBuff,256);
//通過回調(diào)通知外部
stringresult=ReceBuff.ToString().Replace("-1n","");
logCallback?.Invoke(result);
MyDelayMs(1000,refOutTime);
CmdBuff=string.Format("SLOT_START({0},8)?Return",SlotId);
Iresult+=zmcaux.ZAux_Execute(handle,CmdBuff,ReceBuff,256);
//延時等待掃描結(jié)果if(ReceBuff.ToString()=="-1n")
{
EcatScanOutTime=0;
StartOkFlag=1;
returnStartOkFlag;
//Console.WriteLine("直接獲取-1,條件成功");
}
elseif(ReceBuff.Length>0)//如果有其他的返回值則報未掃描到設(shè)備
{
StartOkFlag=0;
//Console.WriteLine("直接獲取-1,條件失敗");
returnStartOkFlag;
}
else
{
MyDelayMs(500,refOutTime);
EcatScanOutTime=EcatScanOutTime-500;
}
while(EcatScanOutTime>0)
{
Array.Clear(ZmcReceBuff,0,ZmcReceBuff.Length);
//讀取在線命令的應(yīng)答,對沒有接收應(yīng)答的命令有用
Iresult+=zmcaux.ZMC_ExecuteGetReceive(handle,ZmcReceBuff,1000,refpuiread,refpbifExcuteDown);
if(ZmcReceBuff[0]!=0)
{
//返回負一表示有成功掃描到設(shè)備
if((ZmcReceBuff[0]==45)&&(ZmcReceBuff[1]==49)&&(ZmcReceBuff[2]==10))
{
StartOkFlag=1;
//Console.WriteLine("while獲取-1,條件成功");
break;
}
else
{
StartOkFlag=0;
//Console.WriteLine("while獲取-1,條件NG");
break;
}
}
MyDelayMs(50,refOutTime);
EcatScanOutTime=EcatScanOutTime-50;
}
returnStartOkFlag;
}

04 C#總線初始化功能展示例程介紹

一、選擇連接方式為LOCAL連接,點擊【連接】。彈出連接成功提示框后,配置總線軸地址參數(shù)和本地脈沖軸地址參數(shù)后,點擊【總線初始化】,會在界面表格中顯示總線相關(guān)信息。

wKgZO2lE71yALmgcAACMYr8LYbE07.webp

1.若無法成功總線初始化,命令與輸出窗口會打印相關(guān)錯誤信息。如:Unknown device man XXXSlot return error:3205.

報錯信息如下圖,則需要先詢問對應(yīng)驅(qū)動器廠家提供XML文件。

wKgZPGlE71yAPn3MAACJvqWT7XE58.webpwKgZO2lE71yAYKGpAAAHcrV2TWU673.jpg

解決方法:將驅(qū)動器廠家提供的XML文件,添加到RTSys項目的配置文件中。

(1)打開RTSys軟件,點擊【文件】,選擇【新建工程】。

wKgZPGlE712AcsOEAABrJIdSNYs75.webp

(2)選擇文件路徑,輸入文件名,然后點擊【保存】。

wKgZO2lE712AUhJZAADLcmqATFU07.webp

(3)右鍵點擊【配置文件】,選擇【添加到配置文件】,選中要添加的XML文件后點擊【打開】。

wKgZPGlE712AAfdDAADGVq9jfpc72.webp

(4)點擊菜單欄中的【控制器】,接著點擊【生成ZAR文件】,隨后點擊【瀏覽】來選擇生成ZAR文件的路徑。

wKgZO2lE712ALFT8AADNGpN5Ws072.webp

(5)將生成的ZAR文件放在項目的ZAR文件夾中,隨后進行總線初始化。

wKgZPGlE716AWmPeAACZioQNO3462.webp

具體代碼如下:

//獲取解決方案根目錄
stringsolutionDir=Path.GetFullPath(Path.Combine(AppContext.BaseDirectory,@"......"));
stringzarPath=Path.Combine(solutionDir,"ZAR");
//獲取所有文件的完整路徑string[]fileNames=Directory.GetFiles(zarPath).Select(Path.GetFileName).ToArray();
foreach(stringfileNameinfileNames)
{
//Init.zar為下載的ZAR文件名
if(fileName=="Init.zar")
{
stringpath=Path.Combine(zarPath,"Init.zar");
zmcaux.ZAux_ZarDown(g_handle,path,0);
AppendTextOut("ZAR文件下載成功?。。?,Color.DarkGoldenrod);
}
}

2.如需將對應(yīng)總線節(jié)點的IO狀態(tài)信息或模擬量信息映射到控制器上對應(yīng)起始地址查看,則修改對應(yīng)節(jié)點IO或模擬量的起始地址,修改完成后,點擊【保存】,再點擊【總線初始化】。

wKgZO2lE716Ae0RRAACnmikMsWo10.webp

3.通過RTSys軟件查看IO或模擬量映射的地址成功與否。

成功連接控制器后,在菜單欄中找到【控制器】→【控制器狀態(tài)】→【槽位0節(jié)點】,可以看到所有節(jié)點對應(yīng)的IO或模擬量起始地址??梢栽诳偩€初始化完成后觀看此界面確認IO或模擬量起始地址映射正常。

wKgZPGlE716AYSTOAAC1evpDWos67.webp

相關(guān)代碼介紹:

(1)上位機如何鏈接上MotionRT750。

if(Controler_IP.Text!=null&&Controler_IP.Text!="")
{
intret=-1;
switch(Connect_ModeIP.Text)
{
case"IP":
//控制器IP地址連接
ret=zmcaux.ZAux_FastOpen(2,Controler_IP.Text.Trim(),5000,outg_handle);
break;
case"COM":
//控制器COM串口號連接
ret=zmcaux.ZAux_OpenCom(uint.Parse(Controler_IP.Text),outg_handle);
break;
case"LOCAL":
//LOCAL接口連接RT750
ret=zmcaux.ZAux_FastOpen(5,Controler_IP.Text.Trim(),5000,outg_handle);
break;
case"PCI":
//插入卡槽卡號連接PCI卡
ret=zmcaux.ZAux_FastOpen(4,Controler_IP.Text.Trim(),5000,outg_handle);
break;
}
if(ret!=0)
{
MessageBox.Show("IP鏈接失敗,報錯碼:"+ret.ToString());
}
else
{
if(g_handle!=(IntPtr)0)
{
//連接成功后停止所有軸
ret=zmcaux.ZAux_Direct_Rapidstop(g_handle,2);
MessageBox.Show("鏈接成功!");
this.Text="已連接";
timer1.Enabled=true;
}
}
}

(2)總線初始化結(jié)構(gòu)體定義,自定義初始化所需的變量,例如LocalAxisId(本地軸起始ID)和LocalAxisNum(本地軸使用的軸數(shù)量)。

具體變量信息可以在解決方案中點擊ZMotionEcat.cs文件進行查看。

其中,DrivePdoMode用于設(shè)置每個軸的發(fā)送PDO和接收PDO的配置選擇。不同模式對應(yīng)的PDO數(shù)據(jù)各不相同。

例如,若總線軸需切換至EtherCAT周期速度模式或EtherCAT周期力矩模式,則相應(yīng)的PDO列表必須包含對應(yīng)數(shù)據(jù),如模式17和18支持三種總線模式。

具體列表數(shù)據(jù)請參考RTBasic手冊中的drive_profile說明。

if(textBox1.Text==""||textBox3.Text=="")
{
Console.WriteLine("總線參數(shù)不能為空");
return;
}
//定義總線初始化的信息結(jié)構(gòu)體個數(shù),最多可以支持128個節(jié)點MyEcatInit.EcatInitInfoSetecatInitInfo=new
MyEcatInit.EcatInitInfoSet(int.Parse(textBox3.Text));
?ecatInitInfo.InitStructFlag=0;//是否自定義初始化參數(shù),設(shè)置1的話使用默認的總線初始化參數(shù),設(shè)置成0則需要自定義總線初始化相關(guān)參數(shù)
if(ecatInitInfo.InitStructFlag!=1)
{
//1.本地軸參數(shù),用于指定本地軸的起始ID和使用的軸數(shù)量
ecatInitInfo.LocalAxisId=int.Parse(textBox2.Text);//本地軸起始ID
ecatInitInfo.LocalAxisNum=int.Parse(textBox4.Text);//本地軸使用的軸數(shù)量
//2.驅(qū)動軸相關(guān)參數(shù),用于指定驅(qū)動軸的起始ID和數(shù)量
ecatInitInfo.DriveAxisStart=int.Parse(textBox1.Text);//驅(qū)動軸起始ID,第1個驅(qū)動軸為DriveAxisStart,第2個為DriveAxisStart+1以此類推
ecatInitInfo.DriveAxisNum=-1;//驅(qū)動軸數(shù)量[默認-1],-1表示總線初始化的時候不判斷驅(qū)動的軸數(shù)量是否對上,若為0表示掃描到的軸數(shù)量,會檢查掃描到的軸數(shù)量是否一致
ecatInitInfo.EcatNodeNum=int.Parse(textBox3.Text);//總線節(jié)點數(shù)目[默認-1],-1表示總線初始化的時候不判斷節(jié)點個數(shù)是否對上
for(inti=0;i


二、點擊【軸參數(shù)初始化】進入軸控制界面,開始總線軸的手動調(diào)試運動。

1.軸的使能控制。首先將軸類型切換到總線軸,再觀察軸使能狀態(tài)指示燈的顏色,可以準確判斷軸的使能情況:綠色代表已使能,紅色則表示未使能。點擊圖案即可切換軸的使能狀態(tài)。

wKgZO2lE71-AZI0EAAENNiEvxVA27.webp

2.配置好軸參數(shù)、軸號及相關(guān)參數(shù)后,通過左轉(zhuǎn)右轉(zhuǎn)手動調(diào)試軸運動。

建議將【脈沖當量】設(shè)置為機臺運動1mm所需的脈沖數(shù)。若按此推薦設(shè)置,【速度】的單位為mm/s,【加速度】和【減速度】的單位則為mm/s2。

通常,【加速度】和【減速度】設(shè)置為速度的10倍。

3.若在調(diào)試過程中不確定機臺運動1mm所需的脈沖數(shù),可將【脈沖當量】設(shè)為1。

為安全起見,【速度】可先設(shè)為10,此時左右整體速度為1*10=10個脈沖每秒,【加速度】和【減速度】均設(shè)為1000。隨后手動運動軸,觀察軸是否運動及【反饋位置】是否有變化。

若手動運動時【反饋位置】數(shù)據(jù)變化但實際軸未動,可逐步將【脈沖當量】以10倍遞增,每次調(diào)整后反復手動運動,檢查軸是否運動。

【反饋位置】由編碼器反饋,若其數(shù)據(jù)變化,軸必定在運動;若肉眼難以察覺,可能是機臺運動較慢。

wKgZO2lE71-AWPxyAAESRObjmiQ56.webp

手動運動和寸動代碼如下:

//參數(shù)同步
zmcaux.ZAux_Direct_SetAtype(g_handle,axis[select_axis],int.Parse(atype_s[select_axis]));//設(shè)置軸類型
zmcaux.ZAux_Direct_SetUnits(g_handle,axis[select_axis],units[select_axis]);//設(shè)置脈沖當量
zmcaux.ZAux_Direct_SetAccel(g_handle,axis[select_axis],accel[select_axis]);//設(shè)置加速度
zmcaux.ZAux_Direct_SetDecel(g_handle,axis[select_axis],decel[select_axis]);//設(shè)置減速度
zmcaux.ZAux_Direct_SetSpeed(g_handle,axis[select_axis],speed[select_axis]);//設(shè)置運行速度
zmcaux.ZAux_Direct_SetFsLimit(g_handle,axis[select_axis],Fslimit[select_axis]);//設(shè)置正向軟限位
zmcaux.ZAux_Direct_SetRsLimit(g_handle,axis[select_axis],Rslimit[select_axis]);//設(shè)置負向軟限位
zmcaux.ZAux_Direct_SetFastDec(g_handle,axis[select_axis],speed[select_axis]*accel[select_axis]);//設(shè)置快減減速度,達到限位或異常停止時自動采用
Thread.Sleep(1);
if(param

三、在確保手動運動正常且方向無誤的前提下,我們可以繼續(xù)測試軸的回零功能。

若未勾選【啟用控制器回零方式】,則默認采用總線驅(qū)動器回零(精度更高,推薦使用,驅(qū)動器回零參考驅(qū)動器手冊)。

此時,需參照總線驅(qū)動器手冊中對回零模式的說明,并將原點傳感器連接至驅(qū)動器的原點輸入口。若勾選【啟用控制器回零方式】,則使用控制器回零,具體回零方式可參考下拉框中的介紹。

在實際項目中,仍建議優(yōu)先選擇總線驅(qū)動器回零?;亓銣y試步驟如下:

1.選擇回零軸號,配置軸的正限位信號、負限位信號及原點信號后,點擊【配置軸IO】。若軸狀態(tài)顯示“30h”,則勾選【反轉(zhuǎn)】,并再次點擊【配置軸IO】。

2.配置速度、爬行速度及回零模式后,點擊【啟動回零】。若出現(xiàn)方向錯誤或速度過快的情況,請立即點擊【緊急停止】,并重新進行調(diào)試。

wKgZPGlE71-AFuqpAAERBvpc3No77.webp

3.若軸狀態(tài)顯示“8h”,則表示驅(qū)動器出現(xiàn)報錯。以下是遇到驅(qū)動器報警后的處理方法。

wKgZO2lE72CAdOetAAEMtHvqsJc72.webp

(1)檢查驅(qū)動器上的LED面板是否顯示報錯信息,報錯時將呈現(xiàn)相應(yīng)的錯誤碼。

wKgZPGlE72CAO3ehAABhrlit88w06.webp

常見的錯誤,如驅(qū)動器過載和轉(zhuǎn)矩飽和異常等,均可通過【清除報警】按鈕清除。

wKgZO2lE72CAVLBQAACLcBCyZZc96.webp

具體代碼如下:

intposition=3;//獲取第3位
intvalue=0;
zmcaux.ZAux_BusCmd_DriveClear(g_handle,(uint)param,0);//清除總線伺服軸報警
Thread.Sleep(5000);//等待報警清除
zmcaux.ZAux_BusCmd_SDOReadAxis(g_handle,(uint)param,0x6041,0,6,refvalue);//讀取驅(qū)動器狀態(tài)字對應(yīng)數(shù)據(jù)字典6041
if(((value>>position)&1)==0)
{
zmcaux.ZAux_Direct_Single_Datum(g_handle,param,0);//清除控制器報警
Thread.Sleep(100);
zmcaux.ZAux_Direct_SetAxisEnable(g_handle,param,1);//重新上使能
MessageBox.Show("報警清除成功?。?!");
}
else{MessageBox.Show("報警清除失敗,重新清除或查找報錯原因!?。?);}

(2)如果通過代碼無法清除報警,絕大多數(shù)驅(qū)動器報警問題可以通過斷電并重啟驅(qū)動器來解決。若斷電重啟后報警依然存在,則需參照驅(qū)動器手冊進行錯誤排查,并可咨詢驅(qū)動器技術(shù)人員以獲取解決方案。

教學視頻請點擊→PC強實時運動控制(一):C#的EtherCAT總線初始化(上)

完整代碼獲取地址

wKgZPGlE72CAGISxAADO4aSNjdM253.jpg

本次,正運動技術(shù)PC強實時運動控制(一):C#的EtherCAT總線初始化(上),就分享到這里。

更多精彩內(nèi)容請關(guān)注“正運動小助手”公眾號,需要相關(guān)開發(fā)環(huán)境與例程代碼,請咨詢正運動技術(shù)銷售工程師:400-089-8936。

wKgZO2lE72GATLUeAADemj7stp868.webp

正運動技術(shù)專注于運動控制技術(shù)研究和通用運動控制軟硬件產(chǎn)品的研發(fā),是國家級高新技術(shù)企業(yè)。正運動技術(shù)匯集了來自華為、中興等公司的優(yōu)秀人才,在堅持自主創(chuàng)新的同時,積極聯(lián)合各大高校協(xié)同運動控制基礎(chǔ)技術(shù)的研究,是國內(nèi)工控領(lǐng)域發(fā)展最快的企業(yè)之一,也是國內(nèi)少有、完整掌握運動控制核心技術(shù)和實時工控軟件平臺技術(shù)的企業(yè)。主要業(yè)務(wù)有:運動控制卡_運動控制器_EtherCAT運動控制卡_EtherCAT控制器_運動控制系統(tǒng)_視覺控制器__運動控制PLC_運動控制_機器人控制器_視覺定位_XPCIe/XPCI系列運動控制卡等等。

審核編輯 黃宇

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 總線
    +關(guān)注

    關(guān)注

    10

    文章

    3044

    瀏覽量

    91709
  • 運動控制
    +關(guān)注

    關(guān)注

    5

    文章

    825

    瀏覽量

    34576
  • ethercat
    +關(guān)注

    關(guān)注

    20

    文章

    1524

    瀏覽量

    45444
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點推薦

    【正運動】高速高精,超高實時性的PCIe EtherCAT實時運動控制卡 | PCIE464

    提升運動控制的效率和精度,使其成為3C電子制造、半導體、裝配、精密加工、鋰電和光伏、機器人等領(lǐng)域單機或整條自動產(chǎn)線的理想選擇。PCIE464產(chǎn)品概述PCIE464是
    發(fā)表于 01-24 09:48

    EtherCAT超高速實時運動控制卡XPCIE1032H上位機C#開發(fā)(二):EtherCAT總線初始化

    上位機運動控制
    正運動技術(shù)
    發(fā)布于 :2023年11月17日 09:08:19

    EtherCAT運動控制卡之ECI2820如何使用

    今天,正運動技術(shù)給大家分享EtherCAT運動控制卡之ECI2820如何使用C#實現(xiàn)
    發(fā)表于 09-01 06:24

    EtherCAT總線運動控制的優(yōu)勢主要體現(xiàn)在哪?

    、節(jié)點與節(jié)點之間只要網(wǎng)線連接,系統(tǒng)電氣柜配線非常方便;b、系統(tǒng)抗干擾能力,網(wǎng)口就是隔離的,整個電氣系統(tǒng)的EMC特性好;c、EtherCAT初始化完成就可以直接讀取所有軸的多圈絕對值編
    發(fā)表于 02-20 10:20

    經(jīng)濟型EtherCAT運動控制器:EtherCAT總線快速入門

    相關(guān)參數(shù)的配置,EtherCAT總線初始化操作,以及初始化成功以后的運動控制。
    發(fā)表于 05-11 09:49

    EtherCAT總線運動控制的優(yōu)勢主要體現(xiàn)在哪?

    應(yīng)用EtherCAT總線運動控制優(yōu)勢: a、節(jié)點與節(jié)點之間只要網(wǎng)線連接,系統(tǒng)電氣柜配線非常方便; b、系統(tǒng)抗干擾能力,網(wǎng)口就是隔離的,整
    發(fā)表于 12-13 11:37

    EtherCAT總線快速入門

    本節(jié)主要介紹XPLC006E多軸經(jīng)濟型EtherCAT總線運動控制控制EtherCAT
    的頭像 發(fā)表于 08-11 14:40 ?8361次閱讀
    <b class='flag-5'>EtherCAT</b><b class='flag-5'>總線</b>快速入門

    Windows實時運動控制軟核():LOCAL高速接口測試之C#

    Windows下運動控制實時內(nèi)核MotionRT7的安裝和c#接口的使用。
    的頭像 發(fā)表于 12-03 16:05 ?2701次閱讀
    Windows<b class='flag-5'>實時運動</b><b class='flag-5'>控制</b>軟核(<b class='flag-5'>一</b>):LOCAL高速接口測試之<b class='flag-5'>C#</b>

    EtherCAT運動控制卡的硬件接線與C#的硬件外設(shè)讀寫與回零運動

    EtherCAT運動控制卡進行硬件接線與C#的硬件外設(shè)讀寫與回零運動
    的頭像 發(fā)表于 11-08 16:26 ?3941次閱讀
    <b class='flag-5'>EtherCAT</b><b class='flag-5'>運動</b><b class='flag-5'>控制</b>卡的硬件接線與<b class='flag-5'>C#</b>的硬件外設(shè)讀寫與回零<b class='flag-5'>運動</b>

    EtherCAT運動控制卡的硬件接線與C#的單軸運動控制

    EtherCAT運動控制卡實現(xiàn)C#的單軸運動控制的例程
    的頭像 發(fā)表于 10-22 16:07 ?4204次閱讀
    <b class='flag-5'>EtherCAT</b><b class='flag-5'>運動</b><b class='flag-5'>控制</b>卡的硬件接線與<b class='flag-5'>C#</b>的單軸<b class='flag-5'>運動</b><b class='flag-5'>控制</b>

    EtherCAT超高速實時運動控制卡XPCIE1032H上位機C#開發(fā)(二):EtherCAT總線初始化

    本文主要講解EtherCAT總線初始化、驅(qū)動器IO映射以及軸運動調(diào)試。
    的頭像 發(fā)表于 11-17 09:24 ?1575次閱讀
    <b class='flag-5'>EtherCAT</b>超高速<b class='flag-5'>實時運動</b><b class='flag-5'>控制</b>卡XPCIE1032H上位機<b class='flag-5'>C#</b>開發(fā)(二):<b class='flag-5'>EtherCAT</b><b class='flag-5'>總線</b><b class='flag-5'>初始化</b>

    EtherCAT超高速實時運動控制卡(二):EtherCAT總線初始化

    XPCIE1032H是款基于PCI Express的EtherCAT總線運動控制卡,可選6-64軸運動
    的頭像 發(fā)表于 11-20 09:40 ?4420次閱讀
    <b class='flag-5'>EtherCAT</b>超高速<b class='flag-5'>實時運動</b><b class='flag-5'>控制</b>卡(二):<b class='flag-5'>EtherCAT</b><b class='flag-5'>總線</b><b class='flag-5'>初始化</b>

    實時運動控制內(nèi)核MotionRT750():驅(qū)動安裝、內(nèi)核配置與使用

    實時運動控制內(nèi)核MotionRT750的驅(qū)動安裝與內(nèi)核配置
    的頭像 發(fā)表于 07-03 15:48 ?3731次閱讀
    <b class='flag-5'>強</b><b class='flag-5'>實時運動</b><b class='flag-5'>控制</b>內(nèi)核MotionRT750(<b class='flag-5'>一</b>):驅(qū)動安裝、內(nèi)核配置與使用

    EtherCAT總線初始化步驟

    EtherCAT(Ethernet for Control Automation Technology)是種高性能的工業(yè)以太網(wǎng)通信協(xié)議,廣泛應(yīng)用于工業(yè)自動領(lǐng)域。其初始化過程是確保系
    的頭像 發(fā)表于 12-22 10:10 ?635次閱讀
    <b class='flag-5'>EtherCAT</b><b class='flag-5'>總線</b><b class='flag-5'>初始化</b>步驟

    PC實時運動控制():C#EtherCAT總線初始化(下)

    通過使用配置工具導出ZAR文件進行EtherCAT總線初始化
    的頭像 發(fā)表于 02-05 10:00 ?1258次閱讀
    <b class='flag-5'>PC</b><b class='flag-5'>強</b><b class='flag-5'>實時運動</b><b class='flag-5'>控制</b>(<b class='flag-5'>一</b>):<b class='flag-5'>C#</b>的<b class='flag-5'>EtherCAT</b><b class='flag-5'>總線</b><b class='flag-5'>初始化</b>(下)