電機(jī)上位機(jī)控制及界面設(shè)計(jì)_第1頁
電機(jī)上位機(jī)控制及界面設(shè)計(jì)_第2頁
電機(jī)上位機(jī)控制及界面設(shè)計(jì)_第3頁
電機(jī)上位機(jī)控制及界面設(shè)計(jì)_第4頁
電機(jī)上位機(jī)控制及界面設(shè)計(jì)_第5頁
已閱讀5頁,還剩32頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、電機(jī)上位機(jī)控制及界面設(shè)計(jì) 吳牛俊(自動化與電氣工程學(xué)院 指導(dǎo)教師:周克寧)摘要:隨著計(jì)算機(jī)、電子、通訊技術(shù)的飛速發(fā)展,人們對于車間現(xiàn)場設(shè)備的運(yùn)行管理控制,可視化操作等綜合水平提出了新的要求。為了滿足這新的要求,本畢業(yè)設(shè)計(jì)本著“不在現(xiàn)場,遠(yuǎn)離現(xiàn)場”的原則,以C語言作為開發(fā)語言,VC為開發(fā)環(huán)境,針對某充電機(jī)產(chǎn)品編寫了應(yīng)用程序,將充電機(jī)的現(xiàn)場設(shè)備界面通過串口通信技術(shù),與上位機(jī)界面有機(jī)的結(jié)合起來,以實(shí)現(xiàn)計(jì)算機(jī)的遠(yuǎn)程監(jiān)控功能。此外,該上位機(jī)應(yīng)用軟件還實(shí)現(xiàn)了查看充電機(jī)存儲在U盤中的運(yùn)行記錄文件的功能。在本畢業(yè)論文通過這個項(xiàng)目的開發(fā)過程,闡述了編程環(huán)境的選擇,串口通訊實(shí)現(xiàn)遠(yuǎn)程測試的方法,通過文件操作讀取U盤

2、數(shù)據(jù)的技巧。探討如何在PC平臺與工控機(jī)平臺間建立遠(yuǎn)程測試和歷史數(shù)據(jù)讀取和分析的一般方法。關(guān)鍵詞:人機(jī)界面;串口通信;Visual C+6.0;文件操作Abstract:With the development of computer, electronics, communications technology, the people are requiring that the the operation and management of the equipment control,and the Visualization operation must develop too.To me

3、et these new requirements, the design of the graduates base on that "not on the scene, the scene away from the principle of" and use the C language and VC environment programming the charger procedures. The design uses the communications technology to put the charger field equipment interf

4、ace and PC interface combination.And it can be achieved RMON. In addition, the PC application software also can view the test records stored in the U disk.This paper through the project development process describes the following points.First is The choice of programming environments.Second is Seria

5、l Communication remote test method.Third is the skills of reading the test records stored in the U disk.Discussion on general methods that through the PC platform with the establishment of industrial computer platform for remote testing and reading historical data and analysisKeywords:Human-machine

6、interface; Serial Communication;;Visual C+6.0;File 1 緒 論1.1 背 景隨著計(jì)算機(jī)、電子、通訊技術(shù)的飛速發(fā)展,人們對于車間現(xiàn)場設(shè)備的運(yùn)行管理控制,可視化操作等綜合水平提出了新的要求。隨著計(jì)算機(jī)的運(yùn)算速度不斷升級功能日漸強(qiáng)大,在車間現(xiàn)場測控中扮演了越來越重要的角色。利用計(jì)算機(jī)軟件通過運(yùn)用先進(jìn)的通訊技術(shù)監(jiān)控遠(yuǎn)程現(xiàn)場設(shè)備的運(yùn)行狀況和運(yùn)行參數(shù)。這將大大提高生產(chǎn)效率,保證生產(chǎn)安全。出于節(jié)省人工,提高效率或者安全生產(chǎn)方面的考慮很多環(huán)節(jié)需要遠(yuǎn)程監(jiān)控車間設(shè)備的運(yùn)行情況,這就離不開通訊技術(shù)的應(yīng)用。這里所說的通信是只計(jì)算機(jī)與遠(yuǎn)程設(shè)備之間的信息交換。由于串行通信

7、是在一根傳輸線上一位一位的傳送信息,所用的傳輸線少,并且可以借助現(xiàn)成的電話網(wǎng)進(jìn)行信息傳送,因此,特別適合于遠(yuǎn)距離傳輸。對于那些與計(jì)算機(jī)相距不遠(yuǎn)的人機(jī)交換設(shè)備和串行存儲的外部設(shè)備如終端、打印機(jī)、邏輯分析儀、磁盤等,采用串行方式交換數(shù)據(jù)也很普遍。同時,隨著人們對車間現(xiàn)場設(shè)備智能化的要求的提高,越來越多的設(shè)備采用了外存儲器對生產(chǎn)測試過程中的數(shù)據(jù)進(jìn)行存儲,監(jiān)控人員通過定期對存儲了歷史數(shù)據(jù)記錄的分析,可以清楚得了解到設(shè)備的動態(tài)運(yùn)行情況,這些數(shù)據(jù)對設(shè)備排錯和參數(shù)設(shè)置提供依據(jù)都有很高的價值。隨著PC端USB接口技術(shù)的普及,以U盤作為設(shè)備外存儲器存儲運(yùn)行數(shù)據(jù),具有實(shí)現(xiàn)簡單,讀取方便的特點(diǎn),應(yīng)用也越來越廣泛。如

