技術(shù)頻道

娓娓工業(yè)
您現(xiàn)在的位置: 中國傳動網(wǎng) > 技術(shù)頻道 > 技術(shù)百科 > C#之Delta并聯(lián)機械手正逆解的建立和手動運動

C#之Delta并聯(lián)機械手正逆解的建立和手動運動

時間:2024-06-25 10:35:44來源:深圳市正運動技術(shù)有限公司

導(dǎo)語:?ZMC406R-V2是正運動推出的一款多軸高性能EtherCAT總線運動控制器,具有EtherCAT、EtherNET、RS232、CAN和U盤等通訊接口,ZMC系列運動控制器可應(yīng)用于各種需要脫機或聯(lián)機運行的場合。

  ZMC406R-V2硬件介紹

  ZMC406R-V2是正運動推出的一款多軸高性能EtherCAT總線運動控制器,具有EtherCAT、EtherNET、RS232、CAN和U盤等通訊接口,ZMC系列運動控制器可應(yīng)用于各種需要脫機或聯(lián)機運行的場合。

正運動

  ZMC406R-V2支持6軸運動控制,最多可擴展至32軸,支持直線插補、任意圓弧插補、空間圓弧、螺旋插補、電子凸輪、電子齒輪、同步跟隨等功能。

  ZMC406R-V2可以采用脫機的方式將編輯好的程序下載到控制器上,可利用觸摸屏示教的方式編輯想要運動的軌跡。也可以用PC API函數(shù)調(diào)用方式或者實時發(fā)送指令操作,在PC上位機C#,C++,Labview,Python等語言來開發(fā)Delta并聯(lián)機械手的應(yīng)用。

正運動

  ZMC406R-V2支持6軸運動控制,可采用脈沖軸(帶編碼器反饋)或EtherCAT總線軸,通用IO包含24路輸入口和12路輸出口,模擬量AD/DA各兩路,EtherCAT最快125us的刷新周期。

  硬件接線參考

  1.通用輸入口接線參考圖

正運動

  2.通用輸出口接線參考圖

正運動

  C#語言進行Delta并聯(lián)機械手的開發(fā)

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

正運動

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

正運動

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

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

正運動

  2)選擇“函數(shù)庫2.1”文件夾。

正運動

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

正運動

  4)根據(jù)需要選擇對應(yīng)的函數(shù)庫,這里選擇32位庫。

正運動

  5)解壓C#壓縮包,里面有C#對應(yīng)的函數(shù)庫。

正運動

  6)函數(shù)庫具體路徑如下。

正運動

  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.機械手模型正解的建立。

正運動

正運動

正運動

  4.機械手模型逆解的建立。

正運動

正運動

正運動

正運動

  5.機械手坐標系旋轉(zhuǎn),用于得到用戶坐標系。

正運動

正運動

  1.軸方向要求

  使用正運動Delta并聯(lián)機械手模型,需要保證3個關(guān)節(jié)軸向下旋轉(zhuǎn)時為正向,末端旋轉(zhuǎn)軸逆時針旋轉(zhuǎn)為正(俯視)。

正運動

  2.結(jié)構(gòu)參數(shù)(結(jié)構(gòu)參數(shù)由機械手本體廠家提供)機械手的結(jié)構(gòu)參數(shù)需要先寫進控制器的TABLE寄存器后,才可以調(diào)接口建立機械手的正逆解。

正運動

正運動

  3.原點定義A、各關(guān)節(jié)軸的連桿L1都處于水平位置時,認為是關(guān)節(jié)零點位置。(一般本體會提供定位銷,沒有提供的可以通過水平儀確保零點時L1處于水平位置)B、此時軸0和軸1連線方向為直角坐標系X方向,直角坐標系零點位于連桿L1水平面的中心。

