1. 海军潜艇学院 青岛 266071;2. 海军工程大学 武汉 430033
利用LabVIEW开发应用软件时,由于LabVIEW本身并不具备数据库访问功能,常用的解决方法如下[1-3]:
1) 利用NI公司的附加数据库接口工具包LabVIEW SQL Toolkit进行数据库访问。
2) 利用LabVIEW的ActiveX功能,调用Microsoft ADO控件,利用SQL语言实现数据库访问。
3) 利用其他语言如VisualC++编写DLL程序访问数据库,再利用LabVIEW所带的DLL接口——调用库函数节点CLFN(Call Library Function Node)访问该程序,这样可以实现间接访问数据库。
4) 利用免费的LabVIEW数据库访问工具LabSQL。
LabSQL的开发是在LabVIEW中利用ActiveX功能,通过调用Microsoft ADO控件,结合SQL语言,并通过ODBC接口函数库驱动程序实现对数据库的访问,其结构层次见图1。
图1 数据库访问结构层次
Microsoft ADO是微软最新的数据访问技术[4],通过编程模型实现对数据库的操作。编程模型是访问和更新数据源所必需的操作顺序,它概括了的全部功能。ADO的目标是访问、编辑和更新数据源;利用ADO所提供的类和对象可以完成以下操作:
1) 连接到数据源;
2) 指定访问数据源的命令同时可带变量参数或优化执行;
3) 执行命令;
4) 如果这个命令使数据按表中行的形式返回,则将这些行存储在易于检查、操作或更改的缓存中;
5) 可使用缓存行的更改内容来更新数据源;
6) 提供常规方法检测错误。ADO对象模型如图2所示。
图2 ADO对象模
这些操作都是对数据库最基本的操作,可以分为Connection、Command、Recordset等三类,在应用程序开发过程中,为实现对数据库进行访问,这些操作方法以子函数的形式进行封装,例如经过封装后的SQL Execute.vi,SQL Fetch Data.vi等函数便可直接进行调用,按照输入的SQL命令可实现数据库的不同操作。
利用LabSQL访问数据库的基本步骤是连接数据库、执行操作、断开数据库连接等三个步骤,用户在执行操作阶段输入不同的SQL命令,可实现不同的数据库操作,包括查询全部数据记录、按条件查询数据、添加记录、删除记录等。
在开发某自动测试系统过程中,由于有大量的测试信息需要存入数据库记录,同时为了满足方便日后查询的需要,测试系统应用软件包含了用于数据库管理操作的应用程序,通过点击系统管理用户界面的“数据库管理”便可进入数据库管理应用程序。在开发过程中,选用Access作为数据库,在LabVIEW中使用LabSQL工具包对数据库进行访问。
测试平台的数据库名称为Test.mdb,该数据包含两个数据表项,分别是test_condition和test_reslut;这两个表是进行数据库操作的基础。通过控制面板中的数据源(ODBC)设置工具,对Test.mdb进行数据源的注册设置。开发的数据库管理用户界面如图3所示。该界面分三个区域,分别是操作提示区、操作区、结果显示区等三个部分。
图3 数据库管理界
操作提示区用于提示用户如何进行相关的数据库操作。操作区用于具体的数据库操作,用户可按测试时间、被测电路板名称、测试结果等三个索引对测试结果数据进行查询、打印、删除等操作。在进行该部分程序开发时,为避免用户直接输入SQL查询语句,在编程上将SQL查询语句放入后台进行处理,用户仅需根据提示区的提示,在查询命令框中输入简单的关键词即可实现对数据库的操作。
为实现对数据库的操作管理以及数据获取的需要,以下子函数在数据库管理应用程序得开发过程中扮演者重要的角色。
1) Insert Table.vi,该子函数用于将测试结果写入数据库。该函数的主要操作对象是test_result数据表,将该子函数进行封装,见图4。
图4 封装后的
函数图标留有若干输入输出端口,主要的数据连接端口有DSN(database source name,数据源名称)端口、board_name(电路板名称)端口、f1_value(输出信号频率测量值)、amp1_value(输出信号幅度测量值)、f1_standard(输出信号频率标准值)、amp1_standard(输出信号幅度标准值)、result(测试结论)等端口。
DSN端口用于打开数据库中的存储测试结果表项;board_name用于将当前被测电路板的名称存入数据库,便于查询索引;f1_value和amp1_value为被采集信号经过分析后的测量值;f1_standard和amp1_standard来自测试条件数据表,这两个值的获取也是通过数据库操作函数得到的;result来自测试结果处理子函数,若被测电路板通过测试,则表达为“合格”,反之为“不合格”。
2) _fetch one element.vi,该子函数用于从数据库中获取一个值,主要用于程序开发时的参数获取,例如获得电路板X的输入信号的频率值。该子函数的操作对象主要是test_condition数据表,获取的值主要用于传送给信号源模块PXI-5412的参数设置端。源代码程序见图5,封装后的程序见图6。
图5 取单个元素的图形化源代
图6 取单个元素子函数程
DSN端口用于打开数据库中的测试条件表项;board_name端口作为查询的行索引,取出与电路板名称相符的测试条件数据;parameter(参数名)端口的输入作为查询的列字段索引;输出端口output1和output2为类型不同的输出,分别是数值型和字符型。例如,为取得电路板X的输入信号的频率值,那么在board_name端口输入字符串“X”,在parameter端口输入signal1_f,那么在程序运行时,从output1端口,就可从数据库的测试条件test_condition表中获得电路板X输入信号的频率值。
3) DB_delete.vi,该子程序用于将查询结果从数据库中进行删除操作。
以上几个数据库操作子函数是数据库管理应用程序开发时常用的函数,在开发过程中,对上述的功能子函数进行适当的调用或二次开发封装可以满足对不同数据获取的要求。
在数据库管理软件的开发过程中,虽然利用了LabSQL工具包,但不可避免地要用到简单的SQL查询命令语句。在开发的过程中,常用到的SQL语句有以下几种。
1) 数据查询。在SQL语句中使用SELECT可以对数据进行查询,一般格式如下:
SELECT<查询内容>FROM<表或视图>WHERE<条件>ORDER BY<列名>。
开发时常用到的SQL语句有查询全部测试结果记录语句:
SELECT * FROM test_result
查询指定方式的SQL语句为:
SELECT * FROM test_result WHERE Test_time=‘060920’
2) 插入记录。向测试结果数据表中插入一次测试的结果记录时,SQL语句格式为:
INSERT INTO <表名>(<列名1>,……)VALUES(<列值>,……)
向测试结果表test_result中插入记录的SQL语句如下:
INSERT INTO test_result (Test_time,bord_name,f1_value,amp1_value,f1_standard, amp1_standard , result) VALUES(<列值>,……)
3) 删除记录。删除记录的SQL语句格式为:
DELETE FROM <表名>WHERE<条件>
下面是对查询结果进行删除的SQL语句:
DELETE FROM test_result WHERE board_name=‘XX’
当程序执行完上述语句后,在rest_result表中,所有关于电路板XX的测试信息全部被删除。可以根据删除条件的不同,删除不同的测试信息。
实践证明,在LabVIEW中使用LabSQL来调用数据库非常方便、简单,无需深入了解ActiveX技术和SQL语言,只需知道各VI的功能和数据库的设计及相关概念,即可设计出满足要求的程序。由于LabSQL不具备开发远程数据访问功能,在涉及到远程数据访问问题时,必须使用其他方法。由此可见LabSQL值得应用于要求不是很复杂的数据库开发。
[1] 尹仁平,刘 刚,汪立新,乔云生.LabVIEW中的数据库访问[J].电子测量技术,2006,29(3):51-52.
[2] 毕 虎,律方成,李燕青,李和明.LabVIEW中访问数据库的几种不同方法[J].微计算机信息,2006,22(1):131-134.
[3] 罗文辉.LabVIEW中的数据库访问[J].武汉理工大学学报,2006,28(3):13-16.
[4] 刘 玉,董志斌,吴建军,孟 宏.基于ADO技术的LabVIEW访问数据库的方法[J].国外电子测量技术,2003(增刊):55-56.