技術頻道

娓娓工業(yè)
您現(xiàn)在的位置: 中國傳動網(wǎng) > 技術頻道 > 技術百科 > PCIe EtherCAT實時運動控制卡的DXF圖形的CAD導圖與多條運動指令的快速加工

PCIe EtherCAT實時運動控制卡的DXF圖形的CAD導圖與多條運動指令的快速加工

時間:2024-06-06 14:57:52來源:深圳市正運動技術有限公司

導語:?今天,正運動小助手給大家分享一下C#語言如何進行CAD導圖、RTBasic程序的多任務開發(fā)。在正式學習之前,我們先了解一下正運動技術的運動控制卡PCIE464。

  今天,正運動小助手給大家分享一下C#語言如何進行CAD導圖、RTBasic程序的多任務開發(fā)。在正式學習之前,我們先了解一下正運動技術的運動控制卡PCIE464。

  硬件介紹

  PCIE464運動控制卡是正運動推出的一款EtherCAT總線+脈沖型、PCIE接口式的運動控制卡,可選6-64軸運動控制,支持多路高速數(shù)字輸入輸出,可輕松實現(xiàn)多軸同步控制和高速數(shù)據(jù)傳輸。

運動控制

  PCIE464運動控制卡適合于多軸點位運動、插補運動、軌跡規(guī)劃、手輪控制、編碼器位置檢測、IO控制、位置鎖存等功能的應用。PCIE464運動控制卡適用于3C電子加工、檢測設備、半導體設備、SMT加工、激光加工、光通訊設備、鋰電及光伏設備、以及非標自動化設備等高速高精應用場合。

運動控制

  PCIE4系列控制卡的應用程序可以使用VC,VB,VS,C++,C#等軟件開發(fā),程序運行時需要動態(tài)庫zmotion.dll,調試時可以將RTSys軟件同時連接控制器,從而方便調試、方便觀察。

運動控制

  PCIE464產品介紹

  接線參考

  1、IN數(shù)字量輸入接口數(shù)字輸入分布在J400(IN0-IN7)和X400(IN8-IN39)信號接口中。

運動控制

運動控制

  2、OUT數(shù)字量輸出接口數(shù)字輸出分布在 J400(OUT0-7)和 X400(OUT8-OUT39)信號接口中。

運動控制

運動控制

  C#語言進行項目開發(fā)

  1、在VS2010菜單“文件”→“新建”→“項目”,啟動創(chuàng)建項目向導。

運動控制

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

運動控制

  3、找到廠家提供的運動庫、CAD導圖庫(32位庫為例)。

運動控制

運動控制

  4、將廠商提供的C#的庫文件以及相關文件復制到新建的項目中,以及將廠商提供的C#的相關庫文件放入bin\debug文件夾中。

運動控制

運動控制

  5、用vs打開新建的項目文件,在右邊的解決方案資源管理器中點擊顯示所有文件,然后鼠標右擊zmcaux.cs文件,點擊包括在項目中,根據(jù)添加zmcaux.cs文件的步驟,將zmclaser.cs和zmotioncad.cs文件添加進工程中。

運動控制

運動控制

  6、雙擊Form1.cs里面的Form1,出現(xiàn)代碼編輯界面,在文件開頭寫入using cszmcaux,using ZmotionCadDll,并聲明控制器句柄g_cardhandle和使用CAD中使用到的cad庫函數(shù)的句柄g_cadhandle。

運動控制

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

  C#語言進行CAD導圖

  在實際的運用場景中,如果一張圖紙靠人為去計算圖形運動軌跡的坐標,結果既費時又費力。所以,在此情景下,如果我們讓計算機去計算圖形的運動軌跡,則會事半功倍,接下來我們介紹如何使用C#進行CAD導圖。

  1、操作步驟

  首先,新建WinForm項目并添加函數(shù)庫,接著用ZMotionCadArray_ImportVectGraph指令去導入打開CAD圖形文件,并進行小線段的拆分精度。再用ZMotionCadArray_GetVectNum指令去獲取數(shù)組長度,接著創(chuàng)建一個struct_zcad_array結構體類型(該結構體在ZMotionCad庫中已經(jīng)有聲明,直接定義調用即可),用來保存運動數(shù)據(jù)、運動類型等信息。創(chuàng)建好該結構體數(shù)組以后,再用ZMotionCadArray_GetVectArray指令將圖形的運動數(shù)據(jù)保存到該數(shù)組里面。

       最后,用ZMotionCadArray_MergeSeg指令去將各個點連接成線。操作思路,如圖所示。

運動控制

  2、指令介紹

