摘 要:溫度作為一項重要的物理參數,廣泛應用于海洋氣象、水文、漁業、電力及各種工業控制領域。該后臺軟件旨在Wingdows XP操作系統下,以C++Builder這種高效開發環境為平臺,通過ADO方式連接后端 Microsoft Access 2003數據庫,實現集RS 232串口測溫系統中的實時數據采集、實時曲線繪制與數據庫管理于一體的后臺軟件的快速、高效開發。實際運行表明,該后臺軟件以實時曲線繪制的方式形象、直觀的顯示了采集的溫度數據,運行良好。
關鍵詞:RS 232串口;實時曲線;C++Builder;ADO
中圖分類號:TP311文獻標識碼:B
文章編號:1004-373X(2008)24-067-04
Software for Temperature Acquisition System Based on C++Builder
WANG Zhaowei,FAN Hanbai
(North China Electric Power University,Baoding,071003,China)
Abstract:Temperature as an important physics parameter is extensive applied in many fields.This software is designed in Windows XP system based on C++Builder,it connects Microsoft Access2003 by ADO,establishes a communication between PC and slave computer throungh RS 232.realizes a rapid,efficient way to develop a software,which integerates real-time data′s effective aqcuisition,database management and the curve drawing.It is applied to a temperature acquisition system.It prves thatthe real-time data in a visual and intuition way to the operaters.Practical runs well.
Keywords:RS 232 serials port;real-time curve;C++Builder;ADO
隨著現代信息技術的發展,通信技術已經日趨成熟,其在探測領域得到了廣泛的應用,相較
于探測結果的原始數據顯示,經過后臺處理后形成的曲線給人更直觀的印象,而便捷的數據庫管理賦予數據更大的科學性和使用價值。因此制作集數據的接收、擬合、曲線繪制和數據庫管理的后臺軟件成為需要。在C++Builder環境下針對一款測溫系統進行后臺軟件設計。溫度作為一項重要的物理參數,對其的測量應用范圍很廣。而本系統的RS 232與PC的通信模式,只要對通信協議部分的代碼稍做修改,即可應用到其他的以串口測溫的系統,具有一定的通用性。
1 系統概述
該后臺軟件在Windows XP操作系統下以C++ Builder為開發平臺,通過ADO方式連接后端Microsoft Access2003數據庫,應用于測溫系統中的實時數據采集與處理。如圖1所示,其主要包含與下位機通信、實時數據處理、歷史數據查詢和報表打印4大部分。后臺軟件以RS 232方式與下位機進行通信。對接收數據的進行溫度擬合和溫度曲線繪制后可在每次測溫結束后自動將所有數據存儲到數據庫中。操作人員可以通過精確與模糊2種方式對歷史數據進行查詢,并根據需要生成報表,進行打印。

2 PC機與RS 232的串口通信
2.1 串口控件的安裝
采用www.cppfans.com網站針對C++Builder開發的開源免費VCL控件VICTOR與下位機的RS 232的通信, 因為是針對C++Builder開發的所以安裝與其他VCL一樣,十分方便。安裝步驟如下:
(1) 打開project/option/packages/Add/Browse 選項卡, 選擇VICTOR/VCL目錄下的yb_base_c6.bpl和 yb_comm_c6.bpl文件,確定;
(2) 打開project/(Directories/Conditionals)選項卡,在Include Path 和Library Path項目中,分點擊右方的省略號,選擇VICTOR/VCL,確定;
(3) 在我的電腦→屬性→高級→環境變量→系統變量的Path中填加包含 *.bpl 文件的文件夾,注意與之前已存在的其他文件夾以分號分隔。
通過以上操作,此時VICTOR空間已經出現在控制面板中。
2.2 串口數據的初始化
在添加了VICTOR控件后,采集工作之前還要對串口進行必要的初始化的工作。初始化工作實質上就是要在計算機和數據終端間建立起一個共同遵守的協議,以使兩者在接收和發送數據上保持協調一致。比如在初始化工作中有一項為關于數據傳輸的波特率設置,在這項工作中,計算機作為接收數據端,它接收數據的速度應與數據終端傳送數據的速度一致。如果設置不一致,就會造成數據的丟失等異常情況。不同于其他控件,VICTOR提供了串口初始化的窗口,只需在事件中添加語句就可以彈出初始化窗口(如圖2所示)。無需自己編寫額外代碼。
YbCommDevice1->SettingsDialog(this,true);//顯示串口初始化窗口

