嵌入式數(shù)據(jù)庫SQLite在故障錄波中的應(yīng)用
唐瑜,成樂祥,洪婧
(東南大學(xué) 電氣工程學(xué)院,江蘇 南京 210096)
摘要:介紹了SQLite的技術(shù)特點(diǎn)和體系結(jié)構(gòu);結(jié)合嵌入式軟硬件平臺(tái)提出在電力故障錄波裝置中使用SQLite數(shù)據(jù)庫實(shí)現(xiàn)故障錄波的解決方案;詳細(xì)說明了SQLite在Arm-Linux平臺(tái)上的應(yīng)用開發(fā)、交叉編譯和移植過程;最后通過一個(gè)應(yīng)用實(shí)例說明了SQLite的實(shí)現(xiàn)過程。
關(guān)鍵詞:嵌入式數(shù)據(jù)庫;SQLite;電力故障錄波
中圖分類號(hào):TP311文獻(xiàn)標(biāo)識(shí)碼:A文章編號(hào):1009-3044(2008)17-21373-02
1 引言
故障錄波器是電力系統(tǒng)發(fā)生故障及振蕩時(shí)能自動(dòng)記錄的一種裝置,在發(fā)生故障或振蕩時(shí)進(jìn)行錄波。近年來,隨著電子技術(shù)的迅速發(fā)展,故障錄波器采用嵌入式系統(tǒng)設(shè)計(jì)是一個(gè)發(fā)展方向。由于故障錄波器需要采集的數(shù)據(jù)量大,科學(xué)的存儲(chǔ)和管理這些數(shù)據(jù)對(duì)于提高錄波器的性能起到重要的作用。
目前,常用的實(shí)時(shí)數(shù)據(jù)存儲(chǔ)和管理的方法有3種:(1)根據(jù)具體的存儲(chǔ)器硬件人為地設(shè)計(jì)存儲(chǔ)管理算法。這種方法簡(jiǎn)單直接,但是軟件的可移植性差,對(duì)于復(fù)雜的算法很難達(dá)到高可靠性的要求;(2)利用嵌入式操作系統(tǒng)提供的文件API,以文件的方式實(shí)現(xiàn)數(shù)據(jù)的存儲(chǔ)和管理。由于多數(shù)嵌入式操作系統(tǒng)(Windows CE、Linux等)都以獨(dú)占的方式訪問文件,所以這種方法IO開銷大,訪問效率低,數(shù)據(jù)共享性較差;(3)借助嵌入式數(shù)據(jù)庫實(shí)現(xiàn)數(shù)據(jù)存儲(chǔ)和管理。數(shù)據(jù)庫通過事務(wù)來進(jìn)行調(diào)度與并發(fā)控制,可有效地對(duì)數(shù)據(jù)進(jìn)行存取、查詢等共享操作,同時(shí)借助數(shù)據(jù)庫所具有的安全性和完整性檢驗(yàn)等多種安全措施,可確保系統(tǒng)具有較好的整體性能。本文在分析了SQLite嵌入式數(shù)據(jù)庫內(nèi)部結(jié)構(gòu)和開發(fā)技術(shù)的基礎(chǔ)上,提出了基于嵌入式數(shù)據(jù)庫SQLite的故障錄波裝置的軟件設(shè)計(jì)方法。
2 SQLite體系結(jié)構(gòu)及開發(fā)技術(shù)
嵌入式數(shù)據(jù)庫系統(tǒng)是指支持某種特定計(jì)算模式或移動(dòng)計(jì)算的數(shù)據(jù)庫管理系統(tǒng),它通常與操作系統(tǒng)和具體應(yīng)用集成在一起, 運(yùn)行在智能型嵌入式設(shè)備或移動(dòng)設(shè)備上。嵌入式數(shù)據(jù)庫的使用是采用程序驅(qū)動(dòng),即由程序調(diào)用相應(yīng)的API 來實(shí)現(xiàn)數(shù)據(jù)的存取。
SQLite 是D. Richard Hipp 在2000 年開發(fā)的一個(gè)小型嵌入式數(shù)據(jù)庫。它是完全獨(dú)立的,不具有外部依賴性, 可以較為方便地應(yīng)用于嵌入式系統(tǒng)中。其源代碼完全開放, 可以免費(fèi)用于任何用途。
2.1 SQLite體系結(jié)構(gòu)
SQLite體系結(jié)構(gòu)如圖1所示。主要由以下幾個(gè)主要的子系統(tǒng)組成:接口(Interface)是一個(gè)C語言庫,即使使用的是不同語言的API,在底層執(zhí)行的都是C語言庫。從接口接收到命令后傳到SQL命令處理器(SQL Command Processor),SQL命令處理器是由三個(gè)獨(dú)立的步驟組成:標(biāo)志處理器(Tokenizer)、分析器(Parser)、代碼生成器(Code Generator)。虛擬機(jī)(Virtual Machine)是為操作數(shù)據(jù)庫文件而執(zhí)行的一個(gè)抽象的計(jì)算機(jī)引擎。在虛擬機(jī)和低層存儲(chǔ)、恢復(fù)程序之間,SQLite使用了一個(gè)抽象層執(zhí)行B-樹,頁面緩沖(Pager),和操作系統(tǒng)接口(OS Interface)。B-樹結(jié)構(gòu),用于存儲(chǔ)數(shù)據(jù)庫到磁盤,這樣可以通過減少磁盤的查找來達(dá)到快速訪問數(shù)據(jù)的目的。頁面緩沖主要處理讀、寫以及B-樹存儲(chǔ)機(jī)制所需的數(shù)字緩沖,包括為了保證事務(wù)原子性的回退及提交操作所需的緩沖。操作系統(tǒng)接口主要是為了方便在不同平臺(tái)的操作而執(zhí)行的一個(gè)底層與操作系統(tǒng)有關(guān)的抽象層。
2.2SQLite開發(fā)技術(shù)
在SQLite數(shù)據(jù)庫中,可由程序直接調(diào)用相應(yīng)的API函數(shù)去實(shí)現(xiàn)對(duì)數(shù)據(jù)的存取操作。主要的函數(shù)有:
(1)打開數(shù)據(jù)庫
int sqlite3_open(
const char *filename, /*數(shù)據(jù)庫文件名*/
int mode, /*0777可讀寫0444只讀*/
sqlite3 * *ppDb /*輸出SQLite數(shù)據(jù)庫句柄/*
);
上述程序是指打開一個(gè)數(shù)據(jù)庫,如果不存在則自動(dòng)創(chuàng)建。第一個(gè)參數(shù)指定文件名,第三個(gè)參數(shù)則是定義sqlite3 * *ppDb結(jié)構(gòu)體指針,相當(dāng)于一個(gè)數(shù)據(jù)庫句柄。
(2)關(guān)閉數(shù)據(jù)庫
int sqlite3_close(sqlite3 *) /*參數(shù)就是打開時(shí)的結(jié)構(gòu)體,也就是數(shù)據(jù)庫句柄。*/
(3)執(zhí)行SQL
int sqlite3_exec(
sqlite3 *, /*已經(jīng)打開的數(shù)據(jù)庫句柄*/
const char *sql, /*要執(zhí)行的sql語句*/
sqlite_callback, /*回調(diào)函數(shù)*/
void*, /*傳遞給回調(diào)函數(shù)的參數(shù)*/
char **errmsg, /*保存錯(cuò)誤信息*/
);
也就是函數(shù)功能是執(zhí)行一條或者多條SQL語句,SQL語句之間用(;)號(hào)隔開。建議在執(zhí)行一條或者多條SQL語句的時(shí)候,指定第三個(gè)參數(shù)回調(diào)函數(shù),在回調(diào)函數(shù)中可以獲得執(zhí)行SQL的詳細(xì)過程,如果所有SQL執(zhí)行完畢則返回0,否則,說明這次執(zhí)行并沒有完全成功。如果執(zhí)行失敗(沒有返回0)則可以查看第五個(gè)參數(shù)值來查看詳細(xì)錯(cuò)誤信息。
3 SQLite在ARM-Linux上的移植
本文使用以32位的ARM微處理器S3C2410A為硬件的開發(fā)平臺(tái),采用嵌入式Linux操作系統(tǒng)。要將SQLite3.3.6移植到ARM2410開發(fā)板上,除了要有底層操作系統(tǒng)的支持外,還必須要有相應(yīng)的交叉編譯工具鏈,因此需要首先安裝ARM-Linux工具鏈,具體過程如下。
(1)建立交叉編譯環(huán)境。拷貝cross-2.95.3.tar.bz2到/usr/local目錄下并解壓縮。
cp cross-2.95.3.tar.bz2 /usr/local/arm
tar-jxvf cross-2.95.3.tar.bz2
(2)到http://www.sqlite.org/的cvs中下載最新版本的源代碼包,解壓后生成sqlite目錄。
tar-zxvf sqlite-3.3.6.tar.gz
(3)新建目錄。
cd /sqlite-3.3.6
mkdir build
cd build
../ configure --disable-tcl --host=arm-linux
這樣在build目錄中就將生成Makefile和一個(gè)libtool腳本
(4)修改Makefile文件。
cd build
vi Makefile
將代碼行BCC = arm-linux-gcc -g -O2改成BCC = gcc -g -O2
將下面的這行:
sqlite3$(TEXE): $(TOP)/src/shell.c .libs/libsqlite3.la sqlite3.h
改成:
sqlite3$(TEXE): $(TOP)/src/shell.c .libs/libsqlite3.a sqlite3.h
我們是將sqlite放到arm-linux的硬件板子上運(yùn)行,所以一般將其編譯成靜態(tài)鏈接的形式。保存Makefile文件后退出。
(5)執(zhí)行make命令即可完成編譯。編譯完成后,在build目錄下生成許多.o和.lo文件。執(zhí)行命令arm-linux-strip sqlite3, 去掉其中的調(diào)試信息,這樣文件將減少很多。這樣就可以得到在開發(fā)板上可以直接運(yùn)行的可執(zhí)行文件。
(6)在ARM 板上運(yùn)行sqlite。通過nfs將這些文件下載到開發(fā)板上。
chmod 777 sqlite3
. / sqlite test . sqlite
會(huì)出現(xiàn)
sqlite >
通過以上的操作sqlite 已經(jīng)可以在ARMLinux 下運(yùn)行,然后就可以基于此進(jìn)行進(jìn)一步的應(yīng)用開發(fā)了。
4 基于SQLite的電力故障錄波裝置軟件設(shè)計(jì)
基于嵌入式操作系統(tǒng)和嵌入式數(shù)據(jù)庫SQLite構(gòu)建的錄波裝置的系統(tǒng)結(jié)構(gòu)如圖2所示。數(shù)據(jù)采集模塊低通濾波、采樣保持(S/H)、多路轉(zhuǎn)換(MPX)和模數(shù)轉(zhuǎn)換(A/D)以及微機(jī)主系統(tǒng)幾個(gè)部分組成。在正常情況下,將采到的數(shù)據(jù)保存于緩存區(qū),并且不斷循環(huán)刷新,一旦計(jì)算的啟動(dòng)量滿足啟動(dòng)條件,就按照國(guó)家標(biāo)準(zhǔn)將故障前后各段的數(shù)據(jù)轉(zhuǎn)存到SQLite數(shù)據(jù)庫中,同時(shí)將故障發(fā)生信號(hào)告知監(jiān)控模塊。
電力故障錄波裝置的模擬量數(shù)據(jù)記錄格式是根據(jù)DL/T553-94國(guó)家標(biāo)準(zhǔn)采用分段記錄的方式,以滿足運(yùn)行部門故障分析和數(shù)據(jù)分析的需要。上位機(jī)錄波數(shù)據(jù)的記錄格式采用IEEE標(biāo)準(zhǔn)中的電力系統(tǒng)暫態(tài)數(shù)據(jù)轉(zhuǎn)換通用格式,即COMTRADE標(biāo)準(zhǔn),以便于裝置之間的數(shù)據(jù)共享和故障信息聯(lián)網(wǎng)。
通過以下生成數(shù)據(jù)庫datasave,插入采集數(shù)據(jù)和查詢操作的程序模塊來實(shí)現(xiàn)電力故障錄波裝置中的嵌入式數(shù)據(jù)庫。
sqlite3_open(\"datasave\",0777,zErrMsg);
//打開一個(gè)數(shù)據(jù)庫,如果改數(shù)據(jù)庫不存在,則創(chuàng)建一個(gè)名字為datasave的數(shù)據(jù)庫文件。sqlite3_exec(db,\"create table Data(id integer primary key, time integer, Ia integer, Ib integer, Ic integer, Ua integer, Ub integer, Uc integer);\", NULL, 0, zErrMsg);
//建立采集表
sprintf(value,\"INSERT INTO Data(time, Ia, Ib, Ic, Ua, Ub, Uc \\"
\"VALUES(%d,%d)\",buf[1], buf[2], buf[3], buf[4], buf[5], buf[6], buf[7]);
sqlite_exec(db, value, NULL, NULL, zErrMsg);
//插入采集的數(shù)據(jù)
sqlite3_exec(db, \"select * from Data;', callback, 0, zErrMsg );
// 查詢記錄
5 結(jié)束語
在嵌入式系統(tǒng)中,利用嵌入式數(shù)據(jù)庫對(duì)采集的數(shù)據(jù)進(jìn)行操作和管理是嵌入式系統(tǒng)應(yīng)用發(fā)展方向,它簡(jiǎn)化了應(yīng)用程序的整體開發(fā)過程,提高了用戶存取記錄的效率,實(shí)現(xiàn)了多用戶數(shù)據(jù)的共享。SQLite以它小巧的體積、快速高效、穩(wěn)定可靠、易移植等優(yōu)勢(shì)將成為嵌入式數(shù)據(jù)庫領(lǐng)域的首選。嵌入式數(shù)據(jù)庫SQLite 在電力故障錄波裝置中的應(yīng)用,滿足了嵌入式錄波數(shù)據(jù)處理的需要,為故障錄波系統(tǒng)提供了有力的技術(shù)支持。
參考文獻(xiàn):
[1] 唐濤,諸偉楠,楊儀松,等.發(fā)電廠與變電站自動(dòng)化技術(shù)及其應(yīng)用[M].北京:中國(guó)電力出版社,2005.558-560.
[2] 曾立勝.基于SQLite嵌入式數(shù)據(jù)庫的射頻卡數(shù)據(jù)存儲(chǔ)[J].電腦知識(shí)與技術(shù),2006, (8):3,29.
[3] 黃布毅,張曉華.基于ARM-Linux的SQLite嵌入式數(shù)據(jù)庫技術(shù)[J].單片機(jī)與嵌入式系統(tǒng)應(yīng)用,2005, (4):21-24.
[4] 王京謙,萬蒞新.開源嵌入式數(shù)據(jù)庫BerkeleyDB和SQLite的比較[J].單片機(jī)與嵌入式系統(tǒng)應(yīng)用,2005,(2):5-7,49.
注:本文中所涉及到的圖表、注解、公式等內(nèi)容請(qǐng)以PDF格式閱讀原文