1. 引言
在某装备的板级测试和系统级测试过程中,采用的主要数据采集与处理软件为LabWindows/CVI [1] ,能完成多种信号的采集、处理和显示功能,用来检测产品的功能和性能。该装备的检测数据繁多,目前在各种测试中多采用截取关键测试界面参数或是使用txt文档保存部分关键参数的方式对检测结果进行保存,并没有形成一种统一的方式对检测数据进行存储,且检测数据也无法进行查询,因此急需一种数据存储系统实现该装备的检测数据信息化目标。
LabWindows/CVI [2] 是一种常用的虚拟仪器软件开发环境,将C语言与数据采集、分析以及显示工具结合,并提供丰富的库函数和硬件驱动函数库,用于数据采集、数据处理和显示等功能。在目前的自动测试系统 [3] 中多使用Access [4] 、MYSQL [5] 等专用的数据库进行数据存储,如马战磊结合Access数据库特点对继电保护装置基础测试模块进行配置,实现了基础模块数据存储功能 [6] ;赵笠铮针对数据存储体系化和规范化的要求,使用MYSQL对行波管测试数据进行了本地化存储 [7] 。然而,Access和MYSQL等专用数据库受软件平台、操作系统、轻量化以及灵活性的影响,对数据插入和删除操作的限制比较多,且结构比较复杂,不利于用户掌握。而XML数据库 [8] [9] 使用纯文本的XML文件存储数据,不受操作系统、软件平台的限制,使用自描述语言描述数据的语义,能直接在WEB上进行树形结构显示,使用简单、操作便捷,具有良好的发展前景。
2021年发布的新版GJB 5000B军用软件成熟度模型 [10] 规定了军用软件论证、研制、试验和维护活动中的相关实践,适用于军用软件论证、研制、试验和维护能力的评价和过程改进。在该标准中,对软件研制过程的多个实践中新增了软件重用的要求,鼓励软件重用。软件重用 [11] 是利用现有的软件工程产品构建新的软件系统,能在有限的时间内快速开发符合功能要求的软件产品。软件重用的核心是软件的可重用构件技术 [12] ,在已经形成相关体系的软件研制单位,可重用构件已经通过各种测试,能在保证软件产品质量的基础上,大大提高软件开发效率。
本文考虑开发环境一致性和GJB 5000B软件重用要求,结合该装备的测试数据特点,使用LabWindows/CVI为该装备的自动测试系统建立XML数据库,实现数据的存储和管理功能,为装备检测数据的信息化提供支撑。同时,在软件编程时使用可重用技术,有效解决了专业内检测数据存储构件的重用问题,为军事装备保障提供了效益。
2. 数据库
2.1. XML数据存储
XML [13] [14] (Extensible Makeup Language:可扩展标记语言)是一种用于标记数据和定义数据类型的标记语言,能用简单的文本格式在Web上表示结构化信息。它拥有强大的数据格式表达能力,几乎所有的数据结构都可以用XML文本格式的形式表达出来。其开发不依赖任何软件操作系统和编程环境,几乎可以在任何平台上采用编程语言进行程序开发。
XML文件最基本的构成是:XML声明 + XML元素。XML声明表明文档按照XML文件的标准对数据进行标记;XML元素的语法格式为:〈标签〉文本内容〈/标签〉,元素中还可以再嵌套其它元素。除了元素,XML文档中还可以出现的处理指令、注释、属性等其它可选内容。
XML格式的文档可构成XML数据库,能方便进行数据存储和查询等操作,具有良好的拓展性、灵活性以及数据存储格式,目前得到越来越广泛的运用。
2.2. LabWindows/CVI对XML的访问方式
LabWindows/CVI也具备强大的XML处理和分析能力,支持XML文档的新建、装载、保存和获取等操作。在LabWindows/CVI的toolbox工具箱中自带“cvixml.fp”文件,将其加入工程文件中,即可方便的使用其中CVIXMLLoadDocument()、CVIXMLGetRootElement()等函数,用来实现对XML文档进行处理。
2.3. XML数据库设计
本文使用XML数据库存储用户信息以及测试结果,实现测试信息存储、数据处理、生成报表等功能。设计的数据库内容如图1所示:

Figure 1. System database composition diagram
图1. 系统数据库组成图
根据测试结果和存储、查询特点,将系统数据库中的XML格式文件分为两种类型,一种存储总的测试结果,包括测试项目、测试编号、测试人员代码以及测试时间;另一种存储单次具体测试结果,包括检测条目、技术条件、检测结果以及备注。数据库中,总测试结果XML文件仅有一个,作为一级数据查询依据;单次具体测试结果随着测试次数增加,存储单次测试的具体检测条目,作为二级数据查询结果。在数据查询时,先从总测试结果XML文件中进行一级查询,然后根据一级查询结果进行二级数据查询。
3. 数据存储模块
3.1. 数据存储模块接口设计
数据存储模块将检测数据保存为XML固定格式数据库。根据数据库设计,在单次测试项目数据存储时,数据存储模块将数据分为两级进行存储,一级为总测试结果,存储于总测试结果XML中,命名为totalinfo.XML,存储在固定目录下;二级为具体测试结果,存储于以单个固定格式命名的XML文件中,存储在和totalinfo.XML相同的目录下,名称根据本次测试项目确定。数据存储模块的外部接口图如图2所示:

Figure 2. Data storage module external interface diagram
图2. 数据存储模块外部接口图
其中,Saveinfo函数接收外部程序传递的参数并执行数据存储功能;totalinfo.XML文件在固定目录格式下存储总测试信息;存储具体测试信息的XML文件在对应目录下生成并存储具体测试信息。
3.2. 数据存储程序设计
为方便外部程序调用,并考虑可重用需求,使用函数调用的方式接收外部程序传递的参数并执行数据存储功能,函数名称为Saveinfo。该函数的功能主要包括两种:一是根据XML数据库文件所在路径创建XML数据库文件;二是外部测试数据并将数据存储在totalinfo.XML和具体测试信息XML文件中。考虑测试数据和函数调用需求,将Saveinfo函数形式参数设计为9个:接收外部程序传递的time (测试时间)、testperson (测试人员)、mineNO (测试编号)、tabletitle (测试表格名称)、str1[] (测试表格列标题,二维数组)、str2[] (测试表格具体检测信息,二维数组)、row (检测表格信息总行数)、column (检测表格信息总列数)、dirstr (检测文件存储目录名称)。Saveinfo的函数参数不仅包含XML数据库的存储结果信息,还包含dirstr等存储相关信息,方便创建每个XML数据库地址。
XML数据存储流程如图3所示:

Figure 3. XML data storage flowchart
图3. XML数据存储流程图
3.2.1. LabWindows/CVI建立XML数据库文件
LabWindows/CVI在进行数据存储时需要建立两种XML数据库文件,一个是用于存储总的测试信息的数据库文件totalinfo.XML,另一个是用于存储单次测试信息的XML数据库文件。建立XML数据库文件时,首先要根据需要,建立XML数据库文件所在路径。
两种数据库文件的路径即可提前进行建立,也可通过程序单独建立。在上位机首次运行该程序时,两种数据库文件路径通常均由程序进行建立。首先根据所要存储XML数据库的路径,查找上位机中该路径是否存在以及该XML文件是否存在。本文使用Directory Utilities库中的SetDir()查找路径。若路径存在,则直接在该路径下生成XML数据库文件;若不存在,则使用MakeDir()函数新建XML数据库文件所在路径。
路径建立完毕后,即可建立XML文件。为防止程序发生错误,保证程序的可靠运行,增加CVIXMLLoadDocument()文件加载函数,判断XML文件是否存在。不存在时,则使用CVIXMLNewDocument()函数创建新的XML文件,此函数能传递XML文档名称参数。最后应使用CVIXMLSaveDocument ()函数对新增文件进行保存。
3.2.2. LabWindows/CVI数据存储
XML数据存储时,首先通过CVIXMLGetRootElement()创建该XML文档的根节点,对于一个XML文档来说,根节点仅有一个。接着通过CVIXMLNewElement()和CVIXMLSetElementValue()函数创建元素并为元素赋值。所有元素值创建完毕后,通过CVIXMLSaveDocument()保存XML文档。最后,必须通过CVIXMLDiscardElement()、CVIXMLDiscardElement()、CVIXMLDiscardDocument()销毁函数句柄。
在具体实施时,需要对数据存储结构进行设计,并根据数据存储结构对数据进行格式转换。按照图一中数据库结构设计,对于totalinfo.XML,设置根节点“总测试信息”以及子节点“测试信息”,其中子节点包含“测试项目”、“测试编号”、“测试人员代码”和“测试时间”信息,并根据测试次数的增加而增加。程序中使用格式化和连接函数构造相应的子节点。子节点的格式设计为:〈测试信息〉测试项目 = ’xxx’测试编号 = ’xxx’测试人员代码 = ’xxx’测试时间 = ’xxx’,其中’xxx’中的xxx为存储的单次具体信息。对于单次测试信息XML文件,设置根节点名称为具体测试名称,一级子节点设置为标题信息和测试条目两种,其中标题信息包含二级子节点为测试结果的标题,即测试结果表每一栏的信息,测试条目包含所有的测试条目的检测结果,其格式与totalinfo.XML子节点格式保持一致。
3.3. 数据存储可重用构件生成
XML数据存储功能由Saveinfo函数完成。本程序设计的Saveinfo函数参数包含某装备测试过程中的所有必须存储信息,故在该装备板级和系统级测试过程中,均可调用该函数进行数据存储,极大地提高了该数据存储模块的可重用率。该模块还可通过增加Saveinfo函数参数增加数据存储内容,可以很方便地进行拓展。考虑函数调用对软件编程平台的限制,本文还将数据存储模块生成动态链接库(Dynamic Link Library,简称DLL) [15] 可重用构件,方便使用。DLL是一种不可执行的二进制程序,允许程序共享代码,并隐藏实现的底层程序,能省内存和减少交换操作,并可被多个编程语言调用。
LabWindows/CVI生成DLL时,首先新DLL工程,通过选择Edit->Insert Construct->DllMain生成DllMain、DLLEntryPoint以及MyDLLStdFunction函数,然后在该工程中,通过在Build->Target Settings中配置IDE函数,使DLL能被外部程序加载和调用。最后,LabWindows/CVI生成DLL、.lib、.h文件,即可加载进其它工程文件中,被外部函数调用。
4. 数据查询和打印模块
4.1. 数据查询和打印界面设计
根据系统数据库设计和查询需要,将数据查询和打印界面分为4个部分,分别是标题区、一级结果显示区、二级结果显示区和功能选择区,如图4所示。标题区展示系统名称;一级结果显示区由“测试类型选择”下拉框和下面的树组成,其中“测试类型选择”下拉框包含totalinfo.XML数据库中所有的测试项目类型,当下拉框选中某一类测试项目时,可在下面的树中列出totalinfo.XML中此类测试项目所有的结果条目,此为一级结果显示。二级结果显示区由查询结果显示表组成。根据一级结果显示区当前用户选择的树的内容,在数据库二级数据库(即单次测试结果中)进行数据查找,并将查找的测试条目等信息按照表格的形式在查询结果显示表中显示;功能选择区由“数据查询”、“数据删除”、“打印”和“返回”按钮组成,其中“数据查询”完成一级转二级结果查询,“数据删除”完成单次测试数据库删除结果和界面显示删除功能,“打印”完成二级查询结果打印word报表功能。