8、何高效,方便的通過最常用的PC機(jī)來讀取設(shè)備外存儲器中的數(shù)據(jù),為數(shù)據(jù)的快速分析提供了保證。因此研究計(jì)算機(jī)通過串行通信對遠(yuǎn)程車間設(shè)備的監(jiān)控,讀取U盤歷史數(shù)據(jù)文件并顯示具有一定的現(xiàn)實(shí)意義。1.2 任務(wù)和目標(biāo)本畢業(yè)設(shè)計(jì)本著“不在現(xiàn)場,遠(yuǎn)離現(xiàn)場”的原則,為導(dǎo)師研制的某型號充電機(jī)產(chǎn)品編寫PC端應(yīng)用程序?qū)⒊潆姍C(jī)設(shè)備界面通過串口通信技術(shù),與上位機(jī)界面有機(jī)的結(jié)合起來,以實(shí)現(xiàn)計(jì)算機(jī)的遠(yuǎn)程監(jiān)控功能。按要求在上位機(jī)中打開并查看充電機(jī)設(shè)備運(yùn)行過程中的存儲在U盤中的歷史數(shù)據(jù)文件,以便于分析測試。另外還要編寫下位機(jī)微型打印機(jī)數(shù)據(jù)打印程序,為用戶提供多種查看選擇。我在認(rèn)真分析以上設(shè)計(jì)要求之后,以C語言作為開發(fā)語言,VC為開發(fā)

9、環(huán)境,在MFC框架上編寫完成一個應(yīng)用程序。這個應(yīng)用程序采用MSCOMM控件來實(shí)現(xiàn)串口通訊,以C語言文件操作實(shí)現(xiàn)U盤歷史數(shù)據(jù)文件的讀寫和顯示操作。并且在此基礎(chǔ)上,我還對上位機(jī)軟件的界面進(jìn)行了美化和優(yōu)化,還添加了現(xiàn)場測試數(shù)據(jù)自動生成WORD文檔,使得軟件更人性化和操作更簡單。在本畢業(yè)論文通過這個項(xiàng)目的開發(fā)過程,闡述了編程環(huán)境的選擇,串口通訊實(shí)現(xiàn)遠(yuǎn)程測試的方法,通過文件操作讀取U盤數(shù)據(jù)的技巧。探討如何在PC平臺與工控機(jī)平臺間建立遠(yuǎn)程測試和歷史數(shù)據(jù)讀取和分析的一般方法。2 總體設(shè)計(jì)方案2.1 系統(tǒng)總體結(jié)構(gòu)系統(tǒng)總體結(jié)構(gòu)如下圖所示,下位機(jī)是一臺試用在變電所等電力部門的充電機(jī)設(shè)備,采用工控機(jī)作為核心處理器。

10、PC機(jī)端的應(yīng)用程序通過RS232串口與設(shè)備實(shí)現(xiàn)通訊。充電機(jī)設(shè)備帶有USB接口,用于接入U盤存儲充電機(jī)歷史數(shù)據(jù)。當(dāng)用戶需要查看歷史記錄數(shù)據(jù)時,將U盤從設(shè)備中拔下,接入PC端可以利用應(yīng)用程序通過文件操作打開查看。圖1. 系統(tǒng)總體結(jié)構(gòu)圖另外,該充電機(jī)設(shè)備通過工控機(jī)打印口連接一臺微型打印機(jī)用于運(yùn)行參數(shù)和測試數(shù)據(jù)的即時打印,供用戶查看。2.2 上位機(jī)用戶操作界面結(jié)構(gòu) 圖2. 軟件組織結(jié)構(gòu)3 上位機(jī)用戶操作界面的建立3.1 編程語言及編程環(huán)境3.1.1 C+語言介紹C+是脫胎自C語言的一種中級語言。從計(jì)算機(jī)角度看, 它可以嵌入ASM等低端語言; 從面向?qū)ο蟮某绦蛟O(shè)計(jì)角度看, 它有具備OOP的三個基本特征抽

11、象, 封裝和繼承。C語言是結(jié)構(gòu)化和模塊化的語言,它是面向過程的。C+保留了C語言原有的所有優(yōu)點(diǎn),增加了面向?qū)ο蟮臋C(jī)制。C+與C完全兼容。C+是對C的擴(kuò)充,是C的超集。它既可用于結(jié)構(gòu)化程序設(shè)計(jì),又可用于面向?qū)ο蟮某绦蛟O(shè)計(jì),功能強(qiáng)大。C+性能良好,因?yàn)樗痪幾g為機(jī)器代碼。對于VBScript和Java等語言,代碼在運(yùn)行時由程序解釋,而且每次運(yùn)行程序時都要將代碼轉(zhuǎn)換為機(jī)器碼,這樣做效率比較低,不僅僅是已編譯過的C+程序運(yùn)行得較快,而且微軟C+編譯器已存在多年。這意味著微軟的編譯器程序員已經(jīng)把許多優(yōu)點(diǎn)集中到編譯器上,以致于它能產(chǎn)生非常高效的機(jī)器碼。因?yàn)镃+是編譯語言,而且非常自然,比VB更接近機(jī)器代碼

12、,所以由C+編譯器產(chǎn)生的代碼一定比VB的編譯代碼效率更高。C+是一種編譯語言,即C+代碼在執(zhí)行之前已轉(zhuǎn)換為機(jī)器碼。只要此代碼不依賴于外部的動態(tài)鏈接庫(DLL),C+就可以在不需要安裝額外程序的情況下移動到運(yùn)行同樣操作系統(tǒng)的其他機(jī)器和微處理器上,而移動Java程序時需要先安裝Java運(yùn)行期庫。因此,使用C+語言相比其他語言具有最小的依賴性由于C和C+已經(jīng)存在許多年了,現(xiàn)在有許多可利用的代碼,我們的服務(wù)器組件可以使用現(xiàn)有的C/C+代碼或庫。鑒于上述特點(diǎn),我在本設(shè)計(jì)中選擇C+作為主要編程語言。3.3.2 Visual C+6.0編程環(huán)境介紹本次設(shè)計(jì)中使用的Visual C+6.0是一個基于C+語言,