運動控制

  3、生成運動軌跡數(shù)據(jù)

  將.dxf文件導入進去后,使用ZMotionCadArray_ImportVectGraph指令將CAD圖紙導入,并對小線段進行拆分。

  用ZMotionCadArray_GetVectNum獲取數(shù)據(jù)長度,獲取到數(shù)據(jù)長度后,創(chuàng)建一個Struct_ZCad_Array類型的數(shù)組。

  這時,其CAD圖紙的數(shù)據(jù)就保存在這結構體數(shù)組中,獲取圖形數(shù)據(jù)用ZMotionCadArray_GetVectArray指令。

  創(chuàng)建一個StringBuilder類型的數(shù)組,用循環(huán)去訪問Struct_ZCad_Array類型數(shù)組的運動類型,并把其運動坐標尾插到該數(shù)組里面。

  最后,用文件IO的知識創(chuàng)建一個bas文件,并將StringBuilder類型數(shù)組的運動數(shù)據(jù)尾插到該bas文件中。

運動控制

  1、導入圖形文件,通過線程去獲取CAD圖紙的點位信息,并用畫筆將點位信息顯示在畫板上。

運動控制

  獲取圖紙點位信息的相關代碼:

  //打開配置文件if (openFileDialog1.ShowDialog() == DialogResult.OK) { strFilePath = openFileDialog1.FileName; label11.Text = Path.GetFileName(strFilePath); textBox3.Text= textBox3.Text+"\r\n"+"導入文件:"+ Path.GetFileName(strFilePath); //導入CAD圖形文件 m_refDistance圓弧轉小線段拆分精度 int iret = ZmotionCad.ZMotionCadArray_ImportVectGraph(strFilePath, 1024, 1, m_refDistance); //導入數(shù)據(jù), 獲取數(shù)組長度 iret = ZmotionCad.ZMotionCadArray_GetVectNum(ref ZCad_ArrayLen); //創(chuàng)建一個結構體變量 ZCad_ArrayInfo = new ZmotionCad.Struct_ZCad_Array[ZCad_ArrayLen]; //獲取圖形數(shù)據(jù) 將cad文件的數(shù)據(jù)放在ZCad_ArrayInfo數(shù)組里 iret = ZmotionCad.ZMotionCadArray_GetVectArray(ref ZCad_ArrayInfo[0], ZCad_ArrayLen); //是否只處理封閉軌跡 iret = ZmotionCad.ZMotionCadArray_IfCloseVect(false); //合并相連線 iret = ZmotionCad.ZMotionCadArray_MergeSeg(0.5, If_Choose); //為了判斷是否只處理封閉軌跡,又重新獲取數(shù)組的長度和獲取圖形數(shù)據(jù) Get_Array(); //在細分0.05的情況下獲取圖紙的左、底、長、寬的數(shù)值 iret = ZmotionCad.ZMotionCadArray_GetRange(ref Image_Left, ref Image_bottom, ref Image_Width, ref Image_Height, 0.05); if (Image_Width < 0.0001 && Image_Height < 0.0001) { Image_Left = (float)0.0; Image_bottom = (float)0.0; Image_Width = (float)100.0; Image_Height = (float)100.0; } double ObjectPixHeight, ObjectPixWidth; //實際在畫板上顯示圖形的大小 if (Image_Width * PicHeight <= Image_Height * PicWidth) { ObjectPixHeight = PicHeight; ObjectPixWidth = ObjectPixHeight * Image_Width / Image_Height; } else { ObjectPixWidth = PicWidth; ObjectPixHeight = ObjectPixWidth * Image_Height / Image_Width; } //縮放比例 dScale = ObjectPixHeight / Image_Height; m_dUnitsPerMm = dScale * 1; //偏移 m_dTranX = (MyPicture.Width - ObjectPixWidth) / 2 - Image_Left * dScale; m_dTranY = (MyPicture.Height - ObjectPixHeight) / 2 - Image_bottom * dScale; //用畫筆將點位信息顯示在畫板上 Show_Picture();

  2、點擊運行程序,通過線程生成運動指令下發(fā)到控制器,讓控制器去跑CAD的點位坐標。

運動控制

  4、運行效果

  上位機界面上的運動軌跡與RTSys抓到的運動軌跡作比較,與RTSys示波器上的軌跡基本上相符。

運動控制

  自定義封裝指令函數(shù)

  在實際開發(fā)過程中,為了提高效率,ZMotion PC函數(shù)庫里如果沒有現(xiàn)成的指令供開發(fā)者使用,那么開發(fā)者可以通過自定義封裝指令函數(shù)的方式去實現(xiàn)開發(fā)者想要實現(xiàn)的功能來提高交互的效率。下面正運動小助手將通過一次性下發(fā)多條的示例去說明如何自定義封裝指令函數(shù)。

  1、指令說明

