耗时两年半,精雕细琢——

电芯容量预测系统

4202年了
别再傻傻地买一堆分容设备回来
堆在车间了!

探索更多 ⇩
Overview

特性

kun是一个高精度、高性能的高可用分布式(锂离子)电芯容量预测系统。

1

仅在规范使用容量预测系统、批次模型可用的前提下做此保证


为什么要使用kun

在锂离子电池生产工艺中,电池的容量(Capacity)数据,是出厂前评价单体锂离子电池质量好坏的一个重要指标。 厂家会将锂离子电池根据不同的容量等级进行分档,相同档位的电芯会配组成为电池包(Pack),以获取更好的稳定性和寿命。

目前常用的获得锂离子电池容量数据的方法是:通过充放电设备,先对锂离子电池进行完全充电,然后进行多组阶梯式的电流放电,即让电池完全放电,最终将每个放电工步的总容量叠加,作为电池的出厂容量。该过程称为分容(Grading)。 该方法的缺点是,整个充放电过程极度耗时耗能,以标准容量为3200 mAH的18650电池举例,整个充放电过程会持续4~5小时,其中每个充放电阶段都会消耗非常多的电能。

此外,在分容之前,还有一个必需的化成(Formation)工序。 锂离子电池在灌输电解液并封口后,其物理结构基本组装完成。 为使电极充分被电解液浸润从而全面活化,需要经过一个以多个恒压充电——放电循环为主要步骤的激活过程,最终使电池具有放电能力,这一电化学过程即为化成工序。

化成完成后,一般电池会经过至少一日的常温静置/高温老化时间,待其化学性质趋于稳定,再通过分容检测容量,这一过程增加了相当大的成本:

其实,截至化成完成,电池本身的理化性质已基本确定,且会反映在(化成期间的)充放电曲线内,并与前中段线生产的数据记录高度相关。

据此,kun应运而生,在生产中绝大多数(70%-90%)电芯2的容量可通过kun计算获得,它是一个划时代的工业软件产品:

2

这里的百分比指的是每批次中电芯数目的比例,而非电池种类。kun适用于任何种类的锂离子电池,包括且不限于三元锂电池、磷酸铁锂电池等


指南

整体架构

architecture

kun的主要组件有两部分:服务端(kun)和客户端(ikun)。

服务端:kun

鲲之大,一锅炖不下——

kun是整个容量预测系统的核心服务,其主要职能如下:

客户端:ikun

与传统的工业软件不同,为了便于使用、简化与现有的MES等管理/调度系统的对接过程,我们提供了一个跨平台(在类Unix、Windows和Mac OS上有对应的版本)的命令行连接器程序ikun

用户(比如供应商开发人员)在开发业务代码时,可通过字符串拼接的方式生成调用ikun的命令,再通过操作系统的shell执行该命令(比如PHP的exec()函数等)。


场景举例

建议结合整体架构食用本节。

--- title: 登记训练数据示意流程 --- flowchart LR A["某托盘分容结束"] --> B{"是否为<u>标准流程</u>"} B -->|"标准流程"| C{"计算<u>流转时间</u>"} B -->|"异常流程"| D["丢弃"] C -->|"流转时间在设定范围内"| E["发送数据"] C -->|"流转时间异常"| D[\"丢弃"/] click B "#biao-zhun-liu-cheng" click C "#liu-zhuan-shi-jian"
--- title: 预测示意流程 --- flowchart LR A["fa:fa-play 某批次准备预测"] --> B{"fa:fa-clipboard-question 查询<u>批次状态</u>"} B -->|"fa:fa-check 可预测"| C["fa:fa-clipboard-question 获取<u>理论分容温度区间</u>"] C -->|"fa:fa-gear 设置<a href="#li-lun-fen-rong-wen-du">理论分容温度</a>"| D["fa:fa-paper-plane 发送数据"] D -->|"fa:fa-bolt 电芯容量"| A B -->|"fa:fa-xmark 不可预测"| A click B "#pi-ci-zhuang-tai" click C "#li-lun-fen-rong-wen-du-qu-jian"

容量预测依赖于一定规模的训练数据,且不同批次间的数据相互独立。

以通过MES(或其他类似制造执行系统,下文统称MES)调用容量预测举例(实际程序流程以甲方需求为准):