2.3 串口數據讀入
當數據采集裝置在串口被打開后,會自動將采集得到的數據送入計算機。本后臺軟件采取事件驅動方式,事件驅動方式相當于一般程序設計中的中斷方式。
當串口發生事件或錯誤時,VICTOR控件就會產生YbCommDevice1CommNotify事件,用戶程序可以捕獲該事件并進行相應處理。此后臺軟件與下位機的通信協議較簡單,1條數據包含6個字節。以EB90為報頭,第3,4個字節為發送數據的序列號,第5,6個字節為采集的電壓值。后臺軟件根據此協議提取數據即可。
其讀入方式如下:
YbCommDevice1->Active = true;//打開串口
unsigned charinQue[8192];//輸入緩存
YbCommDevice1->Read(inQue,8192);//放入緩沖區
…//數據提取代碼
3 溫度曲線繪制
3.1 實時溫度曲線的繪制
由于C++Builder自帶的Tchart控件功能十分強大,因此曲線的繪制十分簡單,且控件本身可以實現曲線的局部放大和縮小,無需額外代碼,大大加快了軟件的開發時間。在實時數據處理過程中只需在YbCommDevice1CommNotify事件中添加如下代碼即可。
Form1→Series1→AddXY(Xvalue,Yvalue,String(Yvalue),clRed);
該語句的作用是在Tchart中添加一條紅色的曲線,并以Yvalue的值來標定點,如圖3所示。

