APP下载

应用SQL数据库实现动力电池配组功能

2012-07-04徐萌飞

船电技术 2012年1期
关键词:语句单体排序

徐萌飞

( 中国船舶重工集团公司第七一二研究所,武汉 430064 )

0 引言

电池组在使用和维护过程中,只要出现某些电池相对其他电池性能衰减较大,将使整个电池组的容量明显下降,导致不能满足设备的动力需求。由于蓄电池生产厂家的技术、生产批次以及管理方面的因素,同一个厂家的同批次同型号的电池及时实施同样的化成工艺也无法完全保持一致,为了在电池化成时把性能相近的电池组合到一起,使得组合后电池组平均放电容量基本趋同于单体电池最小放电容量,从而确保蓄电池功能及寿命。

1 蓄电池配组方法

当前业界常使用的蓄电池配组方法包括以下几种:

(1)电压配组法:电压配组法中又包括静态电压配组法和负载电压配组法,通过在指定时间内或指定电压范围内电池组中单体电池两端的电压记录,选择出趋于一致性的电池。

(2)容量配组法:根据国家电池标准中的容量测试方法,将实验过程中各电池的容量数据进行匹配,选择出趋于一致的电池。

(3)动态特性配组法:使用一定的测试条件和测试环境,对所有进行配组的目标电池执行同样的电池实验,然后比较实验过程中的数据,将实验过程中充放电曲线趋于一致的电池挑选出来。

2 常规电池配组功能实现方式

电池配组功能基于电池实验的特性数据,以实现电压配组法的软件为例,主要包括如下几部分功能

(1)记录解析功能

主要提供对电池实验特征数据文件的解析,将实验数据转化为内部的数据结构。

其中数据结构一般包含以下内容:电池批次号,电池型号,电池组运行工艺,电池组运行工艺总时间,工艺步骤的时间、步骤号、单体电池编号、单体电压等,如果用户要对不同化成槽的多组电池组进行统一配组,还需要记录化成槽(充放电通道)编号。因为记录数据较多,一般常定义结构体,采用链表或者数组形式进行存储。

(2)电池配组功能

以基于电池单体电压数据进行配组的客户需求为例,客户需要的电池配组筛选方式包含两种:

a.以时间为条件按电压配组

当客户选取电池充放电记录后,选择某个充放电步骤以及步骤中某个时间点。然后根据需要,划分出需要配组的电压范围,程序能够根据用户需要将在指定电压范围内的单体电池挑选出来配成一组。在同一个分组内,按电池充电的回路数和单体的序号进行排序。

为实现以上功能,需要生成相关的电压范围分段,然后在前述存储记录数据的链表和数组中执行查询算法,以分段电压为查询条件,然后创建报表文件,将查询得到的数据放到报表中展示给客户。

b.以指定工艺步骤中指定电压为条件配组

当客户指定某个工艺步骤,并按某个指定的单体电压范围对记录中所有数据进行筛选。

筛选出来的单体电池数据可以按两种方式排序,一种是按单步时间排序,即筛选出的数据的排序条件优先顺序分别是:按单步时间从小到大,相同单步时间的,按化成槽编号排序,化成槽编号仍相同的,按单体电池序号排序。

另外一种排序优先级是按化成槽编号排序,化成槽编号相同的,按单体电池序号排序。

从前述的设计思路可以看到,配组算法是整个电池配组程序的核心,为实现配组功能,需要申请用于配组的内存空间来放置数据链表。在电池特性数据量很大的情况下,尤其是客户根据不同电压区间范围进行分组时,要多次查询比较和保存,可能还需要使用动态数组等可扩展结构来保留数据,实现此功能,对软件功能的稳定性和性能要求比较高,需要花费较长时间来进行设计和测试。并且涉及到大量数据和复杂算法的程序,往往要考虑性能,资源,等多方面,相互影响的方面较多。而且软件交付客户后,如果客户对电池配组的筛选条件发生变化,可能又要进行算法上的大幅度修改,涉及的代码量大,不利于快速响应。

其次,出于统计和查看需要,用户一般将需要进行电池配组的记录挑选出来,保存为 excel文件形式,等需要进行配组时再使用,这样配组软件需要将数据从 excel文件中导入到内存中。由于用户使用的 excel版本和格式的不同,需要用到不同的适配器与之匹配,将数据转化为内部的链表或者数组结构,这要求开发者必须对excel格式有充分了解。同时,如果用户保存的 excel文件中的数据字段顺序和格式发生变化,软件面临需要修改文件解析代码,这些也无疑增大了程序开发人员的工作量。

3 基于SQL数据库实现配组功能

为解决前述问题,特提出一种基于SQL数据库的配组功能实现方式,能够大幅度降低代码开发工作量,加快开发速度和效率,而且对于数据格式变化有很好的灵活适配性。

首先在数据库中创建支持电池配组功能的基础数据表。然后将用户保存的实验记录数据导入到数据库表中,最后借助 SQL语句进行配组实验。

(1)基于SQL数据库的记录解析功能实现

如果用户使用同一套软件完成充放电实验记录和配组,则此过程可以忽略。否则就要通过导入功能将其他格式的数据转换进入配组数据库表中。考虑到大多数用户经常使用 Excel来处理相关记录数据,导入的数据源也使用 excel文件格式,即使不同厂商的数据,经过 excel调整后,也便于导入。很多基于 SQL的数据库都提供对excel文件的导入支持,尤其是微软的 SQL SERVER,提供了强大的导入功能,其具有特色的批量导入功能,效率很高。常用的是SqlBulkCopy 类,SqlBulkCopy 类不仅仅可以支持数据库中表对表的数据转换导入,还支持将其他将数据(如Excel、Access、文本)加载到 SQL Server 表中,只要这些数据可加载到 DataTable实例或可使用 IDataReader 实例读取。相比起简单调用 Insert语句,SqlBulkCopy具有很强的性能优势。详细代码再次不多描述。

