免费色播,亚洲国产欧美国产第一区二区三区,毛片看,日本精品在线观看视频,国产成人精品一区二区免费视频,日本黄色免费网站,一级毛片免费

開放式數(shù)控系統(tǒng)人機(jī)界面的設(shè)計(jì)

來源:互聯(lián)網(wǎng)

點(diǎn)擊:1375

A+ A-

所屬頻道:新聞中心

關(guān)鍵詞:開放式 數(shù)控系統(tǒng) 人機(jī)界面

    0 引言

      開放式數(shù)控系統(tǒng)已經(jīng)成為當(dāng)前CNC技術(shù)發(fā)展的必然趨勢(shì),而基于/PC+運(yùn)動(dòng)控制器0結(jié)構(gòu)體系的開放式數(shù)控系統(tǒng)也已成為自動(dòng)化領(lǐng)域備受關(guān)注的數(shù)控裝置之一。含有DSP處理器的運(yùn)動(dòng)控制器,實(shí)現(xiàn)復(fù)雜的控制算法和功能,完成數(shù)控系統(tǒng)中補(bǔ)償處理、速度控制、位置控制等實(shí)時(shí)性任務(wù); PC機(jī)利用其豐富的軟件資源,在Windows環(huán)境下開發(fā)相應(yīng)的應(yīng)用程序模塊,專注于人機(jī)界面、輸入輸出、預(yù)處理、發(fā)送指令等弱實(shí)時(shí)和非實(shí)時(shí)性任務(wù)的實(shí)現(xiàn)。人機(jī)界面是集成各種應(yīng)用程序模塊的平臺(tái),設(shè)計(jì)一個(gè)界面簡(jiǎn)潔,操控方便的人機(jī)界面,是構(gòu)建開放式數(shù)控系統(tǒng)的重要內(nèi)容。本文介紹采用C++Builder編程語言構(gòu)建基于固高GT400-SV型運(yùn)動(dòng)控制器的開放式數(shù)控系統(tǒng)人機(jī)界面的實(shí)現(xiàn)方法。

    1 界面顯示方案選擇

      在界面的設(shè)計(jì)初期,擬訂了兩種界面顯示方案:多窗口模式和窗口分頁顯示模式。

      在多窗口模式下,將每一個(gè)功能模塊設(shè)計(jì)在一個(gè)功能子窗口上。即先設(shè)計(jì)一個(gè)主窗口,在主窗口下分設(shè)多個(gè)子窗口來作為各個(gè)功能模塊的接口。但這種模式的界面整體性不夠好,每需要一種功能時(shí)必須得激活相應(yīng)窗口,其他窗口會(huì)被隱藏起來,而這種隱藏會(huì)使各個(gè)功能窗口混到一起,當(dāng)需要激活某一特定功能時(shí),無法確認(rèn)所要打開的窗口。

      單一窗口分頁顯示模式是在一個(gè)主窗口上設(shè)計(jì)出多個(gè)分頁,將特定的功能模塊設(shè)計(jì)在相應(yīng)的分頁上,這樣每個(gè)分頁在主窗口上都有確定的位置。這種顯示方式能夠很方便地在各個(gè)功能之間進(jìn)行切換。通過兩種方案的對(duì)比,決定采用第二種方案。

    2 界面設(shè)計(jì)與文件銜接

      界面設(shè)計(jì)與文件的銜接是界面設(shè)計(jì)的重點(diǎn)。下面針對(duì)具有代表性的模塊論述銜接過程。在同一類功能當(dāng)中,設(shè)計(jì)思想是一樣的,不同的只是所響應(yīng)的事件不同而已。

      2.1 主程序文件與程序編輯器

      設(shè)計(jì)程序編輯器是為了讓主程序文件當(dāng)中的函數(shù)能夠讀取和編輯程序編輯器當(dāng)中的代碼。通過以下函數(shù)來實(shí)現(xiàn)其銜接:

      (1)Dword CallbackThreadFunc(void* ptr)

      這個(gè)函數(shù)是一個(gè)線程回調(diào)函數(shù),函數(shù)體實(shí)現(xiàn)的功能跟一般的函數(shù)類似,唯一不同的是這種函數(shù)只能夠用于多線程,只能由某一線程調(diào)用。當(dāng)一個(gè)線程建立起來后,它必須調(diào)用某一個(gè)線程函數(shù)才能夠完成某一特定功能。例如在程序設(shè)計(jì)中,通過建立一個(gè)線程來執(zhí)行G代碼轉(zhuǎn)換,這個(gè)線程的作用是從編輯器讀取G代碼,經(jīng)過相應(yīng)的轉(zhuǎn)換,再調(diào)用GT400基本功能函數(shù)。由于C++Builder中的RichEdit編輯器控件本身的功能就很完善,所以只要一條原代碼,就完成了從編輯器中讀取G代碼的功能。原代碼是: pedit=Form1->RichEdit1->Lines->GetText();

      (2)void _fastcallTForm1:: SetFileName(constAn-siString FileName)

      這個(gè)函數(shù)完成的功能是為編輯器當(dāng)中所編輯的未命名或重命名文件設(shè)定文件名并在標(biāo)題欄顯示出來。這個(gè)函數(shù)與界面的關(guān)系,可以從整條語句看出:TForm1是一個(gè)窗體類,而Form1為控制界面的主窗體,因而它屬于主窗體文件,要連接到界面還須配合界面的相應(yīng)功能按鈕。

      (3)void _fastcallTForm1::CheckFileSave(void)

      這個(gè)函數(shù)檢查G代碼是否被修改過,如果被修改過則在文件關(guān)閉或進(jìn)行一些其他操作時(shí),提示是否要對(duì)當(dāng)前文件進(jìn)行存儲(chǔ)。這個(gè)函數(shù)可以由其它函數(shù)調(diào)用,也可以響應(yīng)界面編輯按鈕來完成對(duì)G代碼文件的檢驗(yàn)。

      (4)TTextAttributes* _ fastcall TForm1:: CurrText(void)

      這個(gè)函數(shù)從編輯器中返回所選擇字體的屬性。這些函數(shù)完成了編輯器與主程序的連接,是界面和G代碼轉(zhuǎn)換的橋梁。

      2.2 界面功能按鈕與響應(yīng)事件的銜接

      在控制界面當(dāng)中,功能按鈕大致可以分為三類:第一類是主菜單底下的子菜單按鈕;第二類是工具欄中的快捷按鈕;第三類是界面上的其它功能按鈕。這三類按鈕是程序與界面銜接的重要部分,現(xiàn)以第一類按鈕當(dāng)中存儲(chǔ)子菜單為例說明銜接過程:

      在完成菜單項(xiàng)的界面設(shè)計(jì)之后,先在集成開發(fā)環(huán)境當(dāng)中單擊存儲(chǔ)子菜單按鈕,則在主程序文件當(dāng)中會(huì)自動(dòng)生成這樣一個(gè)函數(shù):

      void __fastcallTForm1::N7Click(TObject* Sender)  {  }

      由于沒有響應(yīng)事件,在編譯運(yùn)行后點(diǎn)擊該子菜單時(shí),系統(tǒng)不做任何響應(yīng)。然后在響應(yīng)函數(shù)當(dāng)中添加如下實(shí)體,以便完成存儲(chǔ)功能:

      void __fastcallTForm1::N7Click(TObject* Sender)  {  if(! strcmp(FFileName. c_str(), "未命名")); //判斷G  代碼文件是否命名  { if(SaveDialog1->Execute()); //沒有命名,打開存儲(chǔ)  文件對(duì)話框   { RichEdit1->Lines->SaveToFile(SaveDialog1->  FileName); //存儲(chǔ)文件 SetFileName(SaveDialog1->FileName); //在文件標(biāo)題上顯示   RichEdit1->Modified=false; //復(fù)位文件修改標(biāo)志   }   }  else //如果文件已命名則直接存儲(chǔ)  {  RichEdit1->Lines->SaveToFile(FFileName);  RichEdit1->Modified=false;  }  }

      這樣,程序運(yùn)行之后點(diǎn)擊存儲(chǔ)按鈕,就可完成將編輯器當(dāng)中的G代碼存儲(chǔ)起來。

      第二類是工具欄上的快捷工具按鈕,而在子菜單當(dāng)中又都能夠找到它們的響應(yīng)按鈕,所以可以直接將它們與各個(gè)相應(yīng)子菜單按鈕銜接,這樣就不用在它們的函數(shù)當(dāng)中添加同樣的函數(shù)體以省去寫原代碼的麻煩。仍以存儲(chǔ)按鈕為例,通過兩種方法來實(shí)現(xiàn)兩個(gè)按鈕的銜接:

      (1)在集成開發(fā)環(huán)境當(dāng)中的界面工具欄上選中存儲(chǔ)按鈕(假設(shè)界面已設(shè)計(jì)好),在左邊控件屬性欄中點(diǎn)擊even,t再點(diǎn)擊Onclick右邊的框子,在下拉菜單中選相應(yīng)按鈕名稱即可完成銜接。

      (2)在集成開發(fā)環(huán)境當(dāng)中的界面工具欄上雙擊存儲(chǔ)按鈕,在主程序文件當(dāng)中會(huì)自動(dòng)生成如下響應(yīng)函數(shù):

      void __fastcallTForm1::ToolButton1Click(TObject* Sender)  {  }  在函數(shù)體中添加如下代碼即可完成兩個(gè)按鈕之間的銜接:

      void __fastcallTForm1::ToolButton1Click(TObject* Sender)  {  N7Click(Sender);  }

      由于設(shè)計(jì)思路一樣,對(duì)其他按鈕的銜接問題不再贅述。

      2.3 界面參數(shù)的讀入

      在控制界面上讀入各種控制參數(shù),才能建立起系統(tǒng)的運(yùn)行環(huán)境。界面參數(shù)輸入一般通過Edit和Com-boBox等控件來實(shí)現(xiàn)。

      如圖1所示為設(shè)定系統(tǒng)周期的輸入框,通過下面函數(shù),可將輸入框中的各個(gè)參數(shù)輸入系統(tǒng):

      void ZhouqiSet()  {   short rtn;   tm=StrToFloat(Form1->cbotm->Text);   lmt=StrToFloat(Form1->cbolmt->Text);   enc=StrToFloat(Form1->cboenc->Text);   .  }

      圖中三個(gè)輸入框都是ComboBox控件,從上到下被命名為cbotm、cbolmt、cboenc。系統(tǒng)伺服周期通過Form1->cbotm->Text語句讀入,此語句在功能上相當(dāng)于一個(gè)指針,對(duì)應(yīng)地址當(dāng)中的內(nèi)容就是向輸入框當(dāng)中輸入的數(shù)字,這時(shí)參數(shù)的類型為String而不是整形或浮點(diǎn)型,因而需要進(jìn)行轉(zhuǎn)換后再賦予相應(yīng)變量,以便系統(tǒng)函數(shù)調(diào)用。轉(zhuǎn)換的數(shù)據(jù)類型通過這樣的語句實(shí)現(xiàn): tm=StrToFloat(Form1->cbotm->Text),這句將周期輸入框中的輸入?yún)?shù)轉(zhuǎn)換成浮點(diǎn)型,再賦予周期變量。

      Edit控件的讀入原理跟ComboBox一樣。

      2.4 界面參數(shù)的輸出

      在程序設(shè)計(jì)中,用到的數(shù)據(jù)輸出控件主要有Lable控件、PaintBox控件及狀態(tài)條StatusBar控件。PaintBox控件的使用與圖形顯示有關(guān),而Lable控件是一個(gè)標(biāo)簽控件,它可以用于在界面上標(biāo)示各種輸入輸出框的作用,也可以直接用于輸出某一數(shù)據(jù),在設(shè)計(jì)中,除了利用這個(gè)控件來標(biāo)示各種輸入框外,還用于輸出X軸和Y軸的位置坐標(biāo)。以顯示運(yùn)行軌跡界面X、Y位置坐標(biāo)為例,論述其輸出過程。

      首先,訪問GT400運(yùn)動(dòng)控制器的位置寄存器。訪問函數(shù)為: shortGT_GetAtlPos(long* Apos);這個(gè)函數(shù)返回各坐標(biāo)的位置數(shù)據(jù),以便實(shí)現(xiàn)必要的位置數(shù)據(jù)輸出和圖形顯示。位置坐標(biāo)的讀回代碼為:

      EnterCriticalSection(&Sect1); //多線程中初始化臨界區(qū)域  rtn=GT_Axis(1); error(rtn);  rtn=GT_GetAtlPos(&actl_xpos); error(rtn); //讀回X位置值,放到變量actl_xpos中  rtn=GT_Axis(3); error(rtn);  rtn=GT_GetAtlPos(&actl_ypos); error(rtn); //讀回Y位置值,放到變量actl_ypos中  LeaveCriticalSection(&Sect1); //釋放臨界區(qū)然后,在界面上顯示坐標(biāo)位置:  Form1->xpos->Caption=" " +IntToStr(actl_xpos); //  將X軸的位置值向運(yùn)行軌跡分頁的X軸標(biāo)簽處輸出  Form1->StatusBar1->Panels->Items[1] ->Text="  X: "+IntToStr(actl_xpos); //將X位置值向控制界面的狀態(tài)欄輸出  Form1->ypos->Caption=" " + IntToStr( actl_ypos);  //將Y軸的位置值向運(yùn)行軌跡分頁的Y軸標(biāo)簽處輸出  Form1->StatusBar1->Panels->Items[2] ->Text="  Y: "+IntToStr(actl_ypos); //將Y位置值向控制界面的狀態(tài)欄輸出

      第一句涉及到多線程當(dāng)中對(duì)公共變量的訪問問題。為了避免在多線程中因?yàn)橥瑫r(shí)訪問公共數(shù)據(jù)塊而造成不良后果,需要對(duì)公共數(shù)據(jù)塊進(jìn)行保護(hù),直到一個(gè)線程對(duì)它的訪問結(jié)束為止,在設(shè)計(jì)中調(diào)用的是W in32的API函數(shù)進(jìn)行臨界區(qū)域的劃定,即EnterCriticalSec-tion(&Sect1)和LeaveCriticalSection(&Sect1)。設(shè)定臨界區(qū)域后就可以保證一次只有一個(gè)線程對(duì)該區(qū)域進(jìn)行訪問,而不會(huì)引起數(shù)據(jù)訪問的沖突。

    3 軌跡顯示設(shè)計(jì)過程

      分的執(zhí)行代碼包含在Display. cpp程序文件當(dāng)中。運(yùn)行軌跡界面設(shè)計(jì)成其被激活時(shí)才顯示軌跡,其它界面被激活時(shí)不顯示。運(yùn)動(dòng)軌跡顯示的坐標(biāo)軸采用紅色,運(yùn)行G00時(shí)運(yùn)動(dòng)軌跡采用黃色,其它軌跡采用藍(lán)色。設(shè)計(jì)中用到C++Builder中的兩個(gè)控件:一個(gè)是Standard組件當(dāng)中的GroupBox控件,它用來標(biāo)記出軌跡顯示的邊界;另一個(gè)是System組件當(dāng)中的PaintBox控件,即圖形顯示控件,它能夠在窗體上指定形成一個(gè)Canvas對(duì)象的繪圖區(qū)域,通過這個(gè)繪圖區(qū)域可以實(shí)現(xiàn)運(yùn)動(dòng)軌跡的實(shí)時(shí)顯示。實(shí)現(xiàn)步驟分為兩步:

      (1)在窗體初始化時(shí)先畫出坐標(biāo)軸,它通過Dis-play. cpp程序文件當(dāng)中的void Coordinate()函數(shù)實(shí)現(xiàn);

      (2)當(dāng)程序運(yùn)行時(shí),通過位置讀回函數(shù)GT_GetAt-lPos(double)不斷讀回坐標(biāo)位置值,并將其映射到坐標(biāo)軸中去,再利用定時(shí)器快速刷新坐標(biāo)值,而每一個(gè)坐標(biāo)值勾畫一段小直線,這樣無數(shù)段小直線便勾畫出各種運(yùn)動(dòng)軌跡。該部分的功能通過Display. cpp程序文件當(dāng)中的void Display ()函數(shù)來實(shí)現(xiàn)。

    4 結(jié)束語

      初步完成了以固高GT400-SV運(yùn)動(dòng)控制器構(gòu)建的開放式數(shù)控系統(tǒng)人機(jī)界面部分的設(shè)計(jì)。通過調(diào)試證明,所設(shè)計(jì)的人機(jī)界面滿足兩坐標(biāo)數(shù)控系統(tǒng)的要求。此界面包括了常用的菜單欄、工具欄、界面顯示欄等。設(shè)計(jì)方法和過程對(duì)構(gòu)建基于運(yùn)動(dòng)控制器的開放式數(shù)控系統(tǒng)人機(jī)界面具有一定的通用性。設(shè)計(jì)中對(duì)界面作了相應(yīng)地優(yōu)化,去掉了那些具有重復(fù)功能的按鈕,并使菜單欄和工具欄中的按鈕只有在編程界面上有效,而在其它界面上無效,提高了系統(tǒng)的可靠性。

    (審核編輯: 智匯張瑜)

    聲明:除特別說明之外,新聞內(nèi)容及圖片均來自網(wǎng)絡(luò)及各大主流媒體。版權(quán)歸原作者所有。如認(rèn)為內(nèi)容侵權(quán),請(qǐng)聯(lián)系我們刪除。