嵌入式数据库SQLite在故障录波中的应用

时间:2022-08-28 06:37:21

嵌入式数据库SQLite在故障录波中的应用

嵌入式数据库SQLite在故障录波中的应用

唐瑜,成乐祥,洪婧

(东南大学 电气工程学院,江苏 南京 210096)

摘要:介绍了SQLite的技术特点和体系结构;结合嵌入式软硬件平台提出在电力故障录波装置中使用SQLite数据库实现故障录波的解决方案;详细说明了SQLite在Arm-Linux平台上的应用开发、交叉编译和移植过程;最后通过一个应用实例说明了SQLite的实现过程。

关键词:嵌入式数据库;SQLite;电力故障录波

中图分类号:TP311文献标识码:A文章编号:1009-3044(2008)17-21373-02

1 引言

故障录波器是电力系统发生故障及振荡时能自动记录的一种装置,在发生故障或振荡时进行录波。近年来,随着电子技术的迅速发展,故障录波器采用嵌入式系统设计是一个发展方向。由于故障录波器需要采集的数据量大,科学的存储和管理这些数据对于提高录波器的性能起到重要的作用。

目前,常用的实时数据存储和管理的方法有3种:(1)根据具体的存储器硬件人为地设计存储管理算法。这种方法简单直接,但是软件的可移植性差,对于复杂的算法很难达到高可靠性的要求;(2)利用嵌入式操作系统提供的文件API,以文件的方式实现数据的存储和管理。由于多数嵌入式操作系统(Windows CE、Linux等)都以独占的方式访问文件,所以这种方法IO开销大,访问效率低,数据共享性较差;(3)借助嵌入式数据库实现数据存储和管理。数据库通过事务来进行调度与并发控制,可有效地对数据进行存取、查询等共享操作,同时借助数据库所具有的安全性和完整性检验等多种安全措施,可确保系统具有较好的整体性能。本文在分析了SQLite嵌入式数据库内部结构和开发技术的基础上,提出了基于嵌入式数据库SQLite的故障录波装置的软件设计方法。

2 SQLite体系结构及开发技术

嵌入式数据库系统是指支持某种特定计算模式或移动计算的数据库管理系统,它通常与操作系统和具体应用集成在一起, 运行在智能型嵌入式设备或移动设备上。嵌入式数据库的使用是采用程序驱动,即由程序调用相应的API 来实现数据的存取。

SQLite 是D. Richard Hipp 在2000 年开发的一个小型嵌入式数据库。它是完全独立的,不具有外部依赖性, 可以较为方便地应用于嵌入式系统中。其源代码完全开放, 可以免费用于任何用途。

2.1 SQLite体系结构

SQLite体系结构如图1所示。主要由以下几个主要的子系统组成:接口(Interface)是一个C语言库,即使使用的是不同语言的API,在底层执行的都是C语言库。从接口接收到命令后传到SQL命令处理器(SQL Command Processor),SQL命令处理器是由三个独立的步骤组成:标志处理器(Tokenizer)、分析器(Parser)、代码生成器(Code Generator)。虚拟机(Virtual Machine)是为操作数据库文件而执行的一个抽象的计算机引擎。在虚拟机和低层存储、恢复程序之间,SQLite使用了一个抽象层执行B-树,页面缓冲(Pager),和操作系统接口(OS Interface)。B-树结构,用于存储数据库到磁盘,这样可以通过减少磁盘的查找来达到快速访问数据的目的。页面缓冲主要处理读、写以及B-树存储机制所需的数字缓冲,包括为了保证事务原子性的回退及提交操作所需的缓冲。操作系统接口主要是为了方便在不同平台的操作而执行的一个底层与操作系统有关的抽象层。

2.2SQLite开发技术

在SQLite数据库中,可由程序直接调用相应的API函数去实现对数据的存取操作。主要的函数有:

(1)打开数据库