13、基于Windows操作系統(tǒng)的功能強(qiáng)大的可視化軟件開發(fā)工具。這不僅表現(xiàn)出在應(yīng)用程序界面編輯和代碼的編寫中,還表現(xiàn)為數(shù)據(jù)處理上的高可視化和高面向?qū)ο笮?。Visual C+6.0不僅是一個C+編譯器,而且是一個基于Windows操作系統(tǒng)的可視化集成開發(fā)環(huán)境(integrated development environment,IDE)。它由許多組件組成,包括編輯器、調(diào)試器以及程序向?qū)ppWizard、類向?qū)lass Wizard等開發(fā)工具。 這些組件通過一個名為Developer Studio的組件集成為和諧的開發(fā)環(huán)境。另外,Visual C+6.0還提供了一個"無所不包"的

14、應(yīng)用框架MFC,并且可以非常方便的使用MSCcomm控件進(jìn)行串口編程。使用Visual C+6.0的向?qū)Э梢陨纱罅康氖褂么a,而不必人工地編寫代碼。從編寫程序的難易程度和程序的性能綜合考慮,這些特點(diǎn)完全能夠滿足我在本次課題設(shè)計(jì)中的各種需求。3.3.3 MFC程序框架介紹MFC就是一個程序的框架。這個框架定義了應(yīng)用程序的輪廓,并提供了用戶接口的標(biāo)準(zhǔn)實(shí)現(xiàn)方法。使用者只要通過預(yù)定義的接口把具體應(yīng)用程序特有的東西填入這個輪廓就可以了。在它基礎(chǔ)上來建立Windows下的應(yīng)用程序,相對SDK來說更為簡單。Visual C+6.0提供了相應(yīng)的工具來完成這個工作:AppWizard可以用來生成初步的框架文件

15、(代碼和資源等);資源編輯器用于幫助直觀地設(shè)計(jì)用戶接口; ClassWizard用來協(xié)助添加代碼到框架文件;最后,編譯,則通過類庫實(shí)現(xiàn)了應(yīng)用程序特定的邏輯。在本設(shè)計(jì)中要求通過編寫代碼來建立必要的用戶界面,控制并定制其外觀。同時還要響應(yīng)用戶的操作行為。例如,如果用戶單擊了現(xiàn)場測試按鈕,就需要有代碼來響應(yīng)這一動作。而使用MFC框架,則會自動添按鈕的響應(yīng)消息,只需在對應(yīng)位置添加事件處理動作就能完成控制任務(wù)。為此采用了Visual C+6.0的MFC單文檔程序框架作為上位機(jī)軟件的基本框架。3.4 基本界面的建立3.4.1單文檔一個典型的應(yīng)用程序應(yīng)該活動在稱為“框架窗口”中。一個框架窗口是一個全功能的主

16、窗口,用戶可以改變尺寸、最小化、最大化等。本設(shè)計(jì)方案中主要涉及單文檔窗口,和對話框窗口。整個上位機(jī)界面的底層是單文檔,而上層使用的使對話框,并在對話框上添加主要控件,從而構(gòu)成了完整的界面外觀。圖3. 單文檔結(jié)構(gòu)圖使用MFC的向?qū)Ъ纯缮扇缟纤镜膯挝臋n窗口。這是整個界面的基礎(chǔ)框架部分。3.4.1對話框在基礎(chǔ)的單文檔框架上面添加了兩個無(標(biāo)題欄)對話框?qū)挝臋n窗體分為兩部分。上一部Dialog1分為工具條按鈕,下一部分Dialog2為具體功能顯示區(qū)。此兩部分窗口均為非模態(tài)化對話框。首先在資源里插入新建對話框,修改其屬性;然后添加相應(yīng)的類,如CUDiskDlg;再使用以下代碼分別創(chuàng)建模態(tài)化對話框和

17、非模態(tài)化對話框。CUDiskDlg m_CUDiskDlg;/定義對象m_UDHisDlg.Create(IDD_UDISKHIS,this);/創(chuàng)建非模態(tài)化對話框m_UDHisDlg.ShowWindow(TRUE);/顯示對話框m_UDHisDlg.DoModal();/創(chuàng)建模態(tài)化對話框3.4.1控件介紹Button控件:Button控件是按鈕控件,可以響應(yīng)單擊(BN_KLICKED)和雙擊(BN_DUBLEKLICKED)事件。其使用方法是:在資源標(biāo)簽的相應(yīng)窗體下,從Controls對話框中將Button控件拖至對話框的相應(yīng)位置,修改屬性及ID號后,在其對應(yīng)的事件處理函數(shù)中添加事件代碼即

18、可。在本設(shè)計(jì)中使用頗多,如U盤歷史數(shù)據(jù)查詢按鈕,現(xiàn)場測試按鈕等。Edit控件:Edit控件是文本編輯控件,在本設(shè)計(jì)中主要用于U盤查詢界面中詳細(xì)數(shù)據(jù)的參數(shù)顯示,和現(xiàn)場測試中參數(shù)設(shè)置部分的數(shù)據(jù)輸入和測試結(jié)果表格中的數(shù)據(jù)顯示及測試結(jié)論、處理意見的輸入。將Edit控件在類向?qū)е信c一變量(如m_edit8)以value的形式相關(guān)聯(lián)。當(dāng)用于數(shù)據(jù)顯示時,使用語句m_edit8 =str;將值賦予變量m_edit8,再用語句UpdateData(FALSE);將變量內(nèi)容顯示。當(dāng)用于數(shù)據(jù)輸入時,應(yīng)用語句UpdateData(TRUE);將控件中的數(shù)據(jù)讀入賦予相關(guān)變量。ListContrl控件:ListContr

