技術(shù)頻道

娓娓工業(yè)
您現(xiàn)在的位置: 中國傳動網(wǎng) > 技術(shù)頻道 > 應(yīng)用方案 > 步進的光柵尺全閉環(huán)EtherCAT運動控制器ZMC432CL-V2(三):C#編程調(diào)試

步進的光柵尺全閉環(huán)EtherCAT運動控制器ZMC432CL-V2(三):C#編程調(diào)試

時間:2025-02-28 15:11:01來源:深圳市正運動技術(shù)有限公司

導(dǎo)語:?ZMC432CL-V2高性能多軸運動控制器是一款兼容EtherCAT總線和脈沖型的獨立式運動控制器,具備高速實時反饋功能,支持脈沖全閉環(huán)控制,能夠?qū)崿F(xiàn)高精度、高響應(yīng)速度的運動控制。

  上節(jié)課程給大家介紹了ZMC432CL-V2硬件接口(詳情點擊→步進的光柵尺全閉環(huán)EtherCAT運動控制器ZMC432CL-V2(一):硬件接口介紹)。

  本節(jié)主要講解如何通過C#編寫程序調(diào)試ZMC432CL-V2的脈沖閉環(huán)功能。

  一、ZMC432CL-V2產(chǎn)品簡介

  ZMC432CL-V2高性能多軸運動控制器是一款兼容EtherCAT總線和脈沖型的獨立式運動控制器,具備高速實時反饋功能,支持脈沖全閉環(huán)控制,能夠?qū)崿F(xiàn)高精度、高響應(yīng)速度的運動控制。高精度定位,有效消除機械傳動誤差,滿足高精密加工場景應(yīng)用要求。

正運動

  1.ZMC432CL-V2硬件功能

  (1)豐富的運動控制功能:支持直線、圓弧、空間圓弧、螺旋插補等。(2)硬件接口豐富:支持脈沖軸(帶編碼器反饋)和EtherCAT總線軸,具備24路輸入和12路輸出的通用IO,部分為高速IO,2路模擬量輸出(DA)。(3)EtherCAT刷新周期最快達250us,滿足高速通信需求。(4)支持4通道硬件比較輸出、硬件定時器、運動中精準輸出,適用于多通道視覺飛拍等場合。(5)支持掉電檢測、掉電存儲,多種程序加密方式,能夠有效防止系統(tǒng)故障,保護項目工程文件數(shù)據(jù),并提高系統(tǒng)的可靠性。(6)通過純國產(chǎn)IDE開發(fā)環(huán)境RTSys進行項目開發(fā),可實時仿真、在線跟蹤以及診斷與調(diào)試,簡便易用,支持多種高級上位機語言聯(lián)合編程進行二次開發(fā)。

正運動

  ZMC432CL-V2產(chǎn)品介紹視頻

  更多關(guān)于ZMC432CL-V2詳情介紹點擊→步進控制的光柵尺全閉環(huán)解決方案:32軸EtherCAT總線運動控制器ZMC432CL-V2。

  二、C#語言如何調(diào)用ZMotion的動態(tài)庫進行項目開發(fā)

  (一)新建WinForm項目并添加函數(shù)庫

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

正運動

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

正運動

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

  1)進入廠商提供的光盤資料找到“04PC函數(shù)”文件夾,并點擊進入。

正運動

  2)選擇“01 PC函數(shù)庫V2.1”文件夾。

正運動

  3)選擇“Windows平臺”文件夾。

正運動

  4)選擇“C#”文件夾,里面有32位和64位的動態(tài)庫和例程。

正運動

正運動

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

       1)將Zmcaux.cs文件復(fù)制到新建的項目里面中。

正運動

  2)將zaux.dll和zmotion.dll文件放入bin\debug文件夾中。

正運動

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

正運動

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

正運動

  三、PC函數(shù)介紹

  1.PC函數(shù)手冊可在光盤資料查看,具體路徑如下。

正運動

  2.控制器/卡接口之鏈接控制器,獲取鏈接句柄。

正運動

正運動

  3.萬能指令之在線命令。

  有一些使用頻率較低的Basic指令我們沒有封裝到上位機的輔助庫中,如果用戶上位機需要調(diào)用對應(yīng)的Basic指令的話,可以通過在線命令自行進行相關(guān)指令封裝。

正運動

