摘 要:溫度作為一項(xiàng)重要的物理參數(shù),廣泛應(yīng)用于海洋氣象、水文、漁業(yè)、電力及各種工業(yè)控制領(lǐng)域。該后臺軟件旨在Wingdows XP操作系統(tǒng)下,以C++Builder這種高效開發(fā)環(huán)境為平臺,通過ADO方式連接后端 Microsoft Access 2003數(shù)據(jù)庫,實(shí)現(xiàn)集RS 232串口測溫系統(tǒng)中的實(shí)時(shí)數(shù)據(jù)采集、實(shí)時(shí)曲線繪制與數(shù)據(jù)庫管理于一體的后臺軟件的快速、高效開發(fā)。實(shí)際運(yùn)行表明,該后臺軟件以實(shí)時(shí)曲線繪制的方式形象、直觀的顯示了采集的溫度數(shù)據(jù),運(yùn)行良好。
關(guān)鍵詞:RS 232串口;實(shí)時(shí)曲線;C++Builder;ADO
中圖分類號:TP311文獻(xiàn)標(biāo)識碼:B
文章編號:1004-373X(2008)24-067-04
Software for Temperature Acquisition System Based on C++Builder
WANG Zhaowei,F(xiàn)AN 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
隨著現(xiàn)代信息技術(shù)的發(fā)展,通信技術(shù)已經(jīng)日趨成熟,其在探測領(lǐng)域得到了廣泛的應(yīng)用,相較
于探測結(jié)果的原始數(shù)據(jù)顯示,經(jīng)過后臺處理后形成的曲線給人更直觀的印象,而便捷的數(shù)據(jù)庫管理賦予數(shù)據(jù)更大的科學(xué)性和使用價(jià)值。因此制作集數(shù)據(jù)的接收、擬合、曲線繪制和數(shù)據(jù)庫管理的后臺軟件成為需要。在C++Builder環(huán)境下針對一款測溫系統(tǒng)進(jìn)行后臺軟件設(shè)計(jì)。溫度作為一項(xiàng)重要的物理參數(shù),對其的測量應(yīng)用范圍很廣。而本系統(tǒng)的RS 232與PC的通信模式,只要對通信協(xié)議部分的代碼稍做修改,即可應(yīng)用到其他的以串口測溫的系統(tǒng),具有一定的通用性。
1 系統(tǒng)概述
該后臺軟件在Windows XP操作系統(tǒng)下以C++ Builder為開發(fā)平臺,通過ADO方式連接后端Microsoft Access2003數(shù)據(jù)庫,應(yīng)用于測溫系統(tǒng)中的實(shí)時(shí)數(shù)據(jù)采集與處理。如圖1所示,其主要包含與下位機(jī)通信、實(shí)時(shí)數(shù)據(jù)處理、歷史數(shù)據(jù)查詢和報(bào)表打印4大部分。后臺軟件以RS 232方式與下位機(jī)進(jìn)行通信。對接收數(shù)據(jù)的進(jìn)行溫度擬合和溫度曲線繪制后可在每次測溫結(jié)束后自動將所有數(shù)據(jù)存儲到數(shù)據(jù)庫中。操作人員可以通過精確與模糊2種方式對歷史數(shù)據(jù)進(jìn)行查詢,并根據(jù)需要生成報(bào)表,進(jìn)行打印。
2 PC機(jī)與RS 232的串口通信
2.1 串口控件的安裝
采用www.cppfans.com網(wǎng)站針對C++Builder開發(fā)的開源免費(fèi)VCL控件VICTOR與下位機(jī)的RS 232的通信, 因?yàn)槭轻槍++Builder開發(fā)的所以安裝與其他VCL一樣,十分方便。安裝步驟如下:
(1) 打開project/option/packages/Add/Browse 選項(xiàng)卡, 選擇VICTOR/VCL目錄下的yb_base_c6.bpl和 yb_comm_c6.bpl文件,確定;
(2) 打開project/(Directories/Conditionals)選項(xiàng)卡,在Include Path 和Library Path項(xiàng)目中,分點(diǎn)擊右方的省略號,選擇VICTOR/VCL,確定;
(3) 在我的電腦→屬性→高級→環(huán)境變量→系統(tǒng)變量的Path中填加包含 *.bpl 文件的文件夾,注意與之前已存在的其他文件夾以分號分隔。
通過以上操作,此時(shí)VICTOR空間已經(jīng)出現(xiàn)在控制面板中。
2.2 串口數(shù)據(jù)的初始化
在添加了VICTOR控件后,采集工作之前還要對串口進(jìn)行必要的初始化的工作。初始化工作實(shí)質(zhì)上就是要在計(jì)算機(jī)和數(shù)據(jù)終端間建立起一個共同遵守的協(xié)議,以使兩者在接收和發(fā)送數(shù)據(jù)上保持協(xié)調(diào)一致。比如在初始化工作中有一項(xiàng)為關(guān)于數(shù)據(jù)傳輸?shù)牟ㄌ芈试O(shè)置,在這項(xiàng)工作中,計(jì)算機(jī)作為接收數(shù)據(jù)端,它接收數(shù)據(jù)的速度應(yīng)與數(shù)據(jù)終端傳送數(shù)據(jù)的速度一致。如果設(shè)置不一致,就會造成數(shù)據(jù)的丟失等異常情況。不同于其他控件,VICTOR提供了串口初始化的窗口,只需在事件中添加語句就可以彈出初始化窗口(如圖2所示)。無需自己編寫額外代碼。
YbCommDevice1->SettingsDialog(this,true);//顯示串口初始化窗口
2.3 串口數(shù)據(jù)讀入
當(dāng)數(shù)據(jù)采集裝置在串口被打開后,會自動將采集得到的數(shù)據(jù)送入計(jì)算機(jī)。本后臺軟件采取事件驅(qū)動方式,事件驅(qū)動方式相當(dāng)于一般程序設(shè)計(jì)中的中斷方式。
當(dāng)串口發(fā)生事件或錯誤時(shí),VICTOR控件就會產(chǎn)生YbCommDevice1CommNotify事件,用戶程序可以捕獲該事件并進(jìn)行相應(yīng)處理。此后臺軟件與下位機(jī)的通信協(xié)議較簡單,1條數(shù)據(jù)包含6個字節(jié)。以EB90為報(bào)頭,第3,4個字節(jié)為發(fā)送數(shù)據(jù)的序列號,第5,6個字節(jié)為采集的電壓值。后臺軟件根據(jù)此協(xié)議提取數(shù)據(jù)即可。
其讀入方式如下:
YbCommDevice1->Active = true;//打開串口
unsigned charinQue[8192];//輸入緩存
YbCommDevice1->Read(inQue,8192);//放入緩沖區(qū)
…//數(shù)據(jù)提取代碼
3 溫度曲線繪制
3.1 實(shí)時(shí)溫度曲線的繪制
由于C++Builder自帶的Tchart控件功能十分強(qiáng)大,因此曲線的繪制十分簡單,且控件本身可以實(shí)現(xiàn)曲線的局部放大和縮小,無需額外代碼,大大加快了軟件的開發(fā)時(shí)間。在實(shí)時(shí)數(shù)據(jù)處理過程中只需在YbCommDevice1CommNotify事件中添加如下代碼即可。
Form1→Series1→AddXY(Xvalue,Yvalue,String(Yvalue),clRed);
該語句的作用是在Tchart中添加一條紅色的曲線,并以Yvalue的值來標(biāo)定點(diǎn),如圖3所示。
3.2 歷史溫度曲線的繪制
歷史數(shù)據(jù)的顯示同樣使用Tchart控件,與實(shí)時(shí)數(shù)據(jù)曲線繪制不同的是,數(shù)據(jù)的添加不再依靠YbCommDevice1CommNotify事件,而是從數(shù)據(jù)的存儲文件中讀取數(shù)據(jù)放入一自定義的數(shù)據(jù)結(jié)構(gòu)中,利用該數(shù)據(jù)結(jié)構(gòu)將數(shù)據(jù)添加到Tchart中,其效果與圖2相同,只是為了加以區(qū)別 ,歷史曲線的顯示顏色設(shè)置為了綠色。代碼實(shí)現(xiàn)片斷如下:
typedef struct {
float nIndex;
float fValue;
}tagTData;
tagTData TD[20000];
…//讀取文件數(shù)據(jù) 存入結(jié)構(gòu)體數(shù)組
for(int i=0; i<文件中數(shù)據(jù)個數(shù); i++)
{
Form1->Series1->AddXY(nIndex,fValue,String(fValue ),clGreen);
}
4 數(shù)據(jù)庫的操作
4.1 與加密的Access2003數(shù)據(jù)庫的連接
基于一定安全性的考量,Access2003設(shè)有密碼,當(dāng)操作人員不具備操作權(quán)限或企圖直接操作.mdb文件時(shí)會要求其輸入密碼。而對于具有操作權(quán)限的人員,數(shù)據(jù)庫的密碼是透明的。在需要ADOQuery(ADOTable的實(shí)現(xiàn)方式也是這樣)控件的窗體的構(gòu)造函數(shù)中添加如下的代碼即可:
__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為所要連接的數(shù)據(jù)庫名稱, 123為此數(shù)據(jù)庫的密碼。數(shù)據(jù)庫的名稱并沒有使用絕對路徑,這樣做的目的是,只要保證數(shù)據(jù)庫文件放在應(yīng)用程序所在的文件夾即可成功連接,提高了程序的可移植性。
4.2 數(shù)據(jù)庫的刪除、查詢的實(shí)現(xiàn)
4.2.1 數(shù)據(jù)庫的刪除
考慮到測溫系統(tǒng)實(shí)時(shí)性和數(shù)據(jù)2大的特點(diǎn),采集的測量數(shù)據(jù)并未放入數(shù)據(jù)庫中,而是以二進(jìn)制的方式,用以測量時(shí)間為文件名存入位于應(yīng)用程序所在目錄的Data文件夾中,這樣只需在數(shù)據(jù)庫中記錄文件的名稱,即可在查詢時(shí)方便的還原為絕對路徑,提高了程序的可移植性。數(shù)據(jù)庫文件中只包含1個表,記錄試驗(yàn)時(shí)間、操作人員、備注以及前面提到的記錄文件名稱。因此相應(yīng)的刪除、修改、查詢實(shí)現(xiàn)起來十分簡單,只需最基本的SQL指令即可實(shí)現(xiàn)。惟一的難點(diǎn)在于將數(shù)據(jù)庫中記錄的刪除、修改,生效于其指向的二進(jìn)制文件。下面僅以數(shù)據(jù)的刪除為例,說明其實(shí)現(xiàn)方法:
//1。根據(jù)數(shù)據(jù)庫的數(shù)據(jù)記錄獲得數(shù)據(jù)文件的存放路徑
String FileName;
FileName=DBGrid1->DataSource->DataSet->Field-
Values[\"sy_record\"];
FileName=ExtractFilePath(Application->ExeName)+FileName;
//2。確認(rèn)是否刪除
if(MessageBox(Handle,(\"真的要刪\"+FileName+文件嗎?\").c_str(),\"刪除確認(rèn)\",
MB_OKCANCEL|MB_ICONWARNING)==IDOK)
{
DeleteFile(FileName.c_str()) ;
}
//3。刪除數(shù)據(jù)庫中紀(jì)錄
qq->Delete();
4.2.2 數(shù)據(jù)庫的查詢
查詢的部分提供了任意字段的精確查詢與任意字段的模糊查詢2種方式,如圖4所示。以一個CheckBox在2種模式間進(jìn)行切換,當(dāng)CheckBox的狀態(tài)為True時(shí)。進(jìn)行任意字段的模糊與時(shí)間段查詢。反之,則實(shí)現(xiàn)任意字段的精確查詢,下面給出任意字段模糊查詢的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 +\"%'\";
}
…//以同樣方式加入其他的查詢單項(xiàng)
}
這部分需要注意的是,在C++Builder中進(jìn)行時(shí)間查詢時(shí),時(shí)、分、秒之間是以“::”分隔,而不是標(biāo)準(zhǔn)SQL語言中的 “:”。
5 報(bào)表的生成
除測量人員和測量說明等少數(shù)數(shù)據(jù)庫信息,溫度測量值與測量序列號都以二進(jìn)制方式存儲在文件中。因此常用的數(shù)據(jù)庫報(bào)表控件FastReport并不適合用于生成該系統(tǒng)的報(bào)表。加之客戶要求生成TXT格式的報(bào)表。最終該系統(tǒng)決定運(yùn)用TMemo的SaveToFile屬性來實(shí)現(xiàn)報(bào)表的生成。在生成報(bào)表的窗體中添加一個Memo,將其Visible屬性設(shè)置為1,將需要生成報(bào)表的信息利用Tmemo中Lines 屬性的Add()方法添加到Memo中。信息輸入完畢后調(diào)用SaveToFile方法即可在制定的文件夾生成TXT文件。其關(guān)鍵實(shí)現(xiàn)代碼如下:
Memo2->Clear() ;
Memo2->Lines->Add(\"http://這是測溫系統(tǒng)的數(shù)據(jù)報(bào)表\");
Memo2->Lines->Add(\"http://********\");
Memo2->Lines->Add(//測量名稱:\" + clmch) ;
… //添加修要聲稱報(bào)表的文件
Memo2->Lines->SaveToFile(ExtractFilePath(Application->ExeName)+\"Report//\"+str);
ShellExecute(Sender,\"open\",str.c_str() ,NULL,
NULL,SW_SHOW);
其中的clmch和str 分別為存儲數(shù)據(jù)庫中讀出的測量名稱和文件名稱的變量。ShellExecute()用來顯示生成的報(bào)表。經(jīng)實(shí)際應(yīng)用,生成含兩萬溫度值的報(bào)表時(shí)間不超過秒。其完全合乎需要,且十分方簡單,易于更改以應(yīng)對不同需求。
6 結(jié) 語
由于篇幅所限,該文章并未給出測溫系統(tǒng)的詳細(xì)實(shí)現(xiàn)過程,只針對開發(fā)過程中遇到的一些不同于其他系統(tǒng)的地方做了描述,并給出了代碼片斷。C++Builder是一種方便、高效的開發(fā)環(huán)境。其出色的窗體開發(fā)能力,以及豐富的VCL控件,大大縮短了系統(tǒng)的開發(fā)周期和代碼量。該測溫系統(tǒng)目前已應(yīng)用于某物理化學(xué)實(shí)驗(yàn),實(shí)驗(yàn)者感到操作方便,數(shù)據(jù)處理快速準(zhǔn)確,并且和手工方式相比,本軟件極大地減低了工作量,提高了工作效率。
參考文獻(xiàn)
[1]Victor Chen.Victor 串口 VCL 控件[EB/OL].http://www.cppfans.com/d_vcl_files/yb_comm_133.asp,2006.
[2]王晟.C++ Builder數(shù)據(jù)庫開發(fā)經(jīng)典案例解析[M].北京:清華大學(xué)出版社,2005.
[3]曾棕根.C++ Builder數(shù)據(jù)庫開發(fā)實(shí)用教程[M].北京:清華大學(xué)出版社,2006.
[4]蒙祖強(qiáng).C++Builder程序員成長攻略[M].北京:中國水利水電出版社,2007.
[5]袁輝.C++Builder實(shí)用教程[M].成都:電子科技大學(xué)出版社,1998.
[6]梅成剛.C++Builder項(xiàng)目開發(fā)實(shí)踐[M].北京:中國鐵道出版社,2003.
[7]求是科技.Delphi串口通信工程開發(fā)實(shí)例導(dǎo)航[M].北京:人民郵電出版社,2003.
[8]同志工作室.C++Builder5.0 API函數(shù)開發(fā)與實(shí)例.北京:人民郵電出版社,2002.
[9]劉濱.C++Builder5.0高級編程實(shí)例精解[M].北京:國防工業(yè)出版社,2001.
[10]李幼儀,甘志.C++Builder高級應(yīng)用指南[M].北京:清華大學(xué)出版社,2002.
作者簡介 王兆瑋 1983年出生,碩士研究生。主要研究方向?yàn)榍度胧较到y(tǒng)。
范寒柏 1963年出生,副教授。主要研究方向?yàn)榍度胧较到y(tǒng)。