19、l控件主要用于顯示列表式的數(shù)據(jù)顯示。在本設(shè)計(jì)中,歷史信息,詳細(xì)數(shù)據(jù),現(xiàn)場測試數(shù)據(jù)的顯示均使用了ListContrl控件。該控件使用前需進(jìn)行風(fēng)格設(shè)置。即通過以下語句獲得原有風(fēng)格:DWORD dwStyle = :GetWindowLong(m_listctrl.m_hWnd, GWL_STYLE);dwStyle &= (LVS_TYPEMASK); dwStyle &= (LVS_EDITLABELS);通過以下語句置新風(fēng)格:SetWindowLong(m_listctrl.m_hWnd, GWL_STYLE,dwStyle,|LVS_REPORT|LVS_NOLABELWRA

20、P|LVS_SHOWSELALWAYS); 通過以下語句設(shè)置擴(kuò)展風(fēng)格DWORD styles =LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES|LVS_EX_CHECKBOXES; ListView_SetExtendedListViewStyleEx(m_listctrl.m_hWnd, styles,styles );。進(jìn)行風(fēng)格設(shè)置后,先插入列頭,后才可以逐行添加數(shù)據(jù)信息。插入列頭時,應(yīng)用InsertColum方法,而逐行添加信息時,第一列的信息應(yīng)該用InsertItem方法,而后幾列則應(yīng)用SetItem方法。ListContrl控件也可以響應(yīng)雙擊事件,其函數(shù)為

21、OnDblclkListHis(NMHDR* pNMHDR, LRESULT* pResult)。并且能獲得雙擊時鼠標(biāo)所在的Item號。由此來實(shí)現(xiàn)雙擊歷史信息記錄后,顯示對應(yīng)的詳細(xì)數(shù)據(jù)。Picture控件:Picture控件是一個靜態(tài)控件,用于插入圖片等功能。而圖片的插入,有靜態(tài)插入和動態(tài)插入兩種方法。靜態(tài)插入是指,直接在Picture控件屬性中,將將“類型”選項(xiàng)改為Bitmap,然后再在“圖像”選項(xiàng)中選擇合適的位圖即可。動態(tài)插入是指,在程序中定義HBITMAP類型變量m_Brown_h1,用語句m_Brown_h1=:LoadBitmap(AfxGetInstanceHandle(),MAK

22、EINTRESOURCE(IDB_BROWN_H1)將變量m_Brown_h1與位圖資源IDB_BROWN_H1關(guān)聯(lián)起來。然后再將Picture控件與變量m_h1關(guān)聯(lián),再通過語句m_h1.SetBitmap(m_Blue_h1);就可以將圖片動態(tài)插入。3.5 歷史數(shù)據(jù)察看功能3.5.1歷史數(shù)據(jù)察看功能介紹歷史數(shù)據(jù)察看功能主要是用于察看直接通過下位機(jī),以文件形式存儲在USB可移動存儲設(shè)備上的歷史檢測數(shù)據(jù)紀(jì)錄的。該紀(jì)錄由歷史信息和歷史信息對應(yīng)的詳細(xì)數(shù)據(jù)信息兩部分。每條歷史信息包括序號、日期、時間、整定電壓(在放電測試項(xiàng)目中無該紀(jì)錄)、整定電流、已放容量(只在放電測試項(xiàng)目中有該紀(jì)錄)五項(xiàng)內(nèi)容;每條歷

23、史信息對應(yīng)得詳細(xì)數(shù)據(jù)信息有各自不同的幾項(xiàng)內(nèi)容。各項(xiàng)測試的詳細(xì)數(shù)據(jù)信息如下:放電參數(shù)測試包括序號、時、分、端電壓、放電電流五項(xiàng);電壓穩(wěn)定精度測試包括輸入電壓、電壓最大值、電壓最小值、穩(wěn)壓精度、紋波系數(shù)五項(xiàng);電流穩(wěn)定精度測試包括輸入電壓最大值、電流最大值、電流最小值、穩(wěn)流精度四項(xiàng);限流特性測試包括輸入電壓、-10%、100%、+10%、穩(wěn)流精度五項(xiàng)。在用戶進(jìn)入該程序后,單擊U盤歷史查詢按鈕就會進(jìn)入歷史數(shù)據(jù)察看狀態(tài)。按下各測試項(xiàng)目選擇按鈕,則進(jìn)入不同的測試項(xiàng)目歷史紀(jì)錄查詢狀態(tài)。對應(yīng)的歷史信息就立刻顯示在List中。雙擊List條目,則將對應(yīng)的詳細(xì)數(shù)據(jù)信息顯示在List中,其參數(shù)也將顯示在對應(yīng)位置。

24、圖4. 歷史數(shù)據(jù)查詢界面3.5.2歷史數(shù)據(jù)察看功能實(shí)現(xiàn)的方法3.5.2.1盤符的確定由于每臺PC的盤符劃分不同,USB移動存儲設(shè)備連接后所在的盤符也將不同。而對文件的操作必須指定明確的文件路徑,方能正確的打開文件,讀取數(shù)據(jù)。因此,如何確定USB移動存儲設(shè)備的盤符是必須解決的問題。在本設(shè)計(jì)中,我采用了添加配置文件方式來解決該問題。即在可執(zhí)行程序的根目錄下添加一可讀寫的文件,用于保存指定的盤符。當(dāng)用戶在某一PC機(jī)上第一次使用本軟件時,將提示配置USB可移動存儲設(shè)備盤符。當(dāng)用戶輸入該P(yáng)C機(jī)上USB可移動存儲設(shè)備所在盤符,并按配置按鈕后,盤符信息將寫入配置文件,并一直保存至下一次配置前。按下推出按鈕,

25、則向主框架發(fā)出消息,要求其重新創(chuàng)建歷史數(shù)據(jù)察看功能對話框,在對話框的初始化中重新裝載配置文件,讀入正確的盤符。其中配置文件的裝載,采用函數(shù)GetCurrentDirectory(dirlen,sDir)獲得可執(zhí)行文件的根目錄,再用函數(shù)strcat(sDir,"con_set.ini")生成完整的配置文件路徑。 圖5. 第一次配置文件界面生成配置文件代碼如下:UpdateData();if(m_usb.GetLength()>0&&m_usb.GetLength()<2)&&(m_com.GetLength()>0)&

26、&m_com.GetLength()<2)FILE* fp;fp=fopen("con_set.ini","wb");char Disk,Com;Disk=m_usb.GetAt(0);Com=m_com.GetAt(0);fputc(Disk,fp);fputc(Com,fp);fclose(fp);MessageBox("配置成功!");elseMessageBox("輸入的參數(shù)格式錯誤,無法配置!");配置文件的裝載代碼如下:FilePath="C:FHIST"FilePat