正運動

  4.關(guān)節(jié)軸與虛擬軸關(guān)節(jié)軸是實際存在的電機軸,Delta有關(guān)節(jié)軸0電機、關(guān)節(jié)軸1電機、關(guān)節(jié)軸2電機和末端旋轉(zhuǎn)軸電機,這些關(guān)機軸脈沖當(dāng)量的設(shè)置都需要設(shè)置成對應(yīng)關(guān)節(jié)軸轉(zhuǎn)1度需要的脈沖數(shù),如:(Units = 電機一圈脈沖數(shù) * 減速比 / 360)。虛擬軸是虛擬出來的直角坐標系的X軸、Y軸、Z軸和一個旋轉(zhuǎn)軸RZ,其中X、Y、Z軸的脈沖當(dāng)量推薦設(shè)置成1000,旋轉(zhuǎn)軸RZ的脈沖當(dāng)量設(shè)置成旋轉(zhuǎn)軸轉(zhuǎn)1度需要的脈沖數(shù)。

  相關(guān)例程演示

  1.鏈接控制器獲取句柄,上位機操作通過獲取到的句柄來操作控制器。

  ·

  //連接控制器,控制器默認IP是192.168.0.11ZauxErr = zmcaux.ZAux_OpenEth("192.168.0.11", out g_Handle);if (0 != ZauxErr){AlmInifFile.Write(DateTime.Now.ToString("F"), "ZAux_OpenEth執(zhí)行錯誤,錯誤碼:" + ZauxErr.ToString(), "錯誤碼信息");}

  2.Delta并聯(lián)機械手參數(shù)設(shè)置。

正運動

正運動