某一托盘分容结束时,首先确认该托盘的电芯是否都为经过标准流程生产的:

产线有很多不确定性,这些不确定性又会导致流转时间被大幅延长。
我们建议MES应有能力检查电芯是否经标准流程生产,并支持生产管理人员设置流转时间范围。
更进一步地,应有能力依据上述条件对电芯进行筛选,并支持一定范围内的查询和统计。

对于一个全新的批次,当第一个托盘的电芯的全流程数据到服务端时,kun会自动建立这个批次。

此后,依此方式推送至客户端的全流程数据会在系统中持续累积,当满足一定条件时,系统会尝试为该批次创建一个神经网络模型。该模型会滚动更新,以保持与最新的生产数据的特征分布相一致。

推送全流程数据有可能会失败。我们建议MES应有能力记录推送成功与否的状态,并支持一定范围内的查询和统计。

当某批次的数据积累到一定规模时,该批次的电芯才可通过容量预测获取容量。因此,当有某批次的电芯的需要使用容量预测时,需先检查批次状态


使用模式

一般来讲,在采样足够密集的前提下,仅使用化成工序的充放电曲线数据作为预测依据是足够的,这一结论在早期就经过大量的实验被验证。

但仍有许多厂家对这一点持有保留态度,希望可以利用一部分分容数据。

为此,kun支持4种使用模式,用户可以灵活选择:

modes

图示的4种模式分别为:

模式对应ikunmode参数
仅做化成,不做分容none
做一部分分容,截至放电工步前auto
做一部分分容,按(第n个)工步与电压截止by-time
做一部分分容,按(第n个)工步与时间截止by-voltage

用户甚至可以不做化成,直接提供完整的分容曲线作为全流程数据参与训练。
传入参数时在JSON中去掉formation_*字段即可。
此为试验特性,用户应在知晓其危险的前提下选用,并在出现不确定的行为时与开发者及时反馈

针对不同批次,用户可以选择不同的使用模式。但批次一旦建立(第一个托盘的数据通过ikun成功登记),已确定的模式就无法更改。


文档

术语

本章主要介绍kun涉及的特有概念。对于行业内一些常用概念此处不作赘述。

全流程

全流程电芯特指完整做完化成、(高温)静置和整个分容的过程。

标准流程

标准流程指正常量产时电芯所经历的整个过程。

相对地,非标准流程指一些包含额外步骤或在标准流程中出现异常的情况,比如:二(多)次化成、二(多)次分容等。

训练数据

推送全流程数据至服务端有可能会失败。仅成功推送的全流程数据可被视为训练数据。训练数据在批次间相互独立。

批次

kun中的同一批次要求在电芯在截至分容结束的整个生产过程中所用的原材料(的类型和批次号等)以及处理方式(包括流转时间、前中段线各个工序、化成与分容的充放电过程设计)均严格一致。

当然二次化成/分容等经历了标准流程的电芯不能被纳入对应的批次。

每个批次的训练数据、模型和容量预测行为均相互独立。

批次状态

无论是机器学习亦或是曲线搜索算法,容量预测行为都依赖于一定规模的训练数据。针对某批次:

上述两种状态即为批次状态

托盘

kun的托盘不同于物理上托盘的概念,特指登记训练数据请求容量时在控制台(Console)执行的单条命令中同一批发送的电芯。

kun的托盘被设计为不能超过256只电芯,这意味着如果物理上(产线中化成或分容的)托盘超出了这个数目,需要拆分为两条命令处理。

kun的托盘中的电芯被默认为同一批次。也就是说,也可以将属于同一批次、但物理上分属不同托盘的电芯拼接在单条命令处理。

工步

容量预测中工步的概念特指化成分容期间的充放电工步。工步数目最多不能超过128个。

NG

在容量预测系统中,以下两种情况会被判定为NG(详见错误注解中的 NG 说明):

理论分容温度

在请求预测时,ikun的命令行参数中有一个必需参数--temperature,其值即为理论分容温度

一般认为电芯的理化性质在分容前已确定,但分容期间的温度(尤其是放电工步)确会影响容量的实际测量结果。

指定理论分容温度后,如无报错或NG等情况,ikun在控制台返回的容量值则为假设电芯经实际分容过程在该温度下测定的容量值。

理论分容温度区间