int sqlite3_open(

const char *filename, /*数据库文件名*/

int mode, /*0777可读写0444只读*/

sqlite3 * *ppDb /*输出SQLite数据库句柄/*

);

上述程序是指打开一个数据库,如果不存在则自动创建。第一个参数指定文件名,第三个参数则是定义sqlite3 * *ppDb结构体指针,相当于一个数据库句柄。

(2)关闭数据库

int sqlite3_close(sqlite3 *) /*参数就是打开时的结构体,也就是数据库句柄。*/

(3)执行SQL

int sqlite3_exec(

sqlite3 *, /*已经打开的数据库句柄*/

const char *sql, /*要执行的sql语句*/

sqlite_callback, /*回调函数*/

void*, /*传递给回调函数的参数*/

char **errmsg, /*保存错误信息*/

);

也就是函数功能是执行一条或者多条SQL语句,SQL语句之间用(;)号隔开。建议在执行一条或者多条SQL语句的时候,指定第三个参数回调函数,在回调函数中可以获得执行SQL的详细过程,如果所有SQL执行完毕则返回0,否则,说明这次执行并没有完全成功。如果执行失败(没有返回0)则可以查看第五个参数值来查看详细错误信息。

3 SQLite在ARM-Linux上的移植

本文使用以32位的ARM微处理器S3C2410A为硬件的开发平台,采用嵌入式Linux操作系统。要将SQLite3.3.6移植到ARM2410开发板上,除了要有底层操作系统的支持外,还必须要有相应的交叉编译工具链,因此需要首先安装ARM-Linux工具链,具体过程如下。

(1)建立交叉编译环境。拷贝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)到/的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和一个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的硬件板子上运行,所以一般将其编译成静态链接的形式。保存Makefile文件后退出。

(5)执行make命令即可完成编译。编译完成后,在build目录下生成许多.o和.lo文件。执行命令arm-linux-strip sqlite3, 去掉其中的调试信息,这样文件将减少很多。这样就可以得到在开发板上可以直接运行的可执行文件。

(6)在ARM 板上运行sqlite。通过nfs将这些文件下载到开发板上。

chmod 777 sqlite3

. / sqlite test . sqlite

会出现

sqlite >

通过以上的操作sqlite 已经可以在ARMLinux 下运行,然后就可以基于此进行进一步的应用开发了。

4 基于SQLite的电力故障录波装置软件设计

基于嵌入式操作系统和嵌入式数据库SQLite构建的录波装置的系统结构如图2所示。数据采集模块低通滤波、采样保持(S/H)、多路转换(MPX)和模数转换(A/D)以及微机主系统几个部分组成。在正常情况下,将采到的数据保存于缓存区,并且不断循环刷新,一旦计算的启动量满足启动条件,就按照国家标准将故障前后各段的数据转存到SQLite数据库中,同时将故障发生信号告知监控模块。

电力故障录波装置的模拟量数据记录格式是根据DL/T553-94国家标准采用分段记录的方式,以满足运行部门故障分析和数据分析的需要。上位机录波数据的记录格式采用IEEE标准中的电力系统暂态数据转换通用格式,即COMTRADE标准,以便于装置之间的数据共享和故障信息联网。

通过以下生成数据库datasave,插入采集数据和查询操作的程序模块来实现电力故障录波装置中的嵌入式数据库。

sqlite3_open("datasave",0777,&zErrMsg);

//打开一个数据库,如果改数据库不存在,则创建一个名字为datasave的数据库文件。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 \n"

"VALUES(%d,%d)",buf[1], buf[2], buf[3], buf[4], buf[5], buf[6], buf[7]);

sqlite_exec(db, value, NULL, NULL, &zErrMsg);

//插入采集的数据

sqlite3_exec(db, "select * from Data;', callback, 0, &zErrMsg );

// 查询记录

5 结束语

在嵌入式系统中,利用嵌入式数据库对采集的数据进行操作和管理是嵌入式系统应用发展方向,它简化了应用程序的整体开发过程,提高了用户存取记录的效率,实现了多用户数据的共享。SQLite以它小巧的体积、快速高效、稳定可靠、易移植等优势将成为嵌入式数据库领域的首选。嵌入式数据库SQLite 在电力故障录波装置中的应用,满足了嵌入式录波数据处理的需要,为故障录波系统提供了有力的技术支持。

参考文献:

[1] 唐涛,诸伟楠,杨仪松,等.发电厂与变电站自动化技术及其应用[M].北京:中国电力出版社,2005.558-560.

[2] 曾立胜.基于SQLite嵌入式数据库的射频卡数据存储[J].电脑知识与技术,2006, (8):3,29.

[3] 黄布毅,张晓华.基于ARM-Linux的SQLite嵌入式数据库技术[J].单片机与嵌入式系统应用,2005, (4):21-24.

[4] 王京谦,万莅新.开源嵌入式数据库BerkeleyDB和SQLite的比较[J].单片机与嵌入式系统应用,2005,(2):5-7,49.

注:本文中所涉及到的图表、注解、公式等内容请以PDF格式阅读原文

上一篇:结构化方法学与面向对象方法学在软件开发中的... 下一篇:个人用户木马病毒的防范与清除