正運動

  四、C#編寫例程調(diào)試ZMC432CL-V2的脈沖閉環(huán)功能

  1.通過在線命令封裝脈沖閉環(huán)功能對應(yīng)的上位機接口。

  (1)右擊【項目】→【添加】→【新建項】→【新建C#類】,這里新建了一個MyFullCloseLoop的C#類。

正運動

  (2)查詢Basic對應(yīng)指令的使用說明,封裝一個設(shè)置軸比例增益的上位機接口。

正運動

  /// /// 設(shè)置軸的比例增益/// /// 連接句柄/// 軸號/// 比例增益P的值/// 錯誤碼public int ZAux_Direct_SetPGain(IntPtr handle, int iaxis, float fValue){ String cmdbuff; //定義命令字符串 //判斷軸數(shù)是否超標 StringBuilder cmdbuffAck = new StringBuilder(1024); if (iaxis > MAX_AXIS_AUX) { return ERR_AUX_PARAERR; } //生成命令,根據(jù)Basic指令的用法格式去拼接命令字符串 cmdbuff = string.Format("P_Gain({0}) = {1}", iaxis, fValue); //調(diào)用命令執(zhí)行函數(shù) return zmcaux.ZAux_DirectCommand(handle, cmdbuff, cmdbuffAck, 2048); }

  (3)查詢Basic對應(yīng)指令的使用說明,封裝一個獲取軸比例增益的上位機接口。

  ·

  /// /// 獲取軸的比例增益/// /// 連接句柄/// 軸號/// 獲取的軸比例增益P的值/// 錯誤碼public int ZAux_Direct_GetPGain(IntPtr handle, int iaxis, ref float fValue){ String cmdbuff; //定義命令字符串 StringBuilder cmdbuffAck = new StringBuilder(1024); //定義接受返回的結(jié)果字符串 //判斷軸數(shù)是否超標 if (iaxis > MAX_AXIS_AUX) { return ERR_AUX_PARAERR; } //生成命令 ?類似于C的printf指令,用于打印,打印出來的字符串通過cmdbuffAck去接收 cmdbuff = string.Format("?P_Gain({0}) ", iaxis); //調(diào)用命令執(zhí)行函數(shù) int iresult = zmcaux.ZAux_Execute(handle, cmdbuff, cmdbuffAck, 2048); if (ERR_OK != iresult) { return iresult; } //解析返回的字符串 if (cmdbuffAck.Length == 0) { return ERR_NOACK; } else { fValue = float.Parse(cmdbuffAck.ToString()); } return ERR_OK;}

  (4)封裝好的脈沖閉環(huán)功能相關(guān)的上位機接口。

正運動

  2.C#閉環(huán)功能的測試例程的編寫。

      (1)脈沖閉環(huán)測試例程界面的設(shè)計。