对某批次,在训练数据累积期间,kun会记录全部电芯对应的分容温度,并基于这些温度估计出一个区间。假定批次的训练数据温度符合如下分布:

$$f(\theta) = \frac{1}{\sigma\sqrt{2\pi}} e^{-\frac{(\theta-\mu)^2}{2\sigma^2}}$$ 其中: $$\begin{aligned} \theta &= \text{分容温度} \\ \mu &= \text{温度在总体中的均值} \\ \sigma &= \text{温度在总体中的标准差} \end{aligned}$$

理论分容温度区间可由此得:

$$\theta_\tau = \mu \pm \sigma$$

流转时间

流转时间指电芯从化成结束分容开始的这段时间。同一批次的电芯的流转时间的极差(range)不可超过4小时。


Web API

查询批次状态

通过一个HTTP GET请求查询批次状态

请求格式

curl http://kun.ip.address/api/available?batch={batch_name}

返回内容

字段名字段类型解释
batchstring批次名
last_update_timestring该记录最后更新时间3
availablebool批次状态:是否可预测
needinteger设定的所需训练数据数目
missinginteger达到可预测状态所缺少训练数据数目
registeredinteger已有训练数据数目
nginteger登记失败的全流程数据数目
3

批次状态约每8小时更新一次,并非实时状态

举例:

{
  "batch": "batch_name",
  "last_update_time": "2022-02-25 18:18:18",
  "available": true,
  "need": 2048,
  "missing": 0,
  "registered": 2088,
  "ng": 40
}

调试用API

请求内容返回内容
curl https://kun-dummy.shuttleapp.rs/api/available?batch=available_batch可预测的批次返回内容举例
curl https://kun-dummy.shuttleapp.rs/api/available?batch=unavailable_batch不可预测的批次返回内容举例
其他情况尚未建立的批次返回内容举例

获取批次的理论分容温度区间

通过一个HTTP GET请求查询某批次的理论分容温度区间

请求格式

curl http://kun.ip.address/api/temperature?batch={batch_name}

返回内容

字段名字段类型解释
batchstring批次名
leftnumber区间左边界
rightnumber区间右边界

举例:

{
  "batch": "batch_name",
  "left": 16.8,
  "right": 51.8
}

调试用API

请求内容返回内容
curl https://kun-dummy.shuttleapp.rs/api/temperature?batch=available_batch已有批次返回内容举例
其他情况尚未建立的批次返回内容举例

ikun

kun是一个复杂系统。在开始使用ikun前,我们强烈建议用户详细阅读整篇文档。
ikun严格遵守POSIX规范。用户应根据需要对程序的退出码和各种异常情况进行记录分别处理,如此可为后续的异常回溯和统计等提供便利。

可在命令行中运行ikun --help查看具体用法。

子命令

train: 登记训练数据

使用ikun train子命令发送全流程电芯的数据时:

predict: 电池容量预测

使用ikun predict子命令请求预测容量时:

fabricate: 生成模拟数据

使用ikun fabricate子命令请求预测容量,程序会在指定目录生成成对的曲线文件,以供用户调试用。

举例:

# 在当前目录下的 example_dir 文件夹中生成 3 对化成和分容的曲线文件
ikun fabricate -d example_dir -n 3

调试用 API

我们的调试用 API 对ikun的两个子命令同样生效。使用时将具体的 URL 替换为:

https://kun-dummy.shuttleapp.rs

即可。

错误注解

NG

若电芯 NG,程序仍会正常结束退出(退出码为0),但以下两种情况的行为略有区别:

类型错误信息详细含义
BadCurve[Barcode] comes with misktake in the file(s) or file(s) not exist曲线文件有错误:
  • 文件不存在或者文件为空
  • 不符合格式要求
    • 数据存在 NULL
    • 超过 11 列电芯数据
    • 分容缺少放电工步
    • ……
StandingMismatch[Barcode] has incorrect standing status电芯曲线数据存在异常的静置工步
NStepMismatch[Barcode] has incorrect number of step工步数目与该批次的工步数量不一致
DurationMismatch[Barcode] has incorrect duration at the [nth] stepn个工步持续时间与该批次总体有明显差异
GapOffCenterThe circulation time of the battery [barcode] between formation and grading deviates from the overall distribution化成结束至分容开始的流转时间偏离总体分布
FeatureOffCenterThe [nth] step of the battery [barcode] deviates from the overall distribution电芯第n个特征值偏离总体分布
Unpredictable-该电芯无法预测