(2)使用SQL语句将横表变为纵表

充放电数据记录基本表中单体电压数据是以横表的形式出现,即单体电压V1,V2,…V(n)出现在字段名中,对应同一个化成槽中的n个单体电压数据以一条记录的形式出现,如下表:

V1 V2 V3 … V(n)12.10 12.00 11.98 11.99

为实现电池配组需求,需要使用SQL语句对电池单体电压进行分组和排序,根据单体电压字段进行筛选。所以,需要将横表还原成以单体电压序号和单体电压值两个字段组成的纵表样式。如下表:

电池单体序号 电压V1 12.1 V2 12… …V(n-1)11.90 V(n)11.99

其他字段保持原有值不变。使用SQL语句中的Union all语句能够轻松完成此功能。并且在实现横表变纵表时,为避免新建数据表造成数据冗余,可使用数据库中的视图(view)来完成同样的功能,以上SQL语句在此不详述。

由于不同型号的化成设备的单体数量不定,所以查询用的 SQL语句主要使用程序代码进行自动拼接而成,从理论上可以支持一个通道包含任意多个电池单体(前提是不超过数据库表字段数的最大值),程序流程如图1。

(3)使用SQL语句进行电池配组

在步骤(2)中实现了横表变纵表后,仍然使用SQL语句完成配组功能:

例如:按指定某个工艺步骤,并按某个指定的单体电压范围对记录中所有数据进行筛选,结果按步骤时间排序的SQL语句如下:

select * from table where [step =(指定步骤)],voltagevalue >(筛选范围最小值)and voltage value <= (筛选范围最大值)order by steptime

具体实现的代码不再详述。

考虑到需要从多个电池批次的记录中提取数据,如果先合并对应的多张电池记录表,再使用SQL查询排序,因合并占用较多时间而低效。所以采用先查询出符合条件的记录放到dataset中,然后再合并dataset的有效数据,提高处理效率。

图1 程序流程

假设完成以上功能后,客户需要更新配组条件,比如仅对状态处于放电过程中的数据进行匹配,此时只需要简单修改查询的SQL语句为

select * from table where [step =(指定步骤)],voltagevalue >(筛选范围最小值)and voltage value<= (筛选范围最大值)and runmode =(放电)

其他部分的代码将不需要改动,工作量很小。

比以上方式更为灵活的设计是,将查询的SQL语句放置到数据库的存储过程中实现,一旦用户需要调整,直接修改存储过程,代码都无需重新修改编译。

最后,用户一般需要进行报表打印和配组标签打印功能,常用的水晶报表软件等报表工具都已经实现了对SQL数据库的全面支持,实现更加方便。

4 结束语

配组是电池充放电系统的必须功能之一,实现方式多样。本文提出了一种基于SQL数据库实现配组功能的方法,和普通实现配组功能的硬编码相比,除了前述提及的开发速度快,应对需求变化灵活,接口开放的优点外,还具有其他优势。

首先,SQL是已经标准化的数据库语言,得到几乎所有主流数据库的支持,经过全球用户多年的验证使用,基于其实现的软件质量有良好保障。而大多数充放电管理系统本身就需要用到数据库,无需为配组功能另外安装数据库,配组算法组算法中只要简单保证SQL语句的正确性,基本就保证了功能正确性,降低了大量编码中人为引入的代码缺陷。

其次,配组功能随着需要匹配的通道增加,数据量会成倍增加,如果配组功能是使用本地代码算法进行匹配筛选,会占用大量cpu和内存空间,在配组功能和充放电系统管理程序其他功能(如实时数据记录,实时数据显示,数据绘图)并行运行时,可能会导致机器资源匮乏,影响管理系统正常的通讯和处理。如果单独为配组程序配置一台机器又加大了成本。而采用本文提出的应用SQL方式进行配组后,配组处理都在性能更高的数据库服务器上完成,仅仅将结果返回给客户端的配组程序,在客户端上运行的配组和电池管理系统的其他功能所共用的资源很少,整个系统的性能和成本上都具备很大优势。

最后,不仅仅是电池配组功能可以采用本文中提到的方式来实现,很多需要进行大批量数据筛选匹配的系统(例如医药数据匹配,人员信息管理等),在需要快速交付且客户定制化需求较多的情况下,都可以采用同样的方式来实现,为客户提供高效低缺陷灵活的解决方案。

[1]MSDN Library for visual stduio 2005. Microsoft corporation. 1987-2005.2009年第六期.

[2]孙雪梅, 丁军航, 原明亭. 基于 C#.NET的 Excel表格数据导入数据库技术研究. 信息技术与信息化,2009, (6).

[3]郭自强. 关于铅酸蓄电池配组. 中国自行车, 2009,(2).

[4]赵亚锋, 冯广斌, 张连武. 蓄电池一致性配组研究兵工自动化, 2006, 25(10).

[5]王有山, 孙力生, 王海博. 电动车电池配组问题探析. 蓄电池, 2007, 44(2).

猜你喜欢

语句单体排序
排序不等式
重点:语句衔接
恐怖排序
节日排序
刻舟求剑
单体光电产品检验验收方案问题探讨
精彩语句
相变大单体MPEGMA的制备与性能
巨无霸式医疗单体的选择
类姜黄素及其单体对β-内分泌酶活性的抑制作用