《電子技術(shù)應(yīng)用》
您所在的位置:首頁 > 其他 > 設(shè)計(jì)應(yīng)用 > 基于MFC的故障維修專家系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)
基于MFC的故障維修專家系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)
來源:微型機(jī)與應(yīng)用2012年第22期
陳侃松, 劉洪波, 熊 攀, 唐 寅
(湖北大學(xué) 物理學(xué)與電子技術(shù)學(xué)院, 湖北 武漢 430062)
摘要: 針對現(xiàn)代工業(yè)機(jī)械設(shè)備維修的復(fù)雜性,,根據(jù)設(shè)備的故障現(xiàn)象,、故障原因、故障排除的原理,結(jié)合以往維修人員的經(jīng)驗(yàn),,采用Access數(shù)據(jù)庫構(gòu)建樹狀結(jié)構(gòu)進(jìn)行節(jié)點(diǎn)管理與節(jié)點(diǎn)消息響應(yīng),從而實(shí)現(xiàn)故障信息管理和故障信息提取,。運(yùn)用C++語言和面向?qū)ο蟮姆椒▽?shí)現(xiàn)了人機(jī)交互界面,,開發(fā)出設(shè)備故障維修專家?guī)煜到y(tǒng)。實(shí)際應(yīng)用表明,,該系統(tǒng)提高了維修人員的維修效率,、減少了人力成本,為實(shí)際維修提供參考和指導(dǎo),。
Abstract:
Key words :

摘  要: 針對現(xiàn)代工業(yè)機(jī)械設(shè)備維修的復(fù)雜性,,根據(jù)設(shè)備的故障現(xiàn)象、故障原因,、故障排除的原理,,結(jié)合以往維修人員的經(jīng)驗(yàn),采用Access數(shù)據(jù)庫構(gòu)建樹狀結(jié)構(gòu)進(jìn)行節(jié)點(diǎn)管理與節(jié)點(diǎn)消息響應(yīng),,從而實(shí)現(xiàn)故障信息管理和故障信息提取,。運(yùn)用C++語言和面向?qū)ο蟮姆椒▽?shí)現(xiàn)了人機(jī)交互界面,開發(fā)出設(shè)備故障維修專家?guī)煜到y(tǒng),。實(shí)際應(yīng)用表明,,該系統(tǒng)提高了維修人員的維修效率、減少了人力成本,,為實(shí)際維修提供參考和指導(dǎo),。
關(guān)鍵詞: Access數(shù)據(jù)庫;樹狀結(jié)構(gòu),;故障信息,;C++;專家?guī)煜到y(tǒng)

    由于現(xiàn)代工業(yè)機(jī)械設(shè)備的復(fù)雜性及其使用壽命要求的日益提高,,對設(shè)備維修保障和質(zhì)量服務(wù)等方面提出了新的挑戰(zhàn),。有效存儲和使用設(shè)備的歷史維修案例、查詢設(shè)備的應(yīng)用情況,,為維護(hù)人員改進(jìn)維修方式和解決新問題提供了參考依據(jù),,也可提高設(shè)備的可維護(hù)性和穩(wěn)定性。
    根據(jù)維修經(jīng)驗(yàn),、技巧,、方法等構(gòu)建的設(shè)備故障維修專家?guī)煜到y(tǒng)包括故障現(xiàn)象,、故障原因、排除方法等,。它為解決設(shè)備出現(xiàn)的實(shí)際故障問題提供了重要依據(jù),。因此,如何有效存儲,、檢索文本,、圖片、視頻等數(shù)據(jù)資料是構(gòu)建故障維修專家?guī)煜到y(tǒng)的關(guān)鍵,。本文針對機(jī)械設(shè)備引起的故障現(xiàn)象,、原因及排除方法設(shè)計(jì)了一套設(shè)備故障維修專家?guī)煜到y(tǒng),通過關(guān)鍵詞匹配檢索故障案例,,為設(shè)備維護(hù)提供參考和指導(dǎo),。
1 系統(tǒng)分析與總體設(shè)計(jì)
    系統(tǒng)設(shè)計(jì)思路主要由故障信息采集和故障信息錄入兩部分組成。故障信息采集:維修人員將設(shè)備產(chǎn)生的故障現(xiàn)象,、故障原因及故障排除方法等信息收集,。故障信息錄入:管理員將維修人員收集的信息錄入數(shù)據(jù)庫。當(dāng)設(shè)備出現(xiàn)故障時,,維修人員使用本系統(tǒng)查找出設(shè)備故障的排除方法,;同時,對某些不準(zhǔn)確的信息修改后重新收集,提供給超級用戶修改后錄入系統(tǒng)。其流程圖如圖1所示,。根據(jù)系統(tǒng)流程圖設(shè)計(jì)專家?guī)煜到y(tǒng),,主要由用戶管理、信息管理和信息顯示等組成,系統(tǒng)總體框圖如圖2所示,。