運動控制

  2、示例說明

  下面的示例代碼中,自定義封裝可以一次性發(fā)送多條運動指令的函數(shù)指令,代碼思路如下:1、正運動小助手先定義4個形參,分別為句柄、軸的個數(shù)、軸列表(從哪個軸號開始到哪個軸號結束)、各個軸的運動距離(可以有多條點位信息,以“;”作為一個點位信息的結束標記)。2、在自定義函數(shù)里面將形參中的axis_distance內容以“;”的方式進行剪切并保存在dir_move數(shù)組里面。3、將dir_move數(shù)組里面的點位信息通過拼接字符串的方式,循環(huán)掃描拼接生成moveabs的運動指令保存在變量名為cmdbuff 的string類型里面。4、通過ZMotion PC函數(shù)庫的在線發(fā)送指令ZAux_DirectCommand去將變量名為cmdbuff里面的多條運動指令下發(fā)給控制卡或控制器。

  ·

  Description: // 自定義封裝函數(shù),一次性下發(fā)多條運動指令Input: //handle 控制卡句柄/控制器句柄 //axis_num 總軸數(shù) //axis_list 軸號列表 //axis_distance 運動的點位坐標,以“;”作為結束標記代表一條運動坐標Return: //錯誤碼int __stdcall ZMotionCadArray_DelOne(int nDelVect);*************************************************************/public Int32 UseDefined_Moveabs(IntPtr handle,int axis_num, string axis_list,string axis_distance){ //用于拼接運動命令的字符串 string cmdbuff = ""; string[] dir_move = axis_distance.ToString().Split(new char[] { ';' }); //接收在線命令的信息 StringBuilder psResponse =new StringBuilder(1024); //判斷軸的個數(shù)是否合理 if (axis_num < 0) { return -1; } //生成命令 cmdbuff= "base(" + axis_list + ")"; for (int i = 0; i < dir_move.Length; i++) { //拼接運動指令 cmdbuff =cmdbuff+ "moveabs("+ dir_move[i]+")"; } //利用在線命令的方式去發(fā)送拼接好的運動指令 return zmcaux.ZAux_DirectCommand(handle,cmdbuff,psResponse,1024); }

  調用自定義封裝的函數(shù)指令:

  ·

  //獲取軸0緩沖區(qū)的大小 ret = zmcaux.ZAux_Direct_GetRemain_Buffer(G_CardHandle, 0, ref buf0); err_inform("ZAux_Direct_GetRemain_Buffer0", ret); if (buf0 > 10) { //通過自定義封裝的函數(shù)去發(fā)運動指令,一次發(fā)10條 ret = UseDefined_Moveabs(G_CardHandle, 2, axis, direct_str[i]); err_inform("UseDefined_Moveabs", ret); label15.Invoke(new MethodInvoker(() => direct_num(i.ToString())));

  3、代碼驗證

  (1)形參direct_str[0]里面的數(shù)據(jù)內容。

運動控制

  (2)cmdbuff里面拼接好的數(shù)據(jù)。

運動控制

  通過以上兩個變量中的數(shù)據(jù)內容查看,驗證了上訴的代碼思路是符合邏輯的,實現(xiàn)了高效率的一條指令內多條數(shù)據(jù)加工的傳輸。

  模擬量與速度的實時轉換

  一、操作步驟

  首先,設置工程下的Basic文件自動運行任務號,可以在RTSys軟件上的“控制器狀態(tài)”中查看控制器最多支持多少個任務,然后在Basic文件上填寫自動運行任務號(不能超過最大支持的任務數(shù)),最后下載到控制器上。

  1、查看控制器的最大任務數(shù)。

運動控制

  2、填寫自動運行任務號。

運動控制

  3、設置好自動運行任務號后,下載寫好的程序到控制器運行即可。

運動控制

  4、在上位機上設置轉換比例K值(0到1)。

運動控制

  二、指令介紹

運動控制

  注:在本示例代碼中,PC指令中的ZAux_Direct_SetUserVar的Varname形參在使用時,寫的是Basic文件的全局變量s_ratio。三、舉例說明在下方的Basic程序中,可以根據(jù)軸的速度來實現(xiàn)控制器模擬量輸出口的大小,也通過上位機去修改模擬量與速度的轉換比例K。使用示波器將速度與模擬量的輸出波形抓取之后,可以看出,速度與模擬量輸出的波形基本一致。

運動控制

  1、Basic相關代碼。

  GLOBAL s_ratio '速度的比例WHILE 1'將速度與模擬量的關系成正比 AOUT(0)=4.095*VP_SPEED(0)*s_ratioWENDend

  2、PC中的相關代碼。

  int ret = zmcaux.ZAux_Direct_SetUserVar(G_CardHandle, "s_ratio", Convert.ToSingle(textBox4.Text)); //設置模擬量與速度的轉換比例err_inform("比例的ZAux_Direct_SetUserVar",ret);

  四、視頻講解

完整代碼獲取地址

運動控制.png

  本次,正運動技術PCIe EtherCAT實時運動控制卡的DXF圖形的CAD導圖與多條運動指令的快速加工,就分享到這里。

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

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

標簽: 運動控制

點贊

分享到:

上一篇:基于交錯并聯(lián)設計開關電源中...

下一篇:plc工控機歸哪個部門負責

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

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

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

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

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

Chuandong.com Copyright ?2005 - 2024 ,All Rights Reserved 版權所有 粵ICP備 14004826號 | 營業(yè)執(zhí)照證書 | 不良信息舉報中心 | 粵公網(wǎng)安備 44030402000946號