27、h.SetAt(0,Disk);l=FilePath.GetLength();FileName=FileName_tmp;for(r=0;r<l;r+)*(FileName+r)=FilePath.GetAt (r);*(FileName+l)=NULL;/打開文件并判斷文件是否打開成功if(fp=fopen(FileName,"rb")=NULL)MessageBox("文件不存在,請檢查文件位置并重新配置");return;3.5.2.2歷史數(shù)據(jù)及對應(yīng)的詳細(xì)數(shù)據(jù)的讀取和顯示歷史紀(jì)錄在USB移動存儲設(shè)備中以文件的形式存儲。各項(xiàng)歷史信息和詳細(xì)數(shù)據(jù)信

28、息對應(yīng)的文件名如下圖:檢測項(xiàng)目歷史信息文件名詳細(xì)數(shù)據(jù)文件名放電測試FHISTVDATA電壓穩(wěn)定精度測試UHISTUDATA電流穩(wěn)定精度測試IHISTIDATA效率測試EHISTEDATA限流特性測試XHISTXDATA圖6. 各項(xiàng)歷史信息和詳細(xì)數(shù)據(jù)信息實(shí)現(xiàn)歷史信息的讀取,首先從配置文件中讀入盤符,獲取到對應(yīng)歷史信息的文件路徑,以二進(jìn)制流形式打開對應(yīng)文件,讀取歷史信息條數(shù)(即第一個二進(jìn)制數(shù)據(jù))到int變量mark中。由于下位是16位操作系統(tǒng),一個int型占16位,而上位機(jī)是32位操作系統(tǒng),一個int型占32位,一個short int型占16位。由文件存儲格式可知,實(shí)際的標(biāo)志位為16位數(shù),因此需將

29、讀取的二進(jìn)制數(shù)強(qiáng)制轉(zhuǎn)換為short int 型數(shù)據(jù)。然后根據(jù)各項(xiàng)歷史信息數(shù)據(jù)的存儲格式,移動指針,依次讀取一條數(shù)據(jù)到數(shù)組data_tmp7中,共讀取mark次。移動指針讀取數(shù)據(jù)到數(shù)組data_tmp7中的代碼如下:fseek(fp,(2+i*7*4),SEEK_SET);/移動指針到相應(yīng)位置fread(data_tmp,4,7,fp);/詳細(xì)數(shù)據(jù)的讀取是當(dāng)鼠標(biāo)雙擊list1控件的某一條歷史信息時,將響應(yīng)list1控件的雙擊事件,進(jìn)入的其響應(yīng)函數(shù)。在該函數(shù)中,通過switch語句判斷該條歷史信息所屬的測試項(xiàng)目,并由此打開相應(yīng)的詳細(xì)數(shù)據(jù)文件。當(dāng)雙擊list1控件的某一條歷史信息時,nItem=m_

30、listctrl.GetNextItem(-1, LVNI_FOCUSED);將獲取該行索引值,即該條歷史信息在全部信息中排列的序號。根據(jù)此及對應(yīng)測試項(xiàng)詳細(xì)數(shù)據(jù)存儲格式,可計(jì)算出該條歷史信息所對應(yīng)得詳細(xì)數(shù)據(jù)的第一個數(shù)據(jù)的指針。然后移動指針,讀取該詳細(xì)數(shù)據(jù)信息到數(shù)組tem。放電測試項(xiàng)詳細(xì)數(shù)據(jù)讀取時移動指針,讀取數(shù)據(jù)到數(shù)組data_tmp7中的代碼如下:fseek(fp,(2+nItem*1240),SEEK_SET);/移動指針到對應(yīng)日期 的數(shù)據(jù)存儲位置fread(data,4,310,fp);/讀取數(shù)據(jù)流到tem,float *data 的指向tem的首地址歷史信息和對應(yīng)的詳細(xì)數(shù)據(jù)的顯示,主要

31、是edit控件的顯示和listContrl控件的信息插入。以放電測試為例,歷史信息數(shù)據(jù)顯示的主要代碼如下:for(i=0;i<mark;i+)/插入數(shù)據(jù)fseek(fp,(2+i*7*4),SEEK_SET);/移動指針到相應(yīng)位置fread(data_tmp,4,7,fp);rewind(fp);itIndex=m_list_his.GetItemCount();LV_ITEM lvitem;lvitem.mask=LVIF_TEXT;lvitem.iItem=itIndex;lvitem.iSubItem=0;itoa(i+1),ch1,10);lvitem.pszText =ch1;

32、m_list_his.InsertItem(&lvitem);/日期str=""itoa(int)data_tmp0,ch1,10);str=str+ch1+"."itoa(int)data_tmp1,ch1,10);str=str+ch1+"."itoa(int)data_tmp2,ch1,10);str=str+ch1;int str_length;str_length=str.GetLength();char *str_data;char s_data15;str_data=s_data;for(j=0;j<str

33、_length;j+)*(str_data+j)=str.GetAt (j);*(str_data+str_length)=NULL;lvitem.pszText =str_data;lvitem.iSubItem=1;m_list_his.SetItem(&lvitem);/時間str=""if(data_tmp3>=10)itoa(int)data_tmp3,ch1,10);else itoa(int)data_tmp3,ch1,10);ch11=ch10;ch10='0'ch2='0'str=str+ch1+":