正運動

  3.機械手正逆解的建立。

  ·

  /************************************************************************************'任務(wù)編號:無'函數(shù)功能:機械手的正逆解的建立 'Input:Mode=0斷開機械手;1建立機械手的逆解;2建立機械手的正解'Output:無 '返回值:0:表示機械手建立成功; -1:表示機械手建立失敗'備注:1、控制器型號帶R后綴的才支持該機械手模型' 2、正解狀態(tài)時,虛擬軸的MTYPE=34' 3、逆解狀態(tài)時,關(guān)節(jié)軸的MTYPE=33' 4、機械手處于逆解狀態(tài)時不要斷使能,不然操作不當(dāng)容易飛車。**************************************************************************************/public int ScaraEstab(int Mode){ //更新Ui界面的Delta參數(shù) ScaraParaWindows.DeltaParaSave(); //設(shè)置機械參數(shù)到控制器 SetControPara(); //保存Delta參數(shù)到Ini文件 WriteIniFile(); //清除控制器報警 ZauxErr = zmcaux.ZAux_Direct_Single_Datum(g_Handle, 0, 0); //更新軸列表 建立正逆解的軸順序是 J1、J2、Ju、Jz(關(guān)節(jié)軸) Vx、Vy、Vr、Vz(虛擬軸) int[] mJScaraAxisList = new int[4]; //關(guān)節(jié)軸列表 int[] mVScaraAxisList = new int[4]; //虛擬軸列表 for (int i = 0; i < 4; i++) { mJScaraAxisList[i] = gDeltaAxisList[i]; mVScaraAxisList[i] = gVAxisList[i]; } //判讀機械手參數(shù)是否設(shè)置正確 if ((DeltaR <= 0) || (Deltar <= 0) || (DeltaL1 <= 0) || (DeltaL2 <= 0)) { MessageBox.Show("Delta機械手參數(shù)有問題請確認!"); return -1; } //機械手的結(jié)構(gòu)參數(shù)要先寫進控制器的TABLE寄存器后,才可以調(diào)接口建立機械手的正逆解 //更新機械手參數(shù)到控制器的TABLE寄存器 float[] ScaraParaList = new float[11] { DeltaR, Deltar, DeltaL1, DeltaL2, gMotorPulNum[0] * gReducRatio[0], gMotorPulNum[1] * gReducRatio[1], gMotorPulNum[2] * gReducRatio[2], 0, 0, 0, gMotorPulNum[3] * gReducRatio[3] }; ZauxErr = zmcaux.ZAux_Direct_SetTable(g_Handle, TableStaraId, 11, ScaraParaList); if (0 != ZauxErr) { return -1; } if ((1 == Mode) && (0 == ZauxErr)) //建立機械手的逆解(機械手參數(shù)更新成功的情況下) { //建立Scara逆解 ZauxErr = zmcaux.ZAux_Direct_Connframe(g_Handle, 4, mJScaraAxisList, 14, TableStaraId, 4, mVScaraAxisList); if (0 != ZauxErr) { ProceWindows.WriteLog("切換為逆解模式失敗"); return -1; } ProceWindows.WriteLog("切換為逆解模式"); } else if ((2 == Mode) && (0 == ZauxErr)) //建立機械手的正解(機械手參數(shù)更新成功的情況下) { //建立Scara正解 ZauxErr = zmcaux.ZAux_Direct_Connreframe(g_Handle, 4, mVScaraAxisList, 14, TableStaraId, 4, mJScaraAxisList); if (0 != ZauxErr) { ProceWindows.WriteLog("切換為正解模式失敗"); return -1; } ProceWindows.WriteLog("切換為正解模式"); } } return 0;}

正運動

正運動

  4.手動運動界面

       下圖是例程手動運動的界面?!瓣P(guān)節(jié)坐標系手動控制”的手動按鈕是進行關(guān)節(jié)軸的手動運動的按下時會自動建立機械手的正解?!爸苯亲鴺讼凳謩涌刂啤钡氖謩影粹o是進行虛擬軸XYZ的手動運動的按下時會自動建立機械手的逆解。當(dāng)手動速度降低到一定值時會自動切換到寸動模式。

正運動

正運動

  5.關(guān)節(jié)軸手動運動  /************************************************************************************'任務(wù)編號: 無'函數(shù)功能: 關(guān)節(jié)軸負向手動運動,負向點動按鈕按下時調(diào)用'Input: 無'Output: 無 '返回值: 無'備注: 無 **************************************************************************************/private void JHandDirRev0_MouseDown(object sender, MouseEventArgs e){ //判斷是否上鎖,上鎖才可以運動 int EnableState = 0; cszmcaux.zmcaux.ZAux_Direct_GetAxisEnable(MainWindows.g_Handle, MainWindows.gDeltaAxisList[0], ref EnableState); //如果使能上了 if ((1 == EnableState) || (MainWindows.IsDebug)) { int Vmtype = 0;//虛擬軸MTYPE cszmcaux.zmcaux.ZAux_Direct_GetMtype(MainWindows.g_Handle, MainWindows.gVAxisList[0], ref Vmtype); //如果不是正解狀態(tài) if (Vmtype != 34) { //建立機械手的正解 if (0 != MainWindows.ScaraEstab(2)) { //機械手沒有成功建立 return; } } //哪個按鈕按下 int Id = 0; for (int i = 0; i < 4; i++) { if (((Button)sender).Name == ("JHandDirRev" + i)) { Id = i; } } int TempAxis = 0; TempAxis = MainWindows.gDeltaAxisList[Id]; //手動速度小于5是寸動模式 if (5 <= MainWindows.HnadSpeedPerc) { //設(shè)置點動速度 cszmcaux.zmcaux.ZAux_Direct_SetSpeed(MainWindows.g_Handle, TempAxis, MainWindows.HnadSpeedPerc * MainWindows.gAxisHandSpeed[Id] / 100); //發(fā)送負向運動指令 cszmcaux.zmcaux.ZAux_Direct_Single_Vmove(MainWindows.g_Handle, TempAxis, -1); } else { //設(shè)置寸動速度 cszmcaux.zmcaux.ZAux_Direct_SetSpeed(MainWindows.g_Handle, TempAxis, MainWindows.gAxisHandSpeed[Id] / 10); //發(fā)送寸動運動指令 cszmcaux.zmcaux.ZAux_Direct_Single_Move(MainWindows.g_Handle, TempAxis, -1 * MainWindows.HnadSpeedPerc); } }}/************************************************************************************'任務(wù)編號: 無'函數(shù)功能: 關(guān)節(jié)軸正向手動運動,正向點動按鈕按下時調(diào)用'Input: 無'Output: 無 '返回值: 無'備注: 無 **************************************************************************************/private void JHandDirFwd0_MouseDown(object sender, MouseEventArgs e){ //判斷是否上鎖,上鎖才可以運動 int EnableState = 0; cszmcaux.zmcaux.ZAux_Direct_GetAxisEnable(MainWindows.g_Handle, MainWindows.gDeltaAxisList[0], ref EnableState); //如果使能上了 if ((1 == EnableState) || (MainWindows.IsDebug)) { int Vmtype = 0;//虛擬軸MTYPE cszmcaux.zmcaux.ZAux_Direct_GetMtype(MainWindows.g_Handle, MainWindows.gVAxisList[0], ref Vmtype); //如果不是正解狀態(tài) if (Vmtype != 34) { //建立機械手的正解 if (0 != MainWindows.ScaraEstab(2)) { //機械手沒有成功建立 return; } } //哪個按鈕按下 int Id = 0; for (int i = 0; i < 4; i++) { if (((Button)sender).Name == ("JHandDirFwd" + i)) { Id = i; } } int TempAxis = 0; TempAxis = MainWindows.gDeltaAxisList[Id]; //手動速度小于5是寸動模式 if (5 <= MainWindows.HnadSpeedPerc) { //設(shè)置點動速度 cszmcaux.zmcaux.ZAux_Direct_SetSpeed(MainWindows.g_Handle, TempAxis, MainWindows.HnadSpeedPerc * MainWindows.gAxisHandSpeed[Id] / 100); //發(fā)送正向運動指令 cszmcaux.zmcaux.ZAux_Direct_Single_Vmove(MainWindows.g_Handle, TempAxis, 1); } else { //設(shè)置寸動速度 cszmcaux.zmcaux.ZAux_Direct_SetSpeed(MainWindows.g_Handle, TempAxis, MainWindows.gAxisHandSpeed[Id] / 10); //發(fā)送寸動運動指令 cszmcaux.zmcaux.ZAux_Direct_Single_Move(MainWindows.g_Handle, TempAxis, 1 * MainWindows.HnadSpeedPerc); } }}/************************************************************************************'任務(wù)編號: 無'函數(shù)功能: 關(guān)節(jié)軸停止手動運動,點動按鈕松開時調(diào)用。'Input: 無'Output: 無 '返回值: 無'備注: 無 **************************************************************************************/private void JHandDirRev0_MouseUp(object sender, MouseEventArgs e){ //哪個按鈕按下 int Id = 0; for (int i = 0; i < 4; i++) { if (((Button)sender).Name == ("JHandDirRev" + i)) { Id = i; } } int TempAxis = 0; TempAxis = MainWindows.gDeltaAxisList[Id]; //手動速度小于5是寸動模式 if (5 <= MainWindows.HnadSpeedPerc) { MainWindows.ZauxErr = cszmcaux.zmcaux.ZAux_Direct_Single_Cancel(MainWindows.g_Handle, TempAxis, 2); }}

  關(guān)節(jié)軸手動運動演示

  6.虛擬軸手動運動

  ·

  /************************************************************************************'任務(wù)編號:無'函數(shù)功能:虛擬軸負向手動運動,負向點動按鈕按下時調(diào)用'Input:無'Output:無 '返回值:無'備注:無 **************************************************************************************/private void VHandDirRev0_MouseDown(object sender, MouseEventArgs e){ //判斷是否上鎖,上鎖才可以運動 int EnableState = 0; cszmcaux.zmcaux.ZAux_Direct_GetAxisEnable(MainWindows.g_Handle, MainWindows.gDeltaAxisList[0], ref EnableState); //如果使能上了 if ((1 == EnableState) || (MainWindows.IsDebug)) { int Jmtype = 0;//關(guān)節(jié)軸Mtype cszmcaux.zmcaux.ZAux_Direct_GetMtype(MainWindows.g_Handle, gDeltaAxisList[0], ref Jmtype); //如果不是逆解狀態(tài) if (Jmtype != 33) { //建立機械手的逆解 if (0 != MainWindows.ScaraEstab(1)) { //機械手沒有成功建立 return; } } //哪個按鈕按下 int Id = 0; for (int i = 0; i < 5; i++) { if (((Button)sender).Name == ("VHandDirRev" + i)) { Id = i; } } int TempAxis = 0; //更新當(dāng)前機械手狀態(tài) TempAxis = MainWindows.gVAxisList[Id]; //手動速度小于5是寸動模式 if (5 <= MainWindows.HnadSpeedPerc) { //設(shè)置點動速度 cszmcaux.zmcaux.ZAux_Direct_SetSpeed(MainWindows.g_Handle, TempAxis, MainWindows.HnadSpeedPerc * MainWindows.gAxisHandSpeed[Id] / 100); //發(fā)送負向運動指令 cszmcaux.zmcaux.ZAux_Direct_Single_Vmove(MainWindows.g_Handle, TempAxis, -1); } else { //設(shè)置寸動速度 cszmcaux.zmcaux.ZAux_Direct_SetSpeed(MainWindows.g_Handle, TempAxis, MainWindows.gAxisHandSpeed[Id] / 10); //發(fā)送寸動運動指令 cszmcaux.zmcaux.ZAux_Direct_Single_Move(MainWindows.g_Handle, TempAxis, -1 * MainWindows.HnadSpeedPerc); } }}/************************************************************************************'任務(wù)編號:無'函數(shù)功能:虛擬軸負向手動運動,負向點動按鈕按下時調(diào)用'Input:無'Output:無 '返回值:無'備注:無 **************************************************************************************/private void VHandDirFwd0_MouseDown(object sender, MouseEventArgs e){ //判斷是否上鎖,上鎖才可以運動 int EnableState = 0; cszmcaux.zmcaux.ZAux_Direct_GetAxisEnable(MainWindows.g_Handle, MainWindows.gDeltaAxisList[0], ref EnableState); //如果使能上了 if ((1 == EnableState) || (MainWindows.IsDebug)) { int Jmtype = 0;//關(guān)節(jié)軸Mtype cszmcaux.zmcaux.ZAux_Direct_GetMtype(MainWindows.g_Handle, gDeltaAxisList[0], ref Jmtype); //如果不是逆解狀態(tài) if (Jmtype != 33) { //建立機械手的逆解 if (0 != MainWindows.ScaraEstab(1)) { //機械手沒有成功建立 return; } } //哪個按鈕按下 int Id = 0; for (int i = 0; i < 5; i++) { if (((Button)sender).Name == ("VHandDirFwd" + i)) { Id = i; } } int TempAxis = 0; //更新當(dāng)前機械手狀態(tài) TempAxis = MainWindows.gVAxisList[Id]; //手動速度小于5是寸動模式 if (5 <= MainWindows.HnadSpeedPerc) { //設(shè)置點動速度 cszmcaux.zmcaux.ZAux_Direct_SetSpeed(MainWindows.g_Handle, TempAxis, MainWindows.HnadSpeedPerc * MainWindows.gAxisHandSpeed[Id] / 100); //發(fā)送正向運動指令 cszmcaux.zmcaux.ZAux_Direct_Single_Vmove(MainWindows.g_Handle, TempAxis, 1); } else { //設(shè)置寸動速度 cszmcaux.zmcaux.ZAux_Direct_SetSpeed(MainWindows.g_Handle, TempAxis, MainWindows.gAxisHandSpeed[Id] / 10); //發(fā)送寸動運動指令 cszmcaux.zmcaux.ZAux_Direct_Single_Move(MainWindows.g_Handle, TempAxis, 1 * MainWindows.HnadSpeedPerc); } }}/************************************************************************************'任務(wù)編號:無'函數(shù)功能:虛擬軸停止軸運動,點動按鈕松開時調(diào)用'Input:無'Output:無 '返回值:無'備注:無 **************************************************************************************///停止運動private void VHandDirRev0_MouseUp(object sender, MouseEventArgs e){ //哪個按鈕按下 int Id = 0; for (int i = 0; i < 5; i++) { if (((Button)sender).Name == ("VHandDirRev" + i)) { Id = i; } } int TempAxis = 0; TempAxis = MainWindows.gVAxisList[Id]; //手動速度小于5是寸動模式 if (5 <= MainWindows.HnadSpeedPerc) { cszmcaux.zmcaux.ZAux_Direct_Single_Cancel(MainWindows.g_Handle, TempAxis, 2); }}

  虛擬軸手動運動演示

  7.機械手仿真工具的使用打開【ZRobotView】軟件,點擊【連接】輸入控制器的IP(默認IP:192.168.0.11),點擊連接,待連接成功后點擊切換即可3D仿真機械手的運動情況。

正運動

正運動

  本次,正運動技術(shù)C#之Delta并聯(lián)機械手正逆解的建立和手動運動,就分享到這里。

  更多精彩內(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)載請注明文章來源。

標簽: 運動控制正運動

點贊

分享到:

上一篇: 變頻器的參數(shù)設(shè)定步驟解析

下一篇:伺服電機轉(zhuǎn)速不穩(wěn)定的因素

中國傳動網(wǎng)版權(quán)與免責(zé)聲明:凡本網(wǎng)注明[來源:中國傳動網(wǎng)]的所有文字、圖片、音視和視頻文件,版權(quán)均為中國傳動網(wǎng)(www.treenowplaneincome.com)獨家所有。如需轉(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 - 2024 ,All Rights Reserved 版權(quán)所有 粵ICP備 14004826號 | 營業(yè)執(zhí)照證書 | 不良信息舉報中心 | 粵公網(wǎng)安備 44030402000946號