3.2 歷史溫度曲線的繪制
歷史數據的顯示同樣使用Tchart控件,與實時數據曲線繪制不同的是,數據的添加不再依靠YbCommDevice1CommNotify事件,而是從數據的存儲文件中讀取數據放入一自定義的數據結構中,利用該數據結構將數據添加到Tchart中,其效果與圖2相同,只是為了加以區別 ,歷史曲線的顯示顏色設置為了綠色。代碼實現片斷如下:
typedef struct {
float nIndex;
float fValue;
}tagTData;
tagTData TD[20000];
…//讀取文件數據 存入結構體數組
for(int i=0; i<文件中數據個數; i++)
{
Form1->Series1->AddXY(nIndex,fValue,String(fValue ),clGreen);
}
4 數據庫的操作
4.1 與加密的Access2003數據庫的連接
基于一定安全性的考量,Access2003設有密碼,當操作人員不具備操作權限或企圖直接操作.mdb文件時會要求其輸入密碼。而對于具有操作權限的人員,數據庫的密碼是透明的。在需要ADOQuery(ADOTable的實現方式也是這樣)控件的窗體的構造函數中添加如下的代碼即可:
__fastcall TForm1::Tform1(TComponent* Owner)
: TForm(Owner)
{
ADOQuery->ConnectionSring=\"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=BDAdata.mdb:Persist Security Info=False;Jet OLEDB:Database Password=123\";
ADOQuery->Active = true;
}
其中BDAdata.mdb為所要連接的數據庫名稱, 123為此數據庫的密碼。數據庫的名稱并沒有使用絕對路徑,這樣做的目的是,只要保證數據庫文件放在應用程序所在的文件夾即可成功連接,提高了程序的可移植性。
4.2 數據庫的刪除、查詢的實現
4.2.1 數據庫的刪除
考慮到測溫系統實時性和數據2大的特點,采集的測量數據并未放入數據庫中,而是以二進制的方式,用以測量時間為文件名存入位于應用程序所在目錄的Data文件夾中,這樣只需在數據庫中記錄文件的名稱,即可在查詢時方便的還原為絕對路徑,提高了程序的可移植性。數據庫文件中只包含1個表,記錄試驗時間、操作人員、備注以及前面提到的記錄文件名稱。因此相應的刪除、修改、查詢實現起來十分簡單,只需最基本的SQL指令即可實現。惟一的難點在于將數據庫中記錄的刪除、修改,生效于其指向的二進制文件。下面僅以數據的刪除為例,說明其實現方法:
//1。根據數據庫的數據記錄獲得數據文件的存放路徑
String FileName;
FileName=DBGrid1->DataSource->DataSet->Field-
Values[\"sy_record\"];
FileName=ExtractFilePath(Application->ExeName)+FileName;
//2。確認是否刪除
if(MessageBox(Handle,(\"真的要刪\"+FileName+文件嗎?\").c_str(),\"刪除確認\",
MB_OKCANCEL|MB_ICONWARNING)==IDOK)
{
DeleteFile(FileName.c_str()) ;
}
//3。刪除數據庫中紀錄
qq->Delete();
4.2.2 數據庫的查詢
查詢的部分提供了任意字段的精確查詢與任意字段的模糊查詢2種方式,如圖4所示。以一個CheckBox在2種模式間進行切換,當CheckBox的狀態為True時。進行任意字段的模糊與時間段查詢。反之,則實現任意字段的精確查詢,下面給出任意字段模糊查詢的SQL語句生成片斷:
mysql=\"select * from sytable where 1=1 \";
if(CheckBox1->Checked ) //任意字段模糊查詢
{
if (czshj1->Text !=\"\"czshj2->Text!=\"\")
{
mysql=mysql+\" and sy_time between #\" +czshj1->Text +\" 00::00::00# and #\"+czshj2->Text +\" 23::59::59#\";
}
if (czyy->Text !=\"\")
{
mysql=mysql+\" and sy_name like \" + \"'%\"+ Edit1->Text +\"%'\";
}
…//以同樣方式加入其他的查詢單項
}
這部分需要注意的是,在C++Builder中進行時間查詢時,時、分、秒之間是以“::”分隔,而不是標準SQL語言中的 “:”。

5 報表的生成
除測量人員和測量說明等少數數據庫信息,溫度測量值與測量序列號都以二進制方式存儲在文件中。因此常用的數據庫報表控件FastReport并不適合用于生成該系統的報表。加之客戶要求生成TXT格式的報表。最終該系統決定運用TMemo的SaveToFile屬性來實現報表的生成。在生成報表的窗體中添加一個Memo,將其Visible屬性設置為1,將需要生成報表的信息利用Tmemo中Lines 屬性的Add()方法添加到Memo中。信息輸入完畢后調用SaveToFile方法即可在制定的文件夾生成TXT文件。其關鍵實現代碼如下:
Memo2->Clear() ;
Memo2->Lines->Add(\"http://這是測溫系統的數據報表\");
Memo2->Lines->Add(\"http://********\");
Memo2->Lines->Add(//測量名稱:\" + clmch) ;
… //添加修要聲稱報表的文件
Memo2->Lines->SaveToFile(ExtractFilePath(Application->ExeName)+\"Report//\"+str);
ShellExecute(Sender,\"open\",str.c_str() ,NULL,
NULL,SW_SHOW);
其中的clmch和str 分別為存儲數據庫中讀出的測量名稱和文件名稱的變量。ShellExecute()用來顯示生成的報表。經實際應用,生成含兩萬溫度值的報表時間不超過秒。其完全合乎需要,且十分方簡單,易于更改以應對不同需求。
6 結 語
由于篇幅所限,該文章并未給出測溫系統的詳細實現過程,只針對開發過程中遇到的一些不同于其他系統的地方做了描述,并給出了代碼片斷。C++Builder是一種方便、高效的開發環境。其出色的窗體開發能力,以及豐富的VCL控件,大大縮短了系統的開發周期和代碼量。該測溫系統目前已應用于某物理化學實驗,實驗者感到操作方便,數據處理快速準確,并且和手工方式相比,本軟件極大地減低了工作量,提高了工作效率。
參考文獻
[1]Victor Chen.Victor 串口 VCL 控件[EB/OL].http://www.cppfans.com/d_vcl_files/yb_comm_133.asp,2006.
[2]王晟.C++ Builder數據庫開發經典案例解析[M].北京:清華大學出版社,2005.
[3]曾棕根.C++ Builder數據庫開發實用教程[M].北京:清華大學出版社,2006.
[4]蒙祖強.C++Builder程序員成長攻略[M].北京:中國水利水電出版社,2007.
[5]袁輝.C++Builder實用教程[M].成都:電子科技大學出版社,1998.
[6]梅成剛.C++Builder項目開發實踐[M].北京:中國鐵道出版社,2003.
[7]求是科技.Delphi串口通信工程開發實例導航[M].北京:人民郵電出版社,2003.
[8]同志工作室.C++Builder5.0 API函數開發與實例.北京:人民郵電出版社,2002.
[9]劉濱.C++Builder5.0高級編程實例精解[M].北京:國防工業出版社,2001.
[10]李幼儀,甘志.C++Builder高級應用指南[M].北京:清華大學出版社,2002.
作者簡介 王兆瑋 1983年出生,碩士研究生。主要研究方向為嵌入式系統。
范寒柏 1963年出生,副教授。主要研究方向為嵌入式系統。