34、"if(data_tmp4>=10)itoa(int)data_tmp4,ch1,10);else itoa(int)data_tmp4,ch1,10);ch11=ch10;ch10='0'ch2='0'str=str+ch1+":"+"00"str_length=str.GetLength();char *str_time;char time_tem10;str_time=time_tem;for(j=0;j<str_length;j+)*(str_time+j)=str.GetAt (j);*(s

35、tr_time+str_length)=NULL;lvitem.pszText =str_time;lvitem.iSubItem=2;m_list_his.SetItem(&lvitem);/已放容量chang(data_tmp5*0.01,str_da,'h');lvitem.pszText =str_da;lvitem.iSubItem=3;m_list_his.SetItem(&lvitem);/整定電流chang_A(data_tmp6*0.01,str_da,'A');lvitem.pszText =str_da;lvitem.iSu

36、bItem=4;m_list_his.SetItem(&lvitem);以放電測試為例,詳細(xì)數(shù)據(jù)顯示的主要代碼如下:for(i=0;i<l_mark;i+)char *ch;char pch5;ch=pch;char *data_ch;char data_c7;data_ch=data_c;int itIndex=m_list_part.GetItemCount();LV_ITEM lvitem;lvitem.mask=LVIF_TEXT;/序號lvitem.iItem=itIndex;lvitem.iSubItem=0;data_ch=itoa(int)data7+i*6+0,

37、ch,10);lvitem.pszText =data_ch;m_list_part.InsertItem(&lvitem);/時lvitem.iItem=itIndex;lvitem.iSubItem=1;data_ch=itoa(int)data7+i*6+1,ch,10);lvitem.pszText =data_ch;m_list_part.SetItem(&lvitem);/分lvitem.iItem=itIndex;lvitem.iSubItem=2;data_ch=itoa(int)data7+i*6+2,ch,10);lvitem.pszText =data_c

38、h;m_list_part.SetItem(&lvitem);/端電壓lvitem.iItem=itIndex;lvitem.iSubItem=3;chang_V(data7+i*6+3*62.5,str_da,'V');lvitem.pszText =str_da;m_list_part.SetItem(&lvitem);/放電電流lvitem.iItem=itIndex;lvitem.iSubItem=4;chang_A(data7+i*6+4*10,str_da,'A');lvitem.pszText =str_da;m_list_part

39、.SetItem(&lvitem);ch0='0'/給字符串添上結(jié)束符data_ch0='0'/日期str=""itoa(int)data0,ch,10);str=str+ch+"."itoa(int)data1,ch,10);str=str+ch+"."itoa(int)data2,ch,10);str=str+ch;m_edit_u8 = str;/時間str=""if(data3>=10)itoa(int)data3,ch,10);else itoa(int)da

40、ta3,ch,10);ch1=ch0;ch0='0'ch2='0'str=str+ch+":"if(data4>=10)itoa(int)data4,ch,10);else itoa(int)data4,ch,10);ch1=ch0;ch0='0'ch2='0'str=str+ch+":"+"00"m_edit_u9 =str;/開始端電壓chang_V(data5*62.5,str_da,'V');m_edit_u10 =str_da;/整定放電電

41、流chang_A(data6*0.01,str_da,'A');m_edit_u11 =str_da;/已放容量chang(data7+i*6+5,str_da,'h');m_edit_u12 =str_da ;m_edit_u13 = _T("");m_edit_u14 = _T("");UpdateData(FALSE);3.4 現(xiàn)場測試功能隨著計(jì)算機(jī)、電子、通信技術(shù)的飛速發(fā)展,人們對于車間現(xiàn)場設(shè)備的運(yùn)行管理控制,可視化操作等綜合水平提出了新的要求。本設(shè)計(jì)中的現(xiàn)場測試功能就是本著“不在現(xiàn)場,遠(yuǎn)離現(xiàn)場”的原則,將充電機(jī)的

42、現(xiàn)場設(shè)備界面通過串口通信技術(shù),與上位機(jī)界面有機(jī)的結(jié)合起來,以實(shí)現(xiàn)計(jì)算機(jī)的遠(yuǎn)程監(jiān)控功能。該功能的使用,可實(shí)現(xiàn)在非車間場地,通過簡單、人性的操作界面,對充電機(jī)測試數(shù)據(jù)的進(jìn)行實(shí)時監(jiān)控以及歷史數(shù)據(jù)的準(zhǔn)確查詢,并且能在實(shí)際的生產(chǎn)任務(wù)中,最大限度的降低人工成本,提高生產(chǎn)效率,保證生產(chǎn)安全。3.4.1現(xiàn)場測試功能介紹本設(shè)計(jì)中的現(xiàn)場測試功能主要是指上位機(jī)和下位機(jī)間通過通信來實(shí)現(xiàn)上位機(jī)與下位機(jī)間的信息交換。將下位機(jī)檢測到的數(shù)據(jù)實(shí)時上傳給上位機(jī),并在界面中顯示,保存。由此實(shí)現(xiàn)在非車間場地,通過簡單、人性的操作界面,對充電機(jī)測試數(shù)據(jù)的進(jìn)行實(shí)時監(jiān)控。圖7. 現(xiàn)場測試功能界面(該圖需表出參數(shù)設(shè)置部分,表格部分)上圖為現(xiàn)

43、場測試功能界面。該界面能實(shí)現(xiàn)對五個測試項(xiàng)目的測試數(shù)據(jù)進(jìn)行實(shí)時監(jiān)測。要求監(jiān)測到的數(shù)據(jù)包括:放電參數(shù)測試包括序號、時、分、端電壓、放電電流五項(xiàng)及測試日期、測試時間、開始端電整定放電電流、已放容量等五個參數(shù);電壓穩(wěn)定精度測試包括輸入電壓、電壓最大值、電壓最小值、穩(wěn)壓精度、紋波系數(shù)五項(xiàng)及測試日期、測試時間、直流電壓、負(fù)載電流、整定電壓、交流電壓、紋波峰值等七個參數(shù);電流穩(wěn)定精度測試包括輸入電壓最大值、電流最大值、電流最小值、穩(wěn)流精度四項(xiàng)及測試日期、測試時間、直流電流、直流電壓、整定電流、交流電壓、計(jì)算整定電流等七個參數(shù);限流特性測試包括輸入電壓、-10%、100%、+10%、穩(wěn)流精度五項(xiàng)及測試日期、測