正運動

  (2)【連接】按鈕如何連接控制器。

  int Err = 0; //接口返回的錯誤碼int LinkMode = 2; //FastOpen接口連接類型的介紹 1-COM 2-ETH 4-PCI 5-LOCALErr = zmcaux.ZAux_FastOpen(LinkMode, Buffer, 2000, out g_handle);if (Err == 0){ // 修改按鈕文字 LinkStatus.Text = "鏈接狀態(tài):OK"; // 修改按鈕背景色 LinkStatus.BackColor = Color.FromArgb(192, 255, 192); //相關(guān)參數(shù)初始化 AxisParaSet(); //進行PID參數(shù)的初始化 PidParaSet(); //打開定時器 Timer.Start();}else{ // 修改按鈕文字 LinkStatus.Text = "鏈接狀態(tài):Ng"; // 修改按鈕背景色 LinkStatus.BackColor = Color.FromArgb(255, 192, 192); //關(guān)閉定時器 Timer.Stop();}

  (3)【更新PID參數(shù)】按鈕如何打開和關(guān)閉脈沖閉環(huán)功能,如何更新PID參數(shù)。

  ·

  //將上位機設(shè)置的PID參數(shù)更新到控制器private int PidParaSet(){ float TempFloat = 0; float TempDpos = 0, TempMpos = 0; bool TempInt = false; MyFullClosedLoop CloseLoop = new MyFullClosedLoop(); String CompareStr = "閉環(huán)已開"; String TempStr = IsClosedLoop.Text; //打開全閉環(huán)去控制軸運動 if (TempStr == CompareStr) { //獲取軸位置,如果DPOS和MPOS相差太大不能打開脈沖閉環(huán),保證安全 zmcaux.ZAux_Direct_GetDpos(g_handle, int.Parse(AxisId.Text), ref TempDpos); zmcaux.ZAux_Direct_GetMpos(g_handle, int.Parse(AxisId.Text), ref TempMpos); if ((TempDpos - TempMpos) > 4 || (TempDpos - TempMpos < -4)) { Console.WriteLine("規(guī)劃位置和反饋位置相差太大,無法啟動閉環(huán)功能!!!!"); return -1; } //更新比例增益 CloseLoop.ZAux_Direct_SetPGain(g_handle, int.Parse(AxisId.Text), float.Parse(text_ParaP.Text)); //更新積分增益 CloseLoop.ZAux_Direct_SetIGain(g_handle, int.Parse(AxisId.Text), float.Parse(text_ParaI.Text)); //更新微分增益 CloseLoop.ZAux_Direct_SetDGain(g_handle, int.Parse(AxisId.Text), float.Parse(text_ParaD.Text)); //更新速度前饋增益 CloseLoop.ZAux_Direct_SetVffGain(g_handle, int.Parse(AxisId.Text), float.Parse(text_ParaVF.Text)); //更新加速度前饋增益 CloseLoop.ZAux_Direct_SetAffGain(g_handle, int.Parse(AxisId.Text), float.Parse(text_ParaAF.Text)); //更新速度增益 CloseLoop.ZAux_Direct_SetOvGain(g_handle, int.Parse(AxisId.Text), float.Parse(text_ParaOV.Text)); //注意:在打開servo之前打開encoder_servo后要完成一次atype由0變?yōu)?的切換,否則會報axis:0 config not support Servo. //1、先打開axis_enable 和 encoder_servo zmcaux.ZAux_Direct_SetAxisEnable(g_handle, int.Parse(AxisId.Text), 1); CloseLoop.ZAux_Direct_SetEncoderServo(g_handle, int.Parse(AxisId.Text), 1); Thread.Sleep(20); CloseLoop.ZAux_Direct_GetEncoderServo(g_handle, int.Parse(AxisId.Text), ref TempInt); if (TempInt) { //2、完成一次Atype由0變?yōu)?的切換 zmcaux.ZAux_Direct_SetAtype(g_handle, int.Parse(AxisId.Text), 0); Thread.Sleep(20); zmcaux.ZAux_Direct_SetAtype(g_handle, int.Parse(AxisId.Text), 4); //3、打開Servo CloseLoop.ZAux_Direct_SetServo(g_handle, int.Parse(AxisId.Text), 1); Thread.Sleep(10); CloseLoop.ZAux_Direct_GetServo(g_handle, int.Parse(AxisId.Text), ref TempInt); if (TempInt) { Console.WriteLine("閉環(huán)參數(shù)配置完成, 軸全閉環(huán)功能打開成功。"); } else { Console.WriteLine("軸閉環(huán)開關(guān)Servo打開失敗, 導(dǎo)致脈沖全閉環(huán)開啟失敗!!!"); return -1; } } else { Console.WriteLine("軸編碼器閉環(huán)EncoderServo打開失敗, 導(dǎo)致脈沖全閉環(huán)開啟失敗!!!"); return -1; }

  } else { //關(guān)閉全閉環(huán)的功能 //1、關(guān)閉EncoderServo CloseLoop.ZAux_Direct_SetEncoderServo(g_handle, int.Parse(AxisId.Text), 0); Thread.Sleep(20); CloseLoop.ZAux_Direct_GetEncoderServo(g_handle, int.Parse(AxisId.Text), ref TempInt); if (TempInt) { Console.WriteLine("軸EncoderServo關(guān)閉失敗!!!"); return -1; } //2、關(guān)閉EncoderServo后需要完成ATYPE的切換,保證完全關(guān)閉閉環(huán)功能 zmcaux.ZAux_Direct_SetAtype(g_handle, int.Parse(AxisId.Text), 0); Thread.Sleep(10); zmcaux.ZAux_Direct_SetAtype(g_handle, int.Parse(AxisId.Text), 4); //3、關(guān)閉Servo CloseLoop.ZAux_Direct_SetServo(g_handle, int.Parse(AxisId.Text), 0); Thread.Sleep(20); CloseLoop.ZAux_Direct_GetServo(g_handle, int.Parse(AxisId.Text), ref TempInt); if (TempInt) { Console.WriteLine("軸Servo關(guān)閉失敗!!!"); return -1; } } return 0;}

  (4)【更新軸參數(shù)】按鈕如何完成軸參數(shù)的更新。

  ·

  //更新軸參數(shù)private void AxisParaSet(){ //設(shè)置最大隨動誤差FE_LIMIT zmcaux.ZAux_Direct_SetFeLimit(g_handle, int.Parse(AxisId.Text), 500); //更新編碼器齒輪比 (如果發(fā)N個脈沖,實際編碼器反饋M個脈沖,編碼器齒輪比要設(shè)置成 N/M) zmcaux.ZAux_Direct_EncoderRatio(g_handle, int.Parse(AxisId.Text), int.Parse(EncoderRatioMol.Text), int.Parse(EncoderRatioDenom.Text)); //更新脈沖當(dāng)量,一般脈沖當(dāng)量設(shè)置成機臺運動1mm需要的脈沖數(shù) zmcaux.ZAux_Direct_SetUnits(g_handle, int.Parse(AxisId.Text), float.Parse(text_ParaUnits.Text)); //全閉環(huán)的功能需要把ATYPE設(shè)置成4 zmcaux.ZAux_Direct_SetAtype(g_handle, int.Parse(AxisId.Text), 4); //更新速度 zmcaux.ZAux_Direct_SetSpeed(g_handle, int.Parse(AxisId.Text), float.Parse(text_ParaSpeed.Text)); //更新加速度、減速度 zmcaux.ZAux_Direct_SetAccel(g_handle, int.Parse(AxisId.Text), float.Parse(text_ParaAccel.Text)); zmcaux.ZAux_Direct_SetDecel(g_handle, int.Parse(AxisId.Text), float.Parse(text_ParaDecel.Text)); StringBuilder Buff = new StringBuilder(512); //是否啟用SS曲線 if (CurveIsSS.Checked) { //啟用SS曲線,VP_MODE模式設(shè)置成7即可 //上位機舊庫沒有現(xiàn)成設(shè)置VP_MODE的接口,直接在線命令去封裝,在線命令是萬能接口 string CmdBuff = string.Format("VP_MODE({0}) = 7 ", int.Parse(AxisId.Text)); zmcaux.ZAux_DirectCommand(g_handle, CmdBuff, Buff, 512); } else { //啟用S曲線,VP_MODE模式設(shè)置成0即可 //上位機舊庫沒有現(xiàn)成設(shè)置VP_MODE的接口,直接在線命令去封裝,在線命令是萬能接口 string CmdBuff = string.Format("VP_MODE({0}) = 0 ", int.Parse(AxisId.Text)); zmcaux.ZAux_DirectCommand(g_handle, CmdBuff, Buff, 512); //S曲線模式,S曲線時間sramp是有效果的,需要設(shè)置一下 zmcaux.ZAux_Direct_SetSramp(g_handle, int.Parse(AxisId.Text), float.Parse(text_ParaSramp.Text)); }}

  (5)【手動】按鈕如何控制脈沖軸的點動與寸動。

  ·

  //X-鼠標按下private void ButtonHangRev_MouseDown(object sender, MouseEventArgs e){ if (IsInchMode.Checked) { //寸動運動 zmcaux.ZAux_Direct_Single_Move(g_handle, int.Parse(AxisId.Text), -1 * float.Parse(InchDis.Text)); } else { //手動運動 zmcaux.ZAux_Direct_Single_Vmove(g_handle, int.Parse(AxisId.Text), -1); }}//X-鼠標松開private void ButtonHangRev_MouseUp(object sender, MouseEventArgs e){ if (IsInchMode.Checked == false) { //手動運動停止 zmcaux.ZAux_Direct_Single_Cancel(g_handle, int.Parse(AxisId.Text), 2); }}//X+鼠標按下private void ButtonHangFwd_MouseDown(object sender, MouseEventArgs e){ if (IsInchMode.Checked) { //寸動運動 zmcaux.ZAux_Direct_Single_Move(g_handle, int.Parse(AxisId.Text), 1 * float.Parse(InchDis.Text)); } else { //手動運動 zmcaux.ZAux_Direct_Single_Vmove(g_handle, int.Parse(AxisId.Text), 1); }}//X+鼠標松開private void ButtonHangFwd_MouseUp(object sender, MouseEventArgs e){ if (IsInchMode.Checked == false) { //手動運動停止 zmcaux.ZAux_Direct_Single_Cancel(g_handle, int.Parse(AxisId.Text), 2); }}

  五、通過RTSys的示波器對比開環(huán)控制和全閉環(huán)控制的情況

  示波器的使用可以參考正運動小助手的歷史推文《運動控制看的更清楚細致!RTSys示波器功能簡介 (qq.com)》。

  1.開環(huán)控制情況分析

正運動

正運動

  測試發(fā)現(xiàn):步進驅(qū)動器的開環(huán)控制,運動過程中隨動誤差(規(guī)劃位置和光柵尺反饋位置的差值)一直維持在0.02個用戶單位左右(這里一個用戶單位即一個UNITS設(shè)置的是1mm),當(dāng)運動結(jié)束時光柵尺的反饋位置和指令規(guī)劃位置也不相等,大概差了0.0015個用戶單位,折算為脈沖數(shù)是0.0015*用戶單位=3個脈沖。

  2.閉環(huán)控制情況分析

正運動

正運動

  測試發(fā)現(xiàn):步進驅(qū)動器的閉環(huán)控制,運動過程中隨動誤差(規(guī)劃位置和光柵尺反饋位置的差值)除了啟動和停止以外大部分保持在0個脈沖當(dāng)量左右,相比較開環(huán)控制有較大的提升,當(dāng)運動結(jié)束時光柵尺的反饋位置和指令規(guī)劃位置也是相等的。

  六、總結(jié)

  1.啟用控制器閉環(huán)的時候注意要在打開encoder_servo后,打開servo之前要完成一次ATYPE從0到4的切換,這樣才可以正常打開控制器閉環(huán)的功能。

       2.啟用控制器閉環(huán)同時還需要打開單軸使能axis_enable,這樣才能保證控制器閉環(huán)的正常啟用。

正運動

  3.為保證控制器閉環(huán)功能的完全關(guān)閉,在關(guān)閉ENCODER_SERVO后需要完成一次 ATYPE從0到4的切換,這樣才能保證控制器閉環(huán)功能完全關(guān)閉。

正運動

完整代碼獲取地址

正運動

  本次,正運動技術(shù)步進的光柵尺全閉環(huán)EtherCAT運動控制器ZMC432CL-V2(三):C#編程調(diào)試,就分享到這里。

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

  本文由正運動技術(shù)原創(chuàng),歡迎大家轉(zhuǎn)載,共同學(xué)習(xí),一起提高中國智能制造水平。文章版權(quán)歸正運動技術(shù)所有,如有轉(zhuǎn)載請注明文章來源。

標簽: 正運動

點贊

分享到:

上一篇:如何擴大制造業(yè)的可持續(xù)性

下一篇:創(chuàng)新附件:用于肘節(jié)夾的傳感支架

中國傳動網(wǎng)版權(quán)與免責(zé)聲明:凡本網(wǎng)注明[來源:中國傳動網(wǎng)]的所有文字、圖片、音視和視頻文件,版權(quán)均為中國傳動網(wǎng)(www.wangxinlc.cn)獨家所有。如需轉(zhuǎn)載請與0755-82949061聯(lián)系。任何媒體、網(wǎng)站或個人轉(zhuǎn)載使用時須注明來源“中國傳動網(wǎng)”,違反者本網(wǎng)將追究其法律責(zé)任。

本網(wǎng)轉(zhuǎn)載并注明其他來源的稿件,均來自互聯(lián)網(wǎng)或業(yè)內(nèi)投稿人士,版權(quán)屬于原版權(quán)人。轉(zhuǎn)載請保留稿件來源及作者,禁止擅自篡改,違者自負版權(quán)法律責(zé)任。

網(wǎng)站簡介|會員服務(wù)|聯(lián)系方式|幫助信息|版權(quán)信息|網(wǎng)站地圖|友情鏈接|法律支持|意見反饋|sitemap

傳動網(wǎng)-工業(yè)自動化與智能制造的全媒體“互聯(lián)網(wǎng)+”創(chuàng)新服務(wù)平臺

網(wǎng)站客服服務(wù)咨詢采購咨詢媒體合作

Chuandong.com Copyright ?2005 - 2025 ,All Rights Reserved 深圳市奧美大唐廣告有限公司 版權(quán)所有
粵ICP備 14004826號 | 營業(yè)執(zhí)照證書 | 不良信息舉報中心 | 粵公網(wǎng)安備 44030402000946號