Figure 4. Data query and print interface diagram
图4. 数据查询和打印界面图
用户可以在测试数据管理界面点击“打印报表”按钮,将查询结果表的内容以Word形式生成用户所需的报表,供后续打印生成纸质文档。本文利用LabWindows/CVI的NI Rport Generation报表生成工具包 [16] ,对MS Office进行读写操作。查询结果表中的检测条目很多,且表格中每一栏的文字长短不一,使用NIReport_ConvertCVITable ()函数将表格控件自动转换为Word报表容易造成乱码,故本文单独设计Word报表模板,为查询结果表生成完整的Word报表。
4.2. 数据查询设计
数据查询主流程图如图5所示。进入测试数据管理界面后,在一级结果显示区选择需要查询的测试类型,此时,系统从totalinfo.XML数据库中查询结果,并在一级显示区的树控件中显示该测试类型对应的单次测试结果。然后,点击并选择需要查询的单次测试结果,从功能选择区中点击“数据查询”按钮,系统根据选择的单次测试结果从对应的单次XML数据库中查询具体测试信息并显示在二级结果显示区中的查询结果表中。

Figure 5. Data query main flow diagram
图5. 数据查询主流程图
与数据存储类似,数据查询时,仍然使用在LabWindows/CVI的toolbox工具箱中自带“cvixml.fp”文件中对应的函数,在此不再进行赘述。
4.3. 数据打印设计
数据打印使用LabWindows/CVI的toolbox工具箱中NI Report Generation中函数,设计Word报表模板并插入查询结果表的内容,按照从上到下,从左至右的顺序,依次为Word报表设计格式并插入标题、单元格以及单元格内容,从而生成完整的Word报表并实现打印功能。程序设计时,使用NIReport_SetTextAttribute()函数,使用NIR_TEXT_ATTR_ALIGNMENT特性设计文字位置,使用IR_TEXT_ATTR_FONT_SIZE特性设计字体大小,使用NIReport_NewLine()函数为Word报表插入新行。在Report Body中,还可使用NIReport_TableAppendRow()、NIReport_TableNextCell()、NIReport_AppendText()函数为表格逐行、逐个单元格添加数据,直至完成所有查询结果表单元格中的内容的添加。
5. 系统功能验证
为了验证本系统的功能,本文将一组测试结果表写入该数据存储系统,并进行数据查询和显示。如图6为totalinfo.XML文件的总测试信息存储内容,能直接在Web上显示结构化信息,totalinfo.XML文件中共包含“系统1测试结果”和“系统2测试结果”共两类测试内容,其中红色虚线框中为本次测试存储结果。在如图7的数据查询和打印界面中选择测试类型为“系统1测试结果”,在一级结果显示区的树控件中显示totalinfo.XML文件中所有的该类型的测试条目。选中本次测试条目,即可在表格中显示本次写入的测试结果表。

Figure 6. totalinfo.XML file Web display
图6. totalinfo.XML文件Web显示
6. 结束语
本文针对某装备测试数据存储信息化的需求,结合该类测试数据特点,运用可重用技术,结合XML数据库,设计了基于LabWindows/CVI的可重用数据存储系统,并详细介绍了该系统的XML数据库、数据存储模块和数据查询与打印模块设计。最后,使用通用数据对本系统进行了功能验证。结果表明,该系统能实现数据存储和查询等功能,有效解决了某装备检测数据存储问题。与类似常见的自动测试系统的数据存储模块相比,本文创新性地在该类系统中使用XML数据库进行数据存储,该数据库不需要使用第三方数据管理工具,容易创建、可方便的在WEB上显示,具有跨平台、跨操作系统的优点。同时,该本文数据存储系统使用可重用构件进行开发,通用性、可扩展性、重用性良好,在专业内解决了数据存储构件的重用问题,可为后续软件开发提供参考和借鉴,为军事装备保障提供了效益。