44、試時間、直流電壓值、交流電壓、限流整定值等5個參數(shù)。當(dāng)用戶按下現(xiàn)場測試按鈕后,由單文檔試圖創(chuàng)建并顯示一對話框,即現(xiàn)場測試界面。當(dāng)按下不同的現(xiàn)場測試項(xiàng)目按鈕后,通過標(biāo)志位flag_Face的置位及判斷,進(jìn)入到不同的現(xiàn)場測試狀態(tài)。如圖所示的參數(shù)設(shè)置圖位置可進(jìn)行各項(xiàng)測試的設(shè)備信息及參數(shù)設(shè)置。按下保存設(shè)置按鈕,設(shè)置被禁用,并且設(shè)置的內(nèi)容將被保存在測試結(jié)果表格中如圖所示的表格設(shè)置。保存設(shè)置后,按準(zhǔn)備測試按鈕,則打開串口,進(jìn)入通信等待狀態(tài)。一但下位機(jī)向上位機(jī)發(fā)送數(shù)據(jù),就會進(jìn)入通信狀態(tài),根據(jù)預(yù)先定義的協(xié)議,進(jìn)行數(shù)據(jù)通信。若要停止接收數(shù)據(jù),則需按下停止接收數(shù)據(jù)按鈕,即關(guān)閉串口。測試結(jié)束后,可在Edit1,Ed

45、it2中輸入相應(yīng)的測試論和意見。按保存按鈕,則可以將測試結(jié)果導(dǎo)入word中,并保存下來。各按鈕功能及相關(guān)變量如下表:按鈕名稱按鈕功能相關(guān)變量放電測試進(jìn)入放電測試功能flag_Face=1電壓穩(wěn)定精度測試進(jìn)入電壓穩(wěn)定精度測試功能flag_Face=2電流穩(wěn)定精度測試進(jìn)入電流穩(wěn)定精度測試功能flag_Face=3充電機(jī)效率測試進(jìn)入充電機(jī)效率測試功能flag_Face=4限流特性測試進(jìn)入限流特性測試功能flag_Face=5保存設(shè)置參數(shù)設(shè)置禁用,將設(shè)置內(nèi)容保存在測試結(jié)果表格中flag_IfParSave=1修改設(shè)置參數(shù)設(shè)置可用flag_IfParSave=0準(zhǔn)備測試判斷設(shè)置是否保存,若已保存則打開串

46、口無停止接收數(shù)據(jù)若串口打開,則關(guān)閉串口無保存結(jié)果根據(jù)標(biāo)志位flag_nFormWord的值,將測試結(jié)果導(dǎo)入對應(yīng)word中無返回隱藏現(xiàn)場測試界面,顯示信息輸入界面無圖8. 各按鈕功能及相關(guān)變量3.4.2串行通信的建立及基本參數(shù)的設(shè)定所謂“串行通信”是指外設(shè)和計(jì)算機(jī)間使用一根數(shù)據(jù)信號線(另外需要地線,可能還需要控制線),數(shù)據(jù)在一根數(shù)據(jù)信號線上一位一位地進(jìn)行傳輸,每一位數(shù)據(jù)都占據(jù)一個固定的時間長度。如圖所示。而串行接口是微機(jī)應(yīng)用系統(tǒng)常用的接口。在串行通信時,要求通信雙方都采用一個標(biāo)準(zhǔn)接口,使不同的設(shè)備可以方便地連接起來進(jìn)行通信。目前RS-232是PC機(jī)與通信工業(yè)中應(yīng)用最廣泛的一種串行接口。它被定義為

47、一種在低速率串行通信中增加通信距離的單端標(biāo)準(zhǔn)。RS-232采取不平衡傳輸方式,即所謂單端通信。 收、發(fā)端的數(shù)據(jù)信號是相對于信號地,如從DTE設(shè)備發(fā)出的數(shù)據(jù)在使用DB25連接器時是2腳相對7腳(信號地)的電平,DB25各引腳定義參見圖1。典型的RS-232信號在正負(fù)電平之間擺動,在發(fā)送數(shù)據(jù)時,發(fā)送端驅(qū)動器輸出正電平在+5+15V,負(fù)電平在-5-15V電平。當(dāng)無數(shù)據(jù)傳輸時,線上為TTL,從開始傳送數(shù)據(jù)到結(jié)束,線上電平從TTL電平到RS-232電平再返回TTL電平。接收器典型的工作電平在+3+12V與-3-12V。由于發(fā)送電平與接收電平的差僅為2V至3V左右,所以其共模抑制能力差,再加上雙絞線上的分

48、布電容,其傳送距離最大為約15米,最高速率為20kb/s。RS-232是為點(diǎn)對點(diǎn)(即只用一對收、發(fā)設(shè)備)通信而設(shè)計(jì)的,其驅(qū)動器負(fù)載為37k。所以RS-232適合本地設(shè)備之間的通信。圖9. RS232DB25連接器引腳規(guī)定RS232RS422R485工作方式單端差分差分節(jié)點(diǎn)數(shù)1收、1發(fā)1發(fā)10收1發(fā)32收最大傳輸電纜長度50英尺400英尺400英尺最大傳輸速率20Kb/S10Mb/s10Mb/s最大驅(qū)動輸出電壓+/-25V-0.25V+6V-7V+12V驅(qū)動器輸出信號電平(負(fù)載最小值)負(fù)載+/-5V+/-15V+/-2.0V+/-1.5V驅(qū)動器輸出信號電平(空載最大值)空載+/-25V+/-6V

