徐萌飛
( 中國船舶重工集團公司第七一二研究所,武漢 430064 )
電池組在使用和維護過程中,只要出現某些電池相對其他電池性能衰減較大,將使整個電池組的容量明顯下降,導致不能滿足設備的動力需求。由于蓄電池生產廠家的技術、生產批次以及管理方面的因素,同一個廠家的同批次同型號的電池及時實施同樣的化成工藝也無法完全保持一致,為了在電池化成時把性能相近的電池組合到一起,使得組合后電池組平均放電容量基本趨同于單體電池最小放電容量,從而確保蓄電池功能及壽命。
當前業界常使用的蓄電池配組方法包括以下幾種:
(1)電壓配組法:電壓配組法中又包括靜態電壓配組法和負載電壓配組法,通過在指定時間內或指定電壓范圍內電池組中單體電池兩端的電壓記錄,選擇出趨于一致性的電池。
(2)容量配組法:根據國家電池標準中的容量測試方法,將實驗過程中各電池的容量數據進行匹配,選擇出趨于一致的電池。
(3)動態特性配組法:使用一定的測試條件和測試環境,對所有進行配組的目標電池執行同樣的電池實驗,然后比較實驗過程中的數據,將實驗過程中充放電曲線趨于一致的電池挑選出來。
電池配組功能基于電池實驗的特性數據,以實現電壓配組法的軟件為例,主要包括如下幾部分功能
主要提供對電池實驗特征數據文件的解析,將實驗數據轉化為內部的數據結構。
其中數據結構一般包含以下內容:電池批次號,電池型號,電池組運行工藝,電池組運行工藝總時間,工藝步驟的時間、步驟號、單體電池編號、單體電壓等,如果用戶要對不同化成槽的多組電池組進行統一配組,還需要記錄化成槽(充放電通道)編號。因為記錄數據較多,一般常定義結構體,采用鏈表或者數組形式進行存儲。
以基于電池單體電壓數據進行配組的客戶需求為例,客戶需要的電池配組篩選方式包含兩種:
a.以時間為條件按電壓配組
當客戶選取電池充放電記錄后,選擇某個充放電步驟以及步驟中某個時間點。然后根據需要,劃分出需要配組的電壓范圍,程序能夠根據用戶需要將在指定電壓范圍內的單體電池挑選出來配成一組。在同一個分組內,按電池充電的回路數和單體的序號進行排序。
為實現以上功能,需要生成相關的電壓范圍分段,然后在前述存儲記錄數據的鏈表和數組中執行查詢算法,以分段電壓為查詢條件,然后創建報表文件,將查詢得到的數據放到報表中展示給客戶。
b.以指定工藝步驟中指定電壓為條件配組
當客戶指定某個工藝步驟,并按某個指定的單體電壓范圍對記錄中所有數據進行篩選。
篩選出來的單體電池數據可以按兩種方式排序,一種是按單步時間排序,即篩選出的數據的排序條件優先順序分別是:按單步時間從小到大,相同單步時間的,按化成槽編號排序,化成槽編號仍相同的,按單體電池序號排序。
另外一種排序優先級是按化成槽編號排序,化成槽編號相同的,按單體電池序號排序。
從前述的設計思路可以看到,配組算法是整個電池配組程序的核心,為實現配組功能,需要申請用于配組的內存空間來放置數據鏈表。在電池特性數據量很大的情況下,尤其是客戶根據不同電壓區間范圍進行分組時,要多次查詢比較和保存,可能還需要使用動態數組等可擴展結構來保留數據,實現此功能,對軟件功能的穩定性和性能要求比較高,需要花費較長時間來進行設計和測試。并且涉及到大量數據和復雜算法的程序,往往要考慮性能,資源,等多方面,相互影響的方面較多。而且軟件交付客戶后,如果客戶對電池配組的篩選條件發生變化,可能又要進行算法上的大幅度修改,涉及的代碼量大,不利于快速響應。
其次,出于統計和查看需要,用戶一般將需要進行電池配組的記錄挑選出來,保存為 excel文件形式,等需要進行配組時再使用,這樣配組軟件需要將數據從 excel文件中導入到內存中。由于用戶使用的 excel版本和格式的不同,需要用到不同的適配器與之匹配,將數據轉化為內部的鏈表或者數組結構,這要求開發者必須對excel格式有充分了解。同時,如果用戶保存的 excel文件中的數據字段順序和格式發生變化,軟件面臨需要修改文件解析代碼,這些也無疑增大了程序開發人員的工作量。
為解決前述問題,特提出一種基于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數據庫的全面支持,實現更加方便。
配組是電池充放電系統的必須功能之一,實現方式多樣。本文提出了一種基于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).