托盘错误

若托盘中存在严重问题,程序会异常退出(退出码为1),同时将错误信息打印到标准错误(stderr。托盘错误分以下两种情况:

一般托盘错误

命名错误信息详细含义
BatteryOverflowBattery count exceeds limit (maximum of 256)!单个托盘的电芯数量太多(一个托盘最多 256 个电芯)
ModeMismatchThe mode is inconsistent with the previous one! Please check the argument values or create a new batch!该批次的分容模式与该托盘设置的不一致
PredictUnavailable Cannot predict capacity of this batch: [batch]该批次还不能预测电芯容量

建立批次错误

仅在建立批次(推送第一个托盘的数据),会进行以下额外检查:

命名错误信息详细含义
BadTrayBad curve detected! Please check battery [barcode] (perhaps at the [nth] step).某个电芯的第n工步的静置状态与其他不同
(托盘内所有电芯的曲线对应位置的工步状态必须一致)
NStepBattery [barcode] has different step count from others!某个电芯的工步总数与其他电芯不同
(托盘内所有电芯的工步数目必须一致)
TooManyStepsStep count exceeds limit (maximum of 128)!工步数目太多,不得多于128
BatteryUnderflowThe tray does not have enough batteries (needs at least 16 for new batch)!电芯数目太少,不可少于16

命令错误

若出现命令错误,程序会异常退出(退出码为1),同时将错误信息打印到标准错误(stderr

命名错误信息详细含义
BadJsonBad JSON in [error_message]JSON 格式错误
BadUrlBad URL!URL 格式错误
NetworkErrorTimeout!网络错误
KunErrorStatusCode: [http_status_code]
Error when communicate with kun: [error_message]
服务器内部错误(联系我们

附录

充放电曲线格式

ikun所需的充放电曲线为标准的不含表头的CSV (Comma-Separated Values)格式,现将其必需列及含义列出:

序号字段名解释
0Timestamp数据保存时间,格式为yyyy-MM-dd HH:mm:ss4
1Cycle循环数5
2Step工步数6
3Station工步状态
4Time当前工步持续时间(单位为7
5Voltage电压采集值(单位为mV
6Current电流采集值(单位为mA,放电电流以负数表示)
7Capacity容量采集值8(单位为mA·h
8Energy能量采集值9(单位为mW·h
9Temperature主温度10
10StopFlag停止码11

可按需要在必需列后增加其他列,但仍需保证文件符合标准的不含表头的CSV格式。
如果仍对具体格式存疑,可参照ikun fabricate生成的文件格式。

4

24小时制(不含时区),比如2022-02-25 18:18:18。详见RFC3339

5

循环为简化中位机工步设置的功能,往往仅在实验室启用。在不明确时可将该列均设置为0,不影响容量预测结果

6

任意整数,用来标记哪些行属于同一工步,即当工步切换时,该数值应变为一个此前未出现过的值。
可以考虑从0开始,每次切换工步时将该值+ 1

7

为时间戳相减或设备(比如中位机)上传得到的真实持续时间,切勿使用自加等逻辑生成序数替代

8

容量计算方式: $$\int_{t_0}^{t_\tau} I(t) dt = C$$ 其中: $$\begin{aligned} C &= \text{容量值(Capacity)} \\ I &= \text{电流值} \\ t &= \text{时间(小时)} \\ t_0 &= \text{起始时间} \\ t_\tau &= \text{某时间点} \end{aligned}$$

9

能量计算方式: $$\int_{t_0}^{t_\tau} P(t) dt = E$$ 其中: $$\begin{aligned} E &= \text{能量值(Energy)} \\ P &= \text{功率值} \end{aligned}$$ 其余同上。

10

一般指夹具温度。若缺少该采集值,则考虑用最接近电芯的温度传感器记录值替代

11

一般由中位机记录,表示充/放电停止时的状态。若缺少该采集值,可将该列均设置为0,不影响容量预测结果;但请注意,该列有任何大于等于10的值均会导致当前电芯被判NG


工步状态

解释
1恒流充电
2恒流恒压充电
3搁置
4恒流放电
7OCV
8恒功率充电
9恒功率放电
12恒流恒压放电
17恒压充电
18恒压放电
5循环
6结束