時(shí)間:2024-06-06 14:57:52來源:深圳市正運(yùn)動(dòng)技術(shù)有限公司
今天,正運(yùn)動(dòng)小助手給大家分享一下C#語言如何進(jìn)行CAD導(dǎo)圖、RTBasic程序的多任務(wù)開發(fā)。在正式學(xué)習(xí)之前,我們先了解一下正運(yùn)動(dòng)技術(shù)的運(yùn)動(dòng)控制卡PCIE464。
硬件介紹
PCIE464運(yùn)動(dòng)控制卡是正運(yùn)動(dòng)推出的一款EtherCAT總線+脈沖型、PCIE接口式的運(yùn)動(dòng)控制卡,可選6-64軸運(yùn)動(dòng)控制,支持多路高速數(shù)字輸入輸出,可輕松實(shí)現(xiàn)多軸同步控制和高速數(shù)據(jù)傳輸。
PCIE464運(yùn)動(dòng)控制卡適合于多軸點(diǎn)位運(yùn)動(dòng)、插補(bǔ)運(yùn)動(dòng)、軌跡規(guī)劃、手輪控制、編碼器位置檢測(cè)、IO控制、位置鎖存等功能的應(yīng)用。PCIE464運(yùn)動(dòng)控制卡適用于3C電子加工、檢測(cè)設(shè)備、半導(dǎo)體設(shè)備、SMT加工、激光加工、光通訊設(shè)備、鋰電及光伏設(shè)備、以及非標(biāo)自動(dòng)化設(shè)備等高速高精應(yīng)用場(chǎng)合。
PCIE4系列控制卡的應(yīng)用程序可以使用VC,VB,VS,C++,C#等軟件開發(fā),程序運(yùn)行時(shí)需要?jiǎng)討B(tài)庫zmotion.dll,調(diào)試時(shí)可以將RTSys軟件同時(shí)連接控制器,從而方便調(diào)試、方便觀察。
PCIE464產(chǎn)品介紹
接線參考
1、IN數(shù)字量輸入接口數(shù)字輸入分布在J400(IN0-IN7)和X400(IN8-IN39)信號(hào)接口中。
2、OUT數(shù)字量輸出接口數(shù)字輸出分布在 J400(OUT0-7)和 X400(OUT8-OUT39)信號(hào)接口中。
C#語言進(jìn)行項(xiàng)目開發(fā)
1、在VS2010菜單“文件”→“新建”→“項(xiàng)目”,啟動(dòng)創(chuàng)建項(xiàng)目向?qū)А?/p>
2、選擇開發(fā)語言為“Visual C#”和.NET Framework 4以及Windows窗體應(yīng)用程序。
3、找到廠家提供的運(yùn)動(dòng)庫、CAD導(dǎo)圖庫(32位庫為例)。
4、將廠商提供的C#的庫文件以及相關(guān)文件復(fù)制到新建的項(xiàng)目中,以及將廠商提供的C#的相關(guān)庫文件放入bin\debug文件夾中。
5、用vs打開新建的項(xiàng)目文件,在右邊的解決方案資源管理器中點(diǎn)擊顯示所有文件,然后鼠標(biāo)右擊zmcaux.cs文件,點(diǎn)擊包括在項(xiàng)目中,根據(jù)添加zmcaux.cs文件的步驟,將zmclaser.cs和zmotioncad.cs文件添加進(jìn)工程中。
6、雙擊Form1.cs里面的Form1,出現(xiàn)代碼編輯界面,在文件開頭寫入using cszmcaux,using
ZmotionCadDll,并聲明控制器句柄g_cardhandle和使用CAD中使用到的cad庫函數(shù)的句柄g_cadhandle。
7、至此,項(xiàng)目新建完成,可進(jìn)行C#項(xiàng)目開發(fā)。
C#語言進(jìn)行CAD導(dǎo)圖
在實(shí)際的運(yùn)用場(chǎng)景中,如果一張圖紙靠人為去計(jì)算圖形運(yùn)動(dòng)軌跡的坐標(biāo),結(jié)果既費(fèi)時(shí)又費(fèi)力。所以,在此情景下,如果我們讓計(jì)算機(jī)去計(jì)算圖形的運(yùn)動(dòng)軌跡,則會(huì)事半功倍,接下來我們介紹如何使用C#進(jìn)行CAD導(dǎo)圖。
1、操作步驟
首先,新建WinForm項(xiàng)目并添加函數(shù)庫,接著用ZMotionCadArray_ImportVectGraph指令去導(dǎo)入打開CAD圖形文件,并進(jìn)行小線段的拆分精度。再用ZMotionCadArray_GetVectNum指令去獲取數(shù)組長度,接著創(chuàng)建一個(gè)struct_zcad_array結(jié)構(gòu)體類型(該結(jié)構(gòu)體在ZMotionCad庫中已經(jīng)有聲明,直接定義調(diào)用即可),用來保存運(yùn)動(dòng)數(shù)據(jù)、運(yùn)動(dòng)類型等信息。創(chuàng)建好該結(jié)構(gòu)體數(shù)組以后,再用ZMotionCadArray_GetVectArray指令將圖形的運(yùn)動(dòng)數(shù)據(jù)保存到該數(shù)組里面。
最后,用ZMotionCadArray_MergeSeg指令去將各個(gè)點(diǎn)連接成線。操作思路,如圖所示。
2、指令介紹
3、生成運(yùn)動(dòng)軌跡數(shù)據(jù)
將.dxf文件導(dǎo)入進(jìn)去后,使用ZMotionCadArray_ImportVectGraph指令將CAD圖紙導(dǎo)入,并對(duì)小線段進(jìn)行拆分。
用ZMotionCadArray_GetVectNum獲取數(shù)據(jù)長度,獲取到數(shù)據(jù)長度后,創(chuàng)建一個(gè)Struct_ZCad_Array類型的數(shù)組。
這時(shí),其CAD圖紙的數(shù)據(jù)就保存在這結(jié)構(gòu)體數(shù)組中,獲取圖形數(shù)據(jù)用ZMotionCadArray_GetVectArray指令。
創(chuàng)建一個(gè)StringBuilder類型的數(shù)組,用循環(huán)去訪問Struct_ZCad_Array類型數(shù)組的運(yùn)動(dòng)類型,并把其運(yùn)動(dòng)坐標(biāo)尾插到該數(shù)組里面。
最后,用文件IO的知識(shí)創(chuàng)建一個(gè)bas文件,并將StringBuilder類型數(shù)組的運(yùn)動(dòng)數(shù)據(jù)尾插到該bas文件中。
1、導(dǎo)入圖形文件,通過線程去獲取CAD圖紙的點(diǎn)位信息,并用畫筆將點(diǎn)位信息顯示在畫板上。
獲取圖紙點(diǎn)位信息的相關(guān)代碼:
//打開配置文件if (openFileDialog1.ShowDialog() == DialogResult.OK) { strFilePath = openFileDialog1.FileName; label11.Text = Path.GetFileName(strFilePath); textBox3.Text= textBox3.Text+"\r\n"+"導(dǎo)入文件:"+ Path.GetFileName(strFilePath); //導(dǎo)入CAD圖形文件 m_refDistance圓弧轉(zhuǎn)小線段拆分精度 int iret = ZmotionCad.ZMotionCadArray_ImportVectGraph(strFilePath, 1024, 1, m_refDistance); //導(dǎo)入數(shù)據(jù), 獲取數(shù)組長度 iret = ZmotionCad.ZMotionCadArray_GetVectNum(ref ZCad_ArrayLen); //創(chuàng)建一個(gè)結(jié)構(gòu)體變量 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(); //在細(xì)分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; //實(shí)際在畫板上顯示圖形的大小 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; //用畫筆將點(diǎn)位信息顯示在畫板上 Show_Picture();
2、點(diǎn)擊運(yùn)行程序,通過線程生成運(yùn)動(dòng)指令下發(fā)到控制器,讓控制器去跑CAD的點(diǎn)位坐標(biāo)。
4、運(yùn)行效果
上位機(jī)界面上的運(yùn)動(dòng)軌跡與RTSys抓到的運(yùn)動(dòng)軌跡作比較,與RTSys示波器上的軌跡基本上相符。
自定義封裝指令函數(shù)
在實(shí)際開發(fā)過程中,為了提高效率,ZMotion PC函數(shù)庫里如果沒有現(xiàn)成的指令供開發(fā)者使用,那么開發(fā)者可以通過自定義封裝指令函數(shù)的方式去實(shí)現(xiàn)開發(fā)者想要實(shí)現(xiàn)的功能來提高交互的效率。下面正運(yùn)動(dòng)小助手將通過一次性下發(fā)多條的示例去說明如何自定義封裝指令函數(shù)。
1、指令說明
2、示例說明
下面的示例代碼中,自定義封裝可以一次性發(fā)送多條運(yùn)動(dòng)指令的函數(shù)指令,代碼思路如下:1、正運(yùn)動(dòng)小助手先定義4個(gè)形參,分別為句柄、軸的個(gè)數(shù)、軸列表(從哪個(gè)軸號(hào)開始到哪個(gè)軸號(hào)結(jié)束)、各個(gè)軸的運(yùn)動(dòng)距離(可以有多條點(diǎn)位信息,以“;”作為一個(gè)點(diǎn)位信息的結(jié)束標(biāo)記)。2、在自定義函數(shù)里面將形參中的axis_distance內(nèi)容以“;”的方式進(jìn)行剪切并保存在dir_move數(shù)組里面。3、將dir_move數(shù)組里面的點(diǎn)位信息通過拼接字符串的方式,循環(huán)掃描拼接生成moveabs的運(yùn)動(dòng)指令保存在變量名為cmdbuff 的string類型里面。4、通過ZMotion PC函數(shù)庫的在線發(fā)送指令ZAux_DirectCommand去將變量名為cmdbuff里面的多條運(yùn)動(dòng)指令下發(fā)給控制卡或控制器。
·
Description: // 自定義封裝函數(shù),一次性下發(fā)多條運(yùn)動(dòng)指令I(lǐng)nput: //handle 控制卡句柄/控制器句柄 //axis_num 總軸數(shù) //axis_list 軸號(hào)列表 //axis_distance 運(yùn)動(dòng)的點(diǎn)位坐標(biāo),以“;”作為結(jié)束標(biāo)記代表一條運(yùn)動(dòng)坐標(biāo)Return: //錯(cuò)誤碼int __stdcall ZMotionCadArray_DelOne(int nDelVect);*************************************************************/public Int32 UseDefined_Moveabs(IntPtr handle,int axis_num, string axis_list,string axis_distance){ //用于拼接運(yùn)動(dòng)命令的字符串 string cmdbuff = ""; string[] dir_move = axis_distance.ToString().Split(new char[] { ';' }); //接收在線命令的信息 StringBuilder psResponse =new StringBuilder(1024); //判斷軸的個(gè)數(shù)是否合理 if (axis_num < 0) { return -1; } //生成命令 cmdbuff= "base(" + axis_list + ")"; for (int i = 0; i < dir_move.Length; i++) { //拼接運(yùn)動(dòng)指令 cmdbuff =cmdbuff+ "moveabs("+ dir_move[i]+")"; } //利用在線命令的方式去發(fā)送拼接好的運(yùn)動(dòng)指令 return zmcaux.ZAux_DirectCommand(handle,cmdbuff,psResponse,1024); }
調(diào)用自定義封裝的函數(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ā)運(yùn)動(dòng)指令,一次發(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、代碼驗(yàn)證
(1)形參direct_str[0]里面的數(shù)據(jù)內(nèi)容。
(2)cmdbuff里面拼接好的數(shù)據(jù)。
通過以上兩個(gè)變量中的數(shù)據(jù)內(nèi)容查看,驗(yàn)證了上訴的代碼思路是符合邏輯的,實(shí)現(xiàn)了高效率的一條指令內(nèi)多條數(shù)據(jù)加工的傳輸。
模擬量與速度的實(shí)時(shí)轉(zhuǎn)換
一、操作步驟
首先,設(shè)置工程下的Basic文件自動(dòng)運(yùn)行任務(wù)號(hào),可以在RTSys軟件上的“控制器狀態(tài)”中查看控制器最多支持多少個(gè)任務(wù),然后在Basic文件上填寫自動(dòng)運(yùn)行任務(wù)號(hào)(不能超過最大支持的任務(wù)數(shù)),最后下載到控制器上。
1、查看控制器的最大任務(wù)數(shù)。
2、填寫自動(dòng)運(yùn)行任務(wù)號(hào)。
3、設(shè)置好自動(dòng)運(yùn)行任務(wù)號(hào)后,下載寫好的程序到控制器運(yùn)行即可。
4、在上位機(jī)上設(shè)置轉(zhuǎn)換比例K值(0到1)。
二、指令介紹
注:在本示例代碼中,PC指令中的ZAux_Direct_SetUserVar的Varname形參在使用時(shí),寫的是Basic文件的全局變量s_ratio。三、舉例說明在下方的Basic程序中,可以根據(jù)軸的速度來實(shí)現(xiàn)控制器模擬量輸出口的大小,也通過上位機(jī)去修改模擬量與速度的轉(zhuǎn)換比例K。使用示波器將速度與模擬量的輸出波形抓取之后,可以看出,速度與模擬量輸出的波形基本一致。
1、Basic相關(guān)代碼。
GLOBAL s_ratio '速度的比例WHILE 1'將速度與模擬量的關(guān)系成正比 AOUT(0)=4.095*VP_SPEED(0)*s_ratioWENDend
2、PC中的相關(guān)代碼。
int ret = zmcaux.ZAux_Direct_SetUserVar(G_CardHandle, "s_ratio", Convert.ToSingle(textBox4.Text)); //設(shè)置模擬量與速度的轉(zhuǎn)換比例err_inform("比例的ZAux_Direct_SetUserVar",ret);
四、視頻講解
完整代碼獲取地址
▼
本次,正運(yùn)動(dòng)技術(shù)PCIe EtherCAT實(shí)時(shí)運(yùn)動(dòng)控制卡的DXF圖形的CAD導(dǎo)圖與多條運(yùn)動(dòng)指令的快速加工,就分享到這里。
更多精彩內(nèi)容請(qǐng)關(guān)注“正運(yùn)動(dòng)小助手”公眾號(hào),需要相關(guān)開發(fā)環(huán)境與例程代碼,請(qǐng)咨詢正運(yùn)動(dòng)技術(shù)銷售工程師:400-089-8936。
本文由正運(yùn)動(dòng)技術(shù)原創(chuàng),歡迎大家轉(zhuǎn)載,共同學(xué)習(xí),一起提高中國智能制造水平。文章版權(quán)歸正運(yùn)動(dòng)技術(shù)所有,如有轉(zhuǎn)載請(qǐng)注明文章來源。
中國傳動(dòng)網(wǎng)版權(quán)與免責(zé)聲明:凡本網(wǎng)注明[來源:中國傳動(dòng)網(wǎng)]的所有文字、圖片、音視和視頻文件,版權(quán)均為中國傳動(dòng)網(wǎng)(u63ivq3.com)獨(dú)家所有。如需轉(zhuǎn)載請(qǐng)與0755-82949061聯(lián)系。任何媒體、網(wǎng)站或個(gè)人轉(zhuǎn)載使用時(shí)須注明來源“中國傳動(dòng)網(wǎng)”,違反者本網(wǎng)將追究其法律責(zé)任。
本網(wǎng)轉(zhuǎn)載并注明其他來源的稿件,均來自互聯(lián)網(wǎng)或業(yè)內(nèi)投稿人士,版權(quán)屬于原版權(quán)人。轉(zhuǎn)載請(qǐng)保留稿件來源及作者,禁止擅自篡改,違者自負(fù)版權(quán)法律責(zé)任。