2 樹狀結(jié)構(gòu)的實(shí)現(xiàn)
    樹狀結(jié)構(gòu)是一類非常重要的非線性結(jié)構(gòu)數(shù)據(jù),,它可以描述客觀世界中廣泛存在的具有分支關(guān)系或?qū)哟翁匦缘膶ο螅虼嗽谟?jì)算機(jī)領(lǐng)域里有著廣泛應(yīng)用,,如操作系統(tǒng)中的文件管理,、編譯程序中的語法結(jié)構(gòu)、數(shù)據(jù)庫系統(tǒng)信息組織形式等,。因此,,本文將采用樹狀結(jié)構(gòu)實(shí)現(xiàn)專家?guī)煜到y(tǒng)的層次結(jié)構(gòu)管理和節(jié)點(diǎn)消息響應(yīng)。
     參考文獻(xiàn)[1-2]中運(yùn)用C++設(shè)計(jì)了樹狀結(jié)構(gòu),,實(shí)現(xiàn)了節(jié)點(diǎn)的復(fù)制,、剪切,、粘貼等功能,,但程序重啟后,修改好的節(jié)點(diǎn)信息將會丟失,,未能實(shí)現(xiàn)樹狀結(jié)構(gòu)節(jié)點(diǎn)的存儲,。 而本文通過Access數(shù)據(jù)庫構(gòu)建樹狀結(jié)構(gòu)[3-4],,實(shí)現(xiàn)了樹狀結(jié)構(gòu)節(jié)點(diǎn)的存儲、節(jié)點(diǎn)信息提取,,開發(fā)出故障維修專家?guī)煜到y(tǒng),。
2.1 節(jié)點(diǎn)在Access數(shù)據(jù)庫的排列原理
    樹狀結(jié)構(gòu)中的每個節(jié)點(diǎn)都包括ID、子節(jié)點(diǎn),、父節(jié)點(diǎn),、目錄號、路徑5個自定義的數(shù)據(jù),,將這些節(jié)點(diǎn)包括的數(shù)據(jù)存放在Access數(shù)據(jù)庫表中,,通過對節(jié)點(diǎn)數(shù)據(jù)的排列組合來實(shí)現(xiàn)樹狀分層結(jié)構(gòu),其數(shù)據(jù)的組合如圖3(a)所示,。

    其中,數(shù)據(jù)的分層是根據(jù)子節(jié)點(diǎn)和父節(jié)點(diǎn)在數(shù)據(jù)表中的交替排列,,每一個父節(jié)點(diǎn)下面包括子節(jié)點(diǎn),而每一個子節(jié)點(diǎn)又可以作為新的父節(jié)點(diǎn),,依次類推,。假設(shè)先定義一個3層的平面結(jié)構(gòu),從表格中可以看到節(jié)點(diǎn)1,、2,、3屬于總節(jié)點(diǎn),而節(jié)點(diǎn)11,、12屬于節(jié)點(diǎn)1的子節(jié)點(diǎn);同理可以得出其他節(jié)點(diǎn)的從屬關(guān)系,,而總節(jié)點(diǎn)是沒有父節(jié)點(diǎn)的,其設(shè)定值為0,。如果需要設(shè)計(jì)多層的結(jié)構(gòu),,只需將當(dāng)前節(jié)點(diǎn)放在子節(jié)點(diǎn)一列,所從屬的節(jié)點(diǎn)放在父節(jié)點(diǎn)一列即可,。
    為了實(shí)現(xiàn)數(shù)據(jù)管理,,在數(shù)據(jù)庫中添加了目錄號(實(shí)際應(yīng)用中可以省略),如目錄號101的意義是:前面1代表名稱(節(jié)點(diǎn)1),,01是節(jié)點(diǎn)1的第1個子節(jié)點(diǎn),,102是節(jié)點(diǎn)1的第2個子節(jié)點(diǎn),這樣節(jié)點(diǎn)1下面可以排99個子節(jié)點(diǎn),,子節(jié)點(diǎn)的個數(shù)可以根據(jù)自己的要求定義,。
