聶 斐,殷興輝
(河海大學 計算機與信息學院,江蘇 南京 211100)
在工業控制和測量探測等領域中,對于一些時刻變化的物理量(如:溫度,壓力,速度等),我們常常要進行實時地監測。這就需要在測量測試的儀器儀表或控制系統的界面上,畫出實時曲線圖,供使用人員觀測。本文基于太陽爆發活動實時監測系統的應用,對太陽溫度進行實時顯示。而通常的軟件界面上,只是實時顯示根據數據繪制的曲線,但是坐標幅度(縱坐標)上往往是恒定的[1]。當太陽出現爆發活動時,實測溫度達到幾萬度,而爆發活動結束時,實測溫度又回到幾百度,因此,被監測的數據在不斷變化,幅度的變化范圍很大。當被監測數據從一個很大的波動幅度(幾萬度)突降到一個很小的波動幅度(幾百度)時,就會導致繪制出的曲線縮在一起,在幅值較小的地方。這種曲線極不便于觀測者實時觀看與監測。本文在界面設計時,不僅實時監測數據繪制曲線,而且坐標幅度也根據實測數據在動態變化,非常利于觀測者觀測,使得人機交互界面更加友好便捷。
MFC(Microsoft Foundation Class,微軟基礎類庫)是微軟公司為了簡化程序員的開發工作所開發的一套C++類的集合,是一套面向對象的函數庫,以類的方式提供給用戶使用。可以用它來編寫Windows應用程序,該類的集合是按層次結構組織起來的,其中封裝了大部分Windows API(Application Programming Interface)函數和Windows控件,它所包含的功能涉及到整個Windows操作系統。MFC不僅為用戶提供了Windows圖形環境下應用程序的框架,而且還提供了創建應用程序的組件。使用MFC類庫和Visual C++提供的高度可視的應用程序開發工具,可使應用程序開發變得更簡單,極大地縮短開發周期,提高代碼的可靠性和可重用性[2-4]。
軟件界面的開發依托微軟公司推出的Visual C++6.0為開發平臺,使用MFC的單文檔視圖框架來設計整個應用程序。為了監測太陽溫度,軟件界面上需要顯示太陽溫度的實時窗口。在觀測太陽溫度的實時窗口中,需要實時繪制太陽溫度曲線圖。基于面向對象的設計理念,我們可以用一個類來完成這樣的工作。MFC中沒有直接提供這樣的類[5],JanVidar Berger編寫的clPlot類可以畫實時曲線,派生于CWnd類。但是并不能滿足本系統的要求,本文進行了修改,加以改進,進而實現了實時數據的動態顯示。
不同于Jan Vidar Berger所寫的clPlot類,本文在serie類的成員變量中構建了一個CList類的對象m_valuelist。CList類支持可訪問順序或按值排列的非獨一對象的有序鏈表[6]。用這樣一個鏈表,來存放實時監測的數據。該數據為一個結構體。定義如下:

以X軸(橫坐標)為時間軸,Y軸(縱坐標)為太陽溫度。在界面上,我們顯示的是一分鐘內的溫度曲線。由于下位機設定的采樣速率為一秒鐘采集一個數據,傳到上位機上,一分鐘內為60個數據。那么,我們就將鏈表元素的個數設定為60個。每接收到一個新的數據,則添加在鏈表的尾部。如果接收到的數據超過60個了,則將鏈表的頭元素去掉。這樣,就使得鏈表的元素個數始終為60個,并且是最新的60個數據。這樣即可以保證觀測數據的實時性。另外,在添加新數據之后,我們還要判斷其幅值的大小,即value結構體中的成員變量dValue。我們要把鏈表中所有數據的幅值的最大值和最小值,作為設定Y軸(縱坐標)標尺的依據。這樣,坐標幅度就會根據數據幅值的變化而變化,繪制出的曲線圖總是會占據整個坐標平面,即使數據幅值突降至某個小的幅度波動,曲線圖也不會“擠”在一起,極大方便了使用人員的觀測。
添加新數據使用的是clPlot類的AddPoint()函數,該函數調用serie類的成員函數AddPoint()。在serie::AddPoint()中,將新接收的數據添加入鏈表中。本文定義了兩個全局變量m_max和m_min,用來存放Y軸坐標標尺的最大值和最小值。這兩個值如何得到呢?先找出鏈表中數據幅值的最大值和最小值,將它們作差,得到一個差值。m_max即為鏈表中數據幅值的最大值加上差值的1%;m_min即為鏈表中數據幅值的最小值減去差值的1%。那么將m_max和m_min作為參數,在clPlot::AddPoint()調 用 函 數SetLYRange()時,傳 遞 進去,來設定Y軸的坐標標尺。根據新數據添加的時間,調用函數SetBXRange(),設定X軸標尺。最后調用函數Invalidate(),該函數的作用是讓窗口的整個客戶區無效,當下一個WM_PAINT消息發生時,窗口就會重繪[7]。這樣,每添加一個新的數據,就重新畫一次曲線圖,即達到實時顯示的效果。
設計流程圖如圖1所示。

圖1 設計流程圖Fig.1 Flow chart of design
關鍵代碼如下:


圖2為非動態顯示。由圖2(a)可以看到,太陽處于爆發時期,太陽溫度在大約45 000度左右波動。但是由于浮動相對較小,看不出具體的范圍。等到爆發活動結束,太陽溫度大幅下降。可是由于非動態顯示的局限性,在圖2(b)上幾乎看不出太陽溫度值,更看不清楚波動范圍。

圖2 非動態顯示Fig.2 Non-dynamic displaying
圖3 為動態顯示。由圖3(a)可以清晰的反映出太陽溫度浮動在45 000-45 500度。在14點13分的時候,太陽爆發活動結束,如圖3(b),太陽溫度突降至較小的幅值范圍(300~800度)波動,坐標標尺幅值也跟隨變化,如圖3(c),曲線圖也跟隨動態變化,不似圖2那樣壓縮在一起,無法看清波動的范圍。非常便于使用者觀測。

圖3 動態顯示Fig.3 Dynamic displaying
文中在Visual C++6.0開發平臺上,利用MFC類庫,設計了太陽爆發活動實時監測的軟件界面,不僅實現了對太陽溫度的實時監測,而且實現了實時數據曲線圖的動態顯示。極大地方便了用戶的使用與觀測。該方法已經應用于太陽爆發活動實時監測系統項目中,效果顯著,因而,也可以應用在其他工程控制或探測測量等領域。
[1]趙融冰,艾力·玉蘇甫,張晉,等.采用VC++的射電望遠鏡控制軟件在Windows XP下的設計和實現[J].天文研究與技術,2007,4(1):64-71.ZHAO Rong-bing,Aili Yu,ZHANG Jin,et al.Design and realization of radio telescope control software in windows XP system with VC++[J].Astronomical Research&Technology,2007,4(1):64-71.
[2]梁普選.Visual C++程序設計與實踐[M].北京:清華大學出版社,北京交通大學出版社,2005.
[3]劉雄鷹.MFC中顯示數據控件手工編程綁定數據控件[J].電腦與信息技術,2012,20(4):49-51.LIU Xiong-ying.Displaying data control binding data control with manual programming in MFC[J].Computer and Information Technology,2012,20(4):49-51.
[4]仇巍,邢建國.基于MFC的產品結構樹管理系統的實現[J].中國制造業信息化,2012,41(3):11-13.QIU Wei,XING Jian-guo.Development of product structure tree management system based on MFC [J].Manufacture Information Engineering of China,2012,41(3):11-13.
[5]申閆春.Visual C++案例教程[M].北京:清華大學出版社,北京交通大學出版社,2010.
[6]陳元琰.Visual C++.NET MFC類庫應用詳解[M].北京:科學出版社,2004.
[7]孫鑫.VC++深入詳解[M].北京:電子工業出版社,2012.