黄 丽,黄 辉,仝秋红
(1.武汉科技大学城市学院信息工程学部,湖北武汉430083;2.中国电力工程顾问集团中南电力设计院,湖北武汉430070;3.长安大学汽车学院,陕西西安710064)
目前,为了满足快速故障定位和故障诊断的要求,车辆故障诊断系统朝着智能化和小型化的方向发展,嵌入式技术得到了广泛的应用。在此类系统中,不便于采用大型的数据库对数据进行管理。SQLite嵌入式数据库具有体积小、速度快、维护方便、接口丰富等优点,将其应用到发动机故障诊断系统中,极大提高了故障诊断系统中数据管理的效率。
SQLite是一款开源文件型数据库,在嵌入式系统中广泛应用。它具备一般关系型数据库的基本特征,如SQL语法、事务处理、数据表管理和索引。作为嵌入式数据库,又具备容量小、可靠性高、管理简单、维护方便等特征,生成的数据库文件可以在各个平台无缝移植,可以静态库和动态库的形式植入嵌入式系统中。
SQLite的主要优点[1]如下:(1)源代码开放。一个完整的数据库在系统中以单文件的形式存在,支持数据库大小至2TB。(2)SQLite并非数据库服务器,它和程序运行在同一进程,速度快,节省了系统调度时间。(3)体积小,运行时占用资源少,无需管理,广泛适用于嵌入式或移动设备。(4)部署数据库操作简单易行,直接在应用程序的进程中以零配置模式运行。(5)单一磁盘文件,容易实现数据库的共享访问。(6)简单易用的API接口。
本系统结合故障树分析法和产生式规则的诊断专家系统,以QT和嵌入式SQLite数据库作为开发平台,实现了基于嵌入式数据库的发动机故障诊断功能,该系统的框架结构如图1所示。
图1 故障诊断系统的框架结构图
系统主要由三大部分组成。
2.1.1 数据采样模块
采集传感器信息,并将这些信息经过预处理和转换保存到实时数据库中。主要采集的信息有:燃油压力、进气管路的真空度、燃油管内的压力、空气流量、转速等。
2.1.2 推理诊断模块
整个诊断系统的核心部分,完成对知识库数据的增加、修改、删除、查询等操作,运用获取的诊断信息和相关知识完成诊断任务,并完善系统的知识库,提高系统诊断能力。主要包括知识库的知识管理维护和自学习功能、推理机引擎及动态数据库的实现。
2.1.3 人机交互模块
系统的控制和协调机构,通过接口从用户处获得信息,引导用户参与诊断过程,回答系统提出的问题及完成系统相关操作指示。主要以图形的方式显示诊断结果,提供丰富多样的呈现形式,如曲线、表格、消息框等。其中曲线用来显示温度和压力等缓变量的变化趋势,表格用来统计诊断结果,消息框则以消息方式提供诊断建议。
系统根据故障源和故障现象之间的因果关系构建了故障树模型。以“发动机启动异常振动”为例,建立故障树如图2所示。故障树中从顶事件到底事件的路径,对应知识库规则的前提,基本事件对应规则的结论,如故障源或故障原因[2]。
图2 发动机启动异常振动故障树诊断图
根据以上分析,设计的“发动机启动异常振动”数据库表文件结构如表1—表4所示[3]。
表1 基本事实数据表abnvibration.db
表2 故障树数据表faltree.db
表3 规则前件数据表forule.db
表4 规则后件数据表bkrule.db
在SQLite提供的C/C++接口中,其中5个APIs属于核心接口,即数据库操作的5个基本函数,其函数功能、语法结构及参数介绍如下[4]。
3.1.1 sqlite3_open
打开数据库函数,操作SQLite数据库的入口函数。
int sqlite3_open(
const char*filename, /*数据库文件路径(UTF-8编码)*/
sqlite3**ppDb, /*输出:SQLite数据库句柄*/
);
3.1.2 sqlite3_close
关闭数据库函数。
int sqlite3_close(sqlite3*);/*使用该函数可以关闭数据库*/
3.1.3 sqlite3_prepare
数据库操作函数,执行SQL语句。
int sqlite3_prepare_v2(
sqlite3*db, /*打开的数据库句柄*/
const char*zSql, /*UTF8编码的SQL语句,可以参数化*/
int?nByte, /*SQL语句的字节长度,可以传递-1,即字符串以宽字符 结尾*/
sqlite3_stmt**ppStmt,/*输出:预编译之后的SQL语句句柄*/
const?char**pzTail,/*输出:指向zSql缓冲区中跳过有效SQL字符串的第一个字节*/
);
3.1.4 sqlite3_bind
以下函数的第一个参数指代预编译的SQL句柄,第二个参数指代绑定的参数编号,对应于参数化的SQL语句中的参数编号:
int sqlite3_bind_int(sqlite3_stmt*,int,int);/*该函数绑定int整数*/
int sqlite3_bind_text(sqlite3_stmt*,int,const char*,int n,void(*)(void*));/*该函数绑定一段字符串,源字符串是UTF8编码的*/
3.1.5 sqlite3_step
int sqlite3_step(sqlite3_stmt*);数据库操作的执行函数。
3.2.1 为何使用内存数据库
主要为了提高运行效率,因为在内存数据库中对进程的操作速度较快,通过实验测试数据表明,内存中进程运行速度比在NandFlash中快2倍。
3.2.2 使用 NandFlash数据库
为了避免sqlite3中的数据库在掉电时数据的丢失,系统采用了NandFlash作为存储介质,这样,即使掉电数据库内数据也能保存完好。但是NandFlash的单块的频繁擦写将影响其使用寿命。因此要采用大容量的NandFlash,通过文件系统的均衡算法,实现整块NandFlash的平均擦写,以保证NandFlash的使用寿命。
3.2.3 不同进程间使用内存数据库如何共享
通过文件加锁来实现共享。SQLite引擎通过数据库级的独占性和共享锁定来处理事务,通过文件锁来实现多进程或线程共享数据库。
基于SQLite嵌入式数据库实现的故障诊断系统流程图如图3所示,数据库实现主要包括两大进程:数据采集进程和故障诊断进程,两个进程通过内存数据库进行共享。
3.3.1 数据采集进程
在数据采集进程中,数据采集驱动模块在linux内核中完成。再将采集到的数据写到实时数据库中。由于两个进程共享一个内存数据库文件,为了避免两个进程的写数据冲突,在访问该数据库文件时必须要加锁。同时,将采集的数据保存到NandFlash数据库中,用于故障回溯。
3.3.2 故障诊断进程
在故障诊断进程中,对采集的数据要进行过滤,从而减少系统诊断过程中的负载。首先将NandFlash故障码数据库中的故障码表加载到内存中,加载的目的是提高检索效率,加快数据的增、删、改、查的执行速度。若查找到与之匹配的故障码,则通过人机界面显示诊断结果。否则,将NandFlash故障树数据库中的故障树加载到内存中。这里用到NandFlash的主要目的是,当诊断系统掉电后,可追忆发动机的故障征兆。最后,通过基于规则的故障树的搜索算法,查找出相应的故障原因,并给出故障结果及诊断建议。
图3 故障诊断系统流程图
本文设计和实现了基于SQLite嵌入式数据库的发动机故障诊断系统,结合嵌入式系统的优点,采用故障树和产生式规则相结合的故障分析方法和知识表示方法进行规则提取和表示,建立了嵌入式系统故障诊断模型,发挥了嵌入式系统实时诊断的优势,提高了系统诊断效率,并为其他嵌入式故障诊断系统的设计提供了参考。
[1]韩善锋,曹凤海,易昌华.SQLite数据库在嵌入式程序开发中的应用[J].物探装备,2011,21(3):170-173;178.
[2]刘红梅.基于Visual Prolog语言的电喷发动机故障诊断系统的研究[D].西安:长安大学,2005.
[3]黄丽,仝秋红,蹇小平.电喷发动机故障诊断专家系统知识库与推理机的构建[J].电子科技.2007年第1期.
[4]Hipp,Wyrick&Company,Inc.SQLite [EB/OL].(2010 -08 -09).[2011 -07 -20].http:∥www.sqlite.org.