49、+/-6V驅(qū)動器負(fù)載阻抗()3K7K10054擺率(最大值)30V/sN/AN/A接收器輸入電壓范圍+/-15V-10V+10V-7V+12V接收器輸入門限+/-3V+/-200mV+/-200mV接收器輸入電阻()3K7K4K(最小)12K驅(qū)動器共模電壓  -3V+3V-1V+3V接收器共模電壓  -7V+7V-7V+12V圖10. RS-232電氣參數(shù)表因此考慮到適用,經(jīng)濟(jì),兼容等原因,在本設(shè)計(jì)中采用RS-232串行通信標(biāo)準(zhǔn)是較好的選擇。3.4.3使用MSCcomm控件進(jìn)行串口編程Windows與以往DOS下串行通信程序不同,Windows不提倡應(yīng)用

50、程序直接控制硬件,而是通過Windows操作系統(tǒng)提供的設(shè)備驅(qū)動程序來進(jìn)行數(shù)據(jù)傳遞。因此串行口在Win 32中是作為文件來進(jìn)行處理的,而不是直接對端口進(jìn)行操作。對于串行通信,Win 32 提供了相應(yīng)的文件I/O函數(shù)與通信函數(shù),通過了解這些函數(shù)的使用,可以編制出符合不同需要的通信程序。 MSComm(Microsoft Communications Control)控件是Microsoft公司提供的簡化Windows下串行通信編程的ActiveX控件,通過串行端口傳輸和接收數(shù)據(jù),為應(yīng)用程序提供串行通信功能。選用的事件驅(qū)動方式處理通信問題。事件驅(qū)動方式是指,當(dāng)串口發(fā)生事件或者錯誤的時候,會產(chǎn)生一個O

51、nComm的事件,通過對這個事件的捕捉,進(jìn)行相應(yīng)的處理來完成串口通信任務(wù)。而在事件驅(qū)動方式中,MSComm有一個重要屬性-CommEvent屬性。當(dāng)串口發(fā)生事件或者錯誤的時候,MSComm就為它賦不同的代碼,同時,產(chǎn)生一個OnComm事件。這時候,我們就可以針對不同的代碼,進(jìn)行相應(yīng)的處理。這種方法的優(yōu)點(diǎn)是程序響應(yīng)及時,可靠性高。因此,在本設(shè)計(jì)中選用了MSComm控件來實(shí)現(xiàn)串行通信功能。 首先,在對話框中創(chuàng)建通信控件,若Control工具欄中缺少該控件,可通過菜單Project -> Add to Project -> Components and Control插入即可,再將該控件

52、從工具箱中拉到對話框中。然后通過設(shè)置和監(jiān)視MSComm控件的屬性和事件來完成任務(wù)。打開所需串口后,使用OnComm的事件來捕捉事件,使用m_Com.GetCommEvent()函數(shù)獲得CommEvent 屬性值。并由此來檢查其是否正確接收數(shù)據(jù)(正確接收數(shù)據(jù)時,m_Com.GetCommEvent()函數(shù)獲得的值為2),否則作拋棄處理。由于該通信的目的是建立上位機(jī)和下位機(jī)間的數(shù)據(jù)交換紐帶,使得上位機(jī)能夠?qū)崟r的顯示并處理下位機(jī)檢測到的數(shù)據(jù)。為了保證數(shù)據(jù)處理時間,進(jìn)入OnOnCommMscomm1()串口通信中斷函數(shù)后,馬上使用使用m_Com.SetRThreshold(0);語句將緩沖區(qū)引發(fā)接收數(shù)

53、據(jù)的字符數(shù)設(shè)置為0,即相當(dāng)于不接收緩沖區(qū)的任何數(shù)據(jù)。以確保已接收的數(shù)據(jù)由足夠的處理時間。當(dāng)已接收的數(shù)據(jù)處理完畢,則使用m_Com.SetRThreshold(1);語句,繼續(xù)接收數(shù)據(jù)。如此往復(fù)。使用MSComm控件實(shí)現(xiàn)串口通信的主要代碼如下:void CNTestDlg:OnOnCommMscomm1() /串口通信中斷處理/ TODO: Add your control notification handler code here/原理: 進(jìn)入中斷后,關(guān)閉中斷,逐個處理緩存中的數(shù)據(jù),結(jié)束后再開啟中斷,緩存中若有新的數(shù)據(jù),則進(jìn)入中斷。往復(fù)循環(huán)。m_Com.SetRThreshold(0);/關(guān)

54、閉串口中斷m_list_FPar.SetFont(&m_Font);/設(shè)置字體VARIANT vResponse;char *tem_data;char str;int nEvent,DataCount;nEvent=m_Com.GetCommEvent();/nEvent是一個狀態(tài)值switch(nEvent)case 2:/數(shù)據(jù)正確接收時,nEvent總為2DataCount=m_Com.GetInBufferCount();/獲取緩存中的數(shù)據(jù)大小vResponse=m_Com.GetInput();/讀緩存區(qū)tem_data=(char*)vResponse.parray->

55、;pvData;/將讀入的數(shù)據(jù)放入數(shù)組for(int i=0;i<DataCount;i+)str=*(tem_data+i);operateData(str);/逐個對數(shù)據(jù)進(jìn)行處理m_Com.SetRThreshold(1);void CNTestDlg:PortOpen()/初始化串口/在"開始"按鈕按下后才初始化串口if(m_Com.GetPortOpen()m_Com.SetPortOpen(FALSE);m_Com.SetCommPort(Com-48); /選擇串口號 Com 讀入的數(shù)據(jù)為字符型的數(shù)字,48對應(yīng)字符'0'if( !m_Com.GetPortOpen()m_Com.SetPortOpen(TRUE);/打開串口elseAfxMessageBox("cannot

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論