2.2 樹狀分層結(jié)構(gòu)的實(shí)現(xiàn)
    新建一個MFC[5]工程,在工程中創(chuàng)建一個對話框,;添加Tree Control控件,,控件屬性Styles中勾選Has buttons、Has lines、lines at root,;通過ADO[6]連接圖3(a)所示的數(shù)據(jù)庫表,,將數(shù)據(jù)信息添加到控件中;根據(jù)節(jié)點(diǎn)在數(shù)據(jù)庫中的排列編寫相關(guān)的函數(shù),,部分代碼如下:
     tvInsert.item.pszText = _T("總節(jié)點(diǎn)");       //添加總節(jié)點(diǎn)
     hParent = m_ctrlTree.InsertItem(&tvInsert);
     TreeAddSubTree("總節(jié)點(diǎn)","1",hParent);    //添加子節(jié)點(diǎn)
  m_ctrlTree.Expand(hParent,TVE_EXPAND);     //展開節(jié)點(diǎn)
    樹狀結(jié)構(gòu)的界面如圖3(b)所示,。
3 故障節(jié)點(diǎn)管理和消息響應(yīng)的實(shí)現(xiàn)
3.1 故障節(jié)點(diǎn)管理

    故障節(jié)點(diǎn)管理即信息管理。筆者已在Access數(shù)據(jù)庫中實(shí)現(xiàn)了樹狀分層結(jié)構(gòu),,每一個節(jié)點(diǎn)就是一條故障信息,,實(shí)現(xiàn)故障信息的管理即是實(shí)現(xiàn)對節(jié)點(diǎn)的添加、刪除,、修改等操作,。
   以Access數(shù)據(jù)庫表的每行數(shù)據(jù)(一個節(jié)點(diǎn))為出發(fā)點(diǎn),對每行數(shù)據(jù)進(jìn)行相關(guān)操作,。直接采用ODBC [7]對數(shù)據(jù)庫訪問,,在VC對話框里面添加相關(guān)的控件;將數(shù)據(jù)庫的信息映射到List Control控件中,編寫修改,、添加,、刪除、清空等函數(shù),,其中圖片信息界面如圖4所示,。通過目錄號來實(shí)現(xiàn)對信息的檢索。

3.2 節(jié)點(diǎn)消息響應(yīng)
    節(jié)點(diǎn)的消息響應(yīng)是通過節(jié)點(diǎn)提取故障信息,,采用路徑的方法來實(shí)現(xiàn),。在樹狀結(jié)構(gòu)的基礎(chǔ)上,通過VC6.0編譯器的對話框添加Picture組件,,Picture控件屬性中:General→Type→選擇Bitmap,,Styles中勾選Center image,在點(diǎn)擊 (OnClick)和改變選擇項(xiàng)(SelchangedTree)事件中編寫圖片信息顯示,、圖片路徑調(diào)用等相關(guān)程序,。當(dāng)點(diǎn)擊樹狀結(jié)構(gòu)節(jié)點(diǎn)時,程序訪問Access數(shù)據(jù)庫中路徑,,并將圖片信息顯示在Picture控件中,。如圖5所示,左邊為樹狀結(jié)構(gòu),,右邊為故障圖片信息,。視頻信息顯示的方法與圖片信息的方法相同,只需將Picture控件用Media Player控件替換。調(diào)用圖片信息部分程序代碼如下:

 

 

    hwnd = GetDlgItem(IDC_BITMAP);
              //指定對話框控件句柄
    hDesDC = hwnd->GetDC()->m_hDC;
    hSrcDC = CreateCompatibleDC(hDesDC);
    hBitmap=(HBITMAP)LoadImage(AfxGetInstanceHandle(),
        strFieldValue,IMAGE_BITMAP,0,0,LR_LOADFROM
        FILE|LR_CREATEDIBSECTION);  //顯示位圖
    GetObject(hBitmap, sizeof BITMAP, &bm);
    //得到指定圖像信息
    SelectObject(hSrcDC, hBitmap);     //復(fù)原位圖數(shù)據(jù)
    hwnd->GetClientRect(&rect);   //獲取窗口客戶坐標(biāo)
    ::SetStretchBltMode(hDesDC,COLORONCOLOR);   
                                    //指定伸拉模式
    ::StretchBlt(hDesDC, rect.left, rect.top, rect.right, rect.
        bottom, hSrcDC, 0, 0, bm.bmWidth, bm.bmHeight,
        +SRCCOPY);                     //將位圖載入目標(biāo)區(qū)域
    SetTimer(IDT_TIMER,50,NULL);
3.3 系統(tǒng)管理
    系統(tǒng)管理實(shí)現(xiàn)三個功能:用戶管理,、數(shù)據(jù)導(dǎo)入,、數(shù)據(jù)備份,。
    用戶管理包括超級用戶和普通用戶。超級用戶具有添加,、修改、刪除普通用戶和操作某些系統(tǒng)功能的權(quán)限,。本文采用一種有效的方法,,即將采集到的用戶名與數(shù)據(jù)庫中的user_name對比來實(shí)現(xiàn)。通過建立兩張相同的Access數(shù)據(jù)庫表——超級用戶表和普通用戶表,,在程序內(nèi)部定義一個字符串?dāng)?shù)組,,編寫好字符比較函數(shù)[8],當(dāng)用戶登錄時,,用戶名被采集放在數(shù)組中,,再將數(shù)組中的用戶名與Access數(shù)據(jù)庫表中的user_name比較,如果采集的字符串與超級用戶表中的user_name相同,,則為超級用戶,;否則為普通用戶。數(shù)據(jù)導(dǎo)入,、導(dǎo)出即調(diào)用system("copy Database.mdb X:\\Database.mdb")函數(shù),。
4 結(jié)果與分析
    為了驗(yàn)證故障專家?guī)煜到y(tǒng)的可行性,本文通過系統(tǒng)管理界面對樹狀結(jié)構(gòu)的節(jié)點(diǎn)進(jìn)行添加,、刪除,、修改等調(diào)試;建立Access數(shù)據(jù)庫表,存放文字,、圖片,、視頻等故障信息,并通過節(jié)點(diǎn)的消息響應(yīng)對信息進(jìn)行讀取,。系統(tǒng)在重新啟動后,,節(jié)點(diǎn)信息沒有丟失;單擊樹狀結(jié)構(gòu)的節(jié)點(diǎn),,顯示其相應(yīng)的故障信息,,進(jìn)而實(shí)現(xiàn)數(shù)據(jù)的有效存儲,以及節(jié)點(diǎn)的文本,、圖片,、視頻等故障信息的提取。經(jīng)過測試,,該專家系統(tǒng)在Microsoft XP,、Win7系統(tǒng)下運(yùn)行穩(wěn)定, 并可根據(jù)需要進(jìn)行功能擴(kuò)展,。人機(jī)交互界面如圖6所示,。

    本文以Visual C++6.0為開發(fā)平臺,,采用Access2003數(shù)據(jù)庫構(gòu)建樹狀結(jié)構(gòu),運(yùn)用樹狀結(jié)構(gòu)中的節(jié)點(diǎn)管理和消息提取,,并結(jié)合工業(yè)設(shè)備的故障現(xiàn)象,、故障原因、故障排除原理以及維修人員的經(jīng)驗(yàn)建立了具有文本,、圖片,、 視頻數(shù)據(jù)的Access知識庫,開發(fā)出故障維修專家?guī)煜到y(tǒng),。實(shí)際應(yīng)用表明,,該系統(tǒng)提高了設(shè)備維護(hù)人員的工作效率、極大地降低了人力成本,為設(shè)備維護(hù)與故障排除提供了重要參考和指導(dǎo),。
參考文獻(xiàn)
[1] 孫鑫,,余安萍.VC++深入詳解[M]. 北京:電子工業(yè)出版社,2006.
[2] 潛繼成. 樹狀結(jié)構(gòu)數(shù)據(jù)管理[J].電腦編程技術(shù)與維護(hù),2010(17):14-15,。
[3] 李俊民,,高春燕. Access數(shù)據(jù)庫開發(fā)實(shí)例解析[M].北京:機(jī)械工業(yè)出版社,2006.
[4] Xu Fengyuan.按數(shù)據(jù)庫記錄構(gòu)建樹控[EB/OL]. (2002-12-01).http://www.vckbase.com/document/viewdoc/?id=466.
[5] 曾凡峰,,苗雨.MFC編程技巧與范例詳解[M].北京:清華大學(xué)出版社,,2008.
[6] 劉銳寧,宋坤. Visual C++ 程序設(shè)計(jì)標(biāo)準(zhǔn)教程[M].北京:人民郵電出版社,,2009.
[7] 任哲.MFC Windows 應(yīng)用程序設(shè)計(jì)[M]. 北京:清華大學(xué)出版社,,2004.
[8] 譚浩強(qiáng).C++程序設(shè)計(jì)實(shí)踐指導(dǎo)[M]. 北京:清華大學(xué)出版社,2005.

此內(nèi)容為AET網(wǎng)站原創(chuàng),,未經(jīng)授權(quán)禁止轉(zhuǎn)載,。