特性
kun
是一个高精度、高性能的高可用分布式(锂离子)电芯容量预测系统。
- 高质量✅:平均百分比误差(Mean Absolute Percentage Error, MAPE)不超过
0.5
%1 - 更安全🔍:独创的数据清洗和机器学习过程,准确过滤掉脏数据(比如工艺错误的电芯)
- 高可用💪:
1
秒内全自动故障恢复,故障期间数据0
错漏 - 高性能🚀:单个托盘(不超过
256
只电芯)的容量预测可在30
秒内完成 - 更灵活🤹🏻:支持
4
种使用模式,不同批次可自由选择不同的模式 - 分布式🕸:多服务器间互为冗余但又负载均衡,一键轻松水平扩展,充分利用硬件性能
- 超易用💡:提供跨平台的客户端(命令行)程序
仅在规范使用容量预测系统、批次模型可用的前提下做此保证
为什么要使用kun
?
在锂离子电池生产工艺中,电池的容量(Capacity)数据,是出厂前评价单体锂离子电池质量好坏的一个重要指标。 厂家会将锂离子电池根据不同的容量等级进行分档,相同档位的电芯会配组成为电池包(Pack),以获取更好的稳定性和寿命。
目前常用的获得锂离子电池容量数据的方法是:通过充放电设备,先对锂离子电池进行完全充电,然后进行多组阶梯式的电流放电,即让电池完全放电,最终将每个放电工步的总容量叠加,作为电池的出厂容量。该过程称为分容(Grading)。
该方法的缺点是,整个充放电过程极度耗时耗能,以标准容量为3200
mAH的18650电池举例,整个充放电过程会持续4
~5
小时,其中每个充放电阶段都会消耗非常多的电能。
此外,在分容之前,还有一个必需的化成(Formation)工序。 锂离子电池在灌输电解液并封口后,其物理结构基本组装完成。 为使电极充分被电解液浸润从而全面活化,需要经过一个以多个恒压充电——放电循环为主要步骤的激活过程,最终使电池具有放电能力,这一电化学过程即为化成工序。
化成完成后,一般电池会经过至少一日的常温静置/高温老化时间,待其化学性质趋于稳定,再通过分容检测容量,这一过程增加了相当大的成本:
- 静置和分容均耗费了很多时间
- 分容时的多个充放电步骤非常耗电
- 大量分容设备体积巨大,占地面积大;也为堆垛机和物流线等实施增加困难
其实,截至化成完成,电池本身的理化性质已基本确定,且会反映在(化成期间的)充放电曲线内,并与前中段线生产的数据记录高度相关。
据此,kun
应运而生,在生产中绝大多数(70
%-90
%)电芯2的容量可通过kun
计算获得,它是一个划时代的工业软件产品:
- 绝大多数分容设备被取缔,建厂时用地、资金等成本被压缩
- 省略分容充放电步骤,节约大量电能
- 节省了静置和分容时间,变相大大提高产能
- 整线体系简化,降低了分容设备故障导致的停产概率和设备维修期间造成的各种费用
这里的百分比指的是每批次中电芯数目的比例,而非电池种类。kun
适用于任何种类的锂离子电池,包括且不限于三元锂电池、磷酸铁锂电池等
指南
整体架构
kun的主要组件有两部分:服务端(kun
)和客户端(ikun
)。
服务端:kun
鲲之大,一锅炖不下——
kun
是整个容量预测系统的核心服务,其主要职能如下:
- 接收并存储客户端推送过来的训练(全流程)数据
- 周期性地按批次训练神经网络模型
- 响应客户端的请求,计算并返回待预测电芯的容量
客户端:ikun
与传统的工业软件不同,为了便于使用、简化与现有的MES等管理/调度系统的对接过程,我们提供了一个跨平台(在类Unix、Windows和Mac OS上有对应的版本)的命令行连接器程序ikun
。
用户(比如供应商开发人员)在开发业务代码时,可通过字符串拼接的方式生成调用ikun
的命令,再通过操作系统的shell执行该命令(比如PHP的exec()
函数等)。
场景举例
建议结合整体架构食用本节。
容量预测依赖于一定规模的训练数据,且不同批次间的数据相互独立。
以通过MES(或其他类似制造执行系统,下文统称MES)调用容量预测举例(实际程序流程以甲方需求为准):
某一托盘分容结束时,首先确认该托盘的电芯是否都为经过标准流程生产的:
- 若为标准流程,还需判断各个电芯的流转时间是否在生产管理人员设定的范围内,如果通过所有检查,可调用
ikun train
子命令推送数据 - 否则丢弃(无需发送至容量预测系统)
产线有很多不确定性,这些不确定性又会导致流转时间被大幅延长。
我们建议MES应有能力检查电芯是否经标准流程生产,并支持生产管理人员设置流转时间范围。
更进一步地,应有能力依据上述条件对电芯进行筛选,并支持一定范围内的查询和统计。
对于一个全新的批次,当第一个托盘的电芯的全流程数据到服务端时,kun
会自动建立这个批次。
此后,依此方式推送至客户端的全流程数据会在系统中持续累积,当满足一定条件时,系统会尝试为该批次创建一个神经网络模型。该模型会滚动更新,以保持与最新的生产数据的特征分布相一致。
推送全流程数据有可能会失败。我们建议MES应有能力记录推送成功与否的状态,并支持一定范围内的查询和统计。
当某批次的数据积累到一定规模时,该批次的电芯才可通过容量预测获取容量。因此,当有某批次的电芯的需要使用容量预测时,需先检查批次状态:
- 若可预测,则:
- 首先获取该批次的理论分容温度区间
我们建议MES应支持并限制生产监督人员在此范围内设置批次的理论分容温度,因超出该范围会导致预测NG率大幅上升、精度严重下降。
- 可通过
ikun predict
子命令向服务端发送该电芯的必要数据,同时需通过--temperature
参数指定一个理论分容温度 kun
会计算后返回电芯的容量值或NG
- 否则仍需继续等待训练数据积累
使用模式
一般来讲,在采样足够密集的前提下,仅使用化成工序的充放电曲线数据作为预测依据是足够的,这一结论在早期就经过大量的实验被验证。
但仍有许多厂家对这一点持有保留态度,希望可以利用一部分分容数据。
为此,kun
支持4
种使用模式,用户可以灵活选择:
图示的4
种模式分别为:
模式 | 对应ikun 中mode 参数 |
---|---|
仅做化成,不做分容 | 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}
返回内容
字段名 | 字段类型 | 解释 |
---|---|---|
batch | string | 批次名 |
last_update_time | string | 该记录最后更新时间3 |
available | bool | 批次状态:是否可预测 |
need | integer | 设定的所需训练数据数目 |
missing | integer | 达到可预测状态所缺少训练数据数目 |
registered | integer | 已有训练数据数目 |
ng | integer | 登记失败的全流程数据数目 |
批次状态约每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}
返回内容
字段名 | 字段类型 | 解释 |
---|---|---|
batch | string | 批次名 |
left | number | 区间左边界 |
right | number | 区间右边界 |
举例:
{
"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
子命令发送全流程电芯的数据时:
- 若成功登记为训练数据,不会产生任何返回内容
- 若出现 NG 电芯,程序仍会正常结束退出(退出码为
0
),错误信息打印到标准错误(stderr
) - 若出现托盘错误或命令错误,程序会异常退出(退出码为
1
),同时将错误信息打印到标准错误(stderr
)
predict
: 电池容量预测
使用ikun predict
子命令请求预测容量时:
-
若程序正常结束退出(退出码为
0
),程序总会将返回内容打印到标准输出(stdout
):字段名 字段类型 解释 barcode string 电池条码 capacity number 计算得到的电芯容量,若 NG,则为 null
ng_type string NG 类型,若电池非 NG,则为 null
也就是说,
capacity
与ng_type
总会有其中一个字段为null
。用户可由此判断电芯是否 NG。举例:
{ "barcode": "barcode", "capacity": 51888.88, "ng_type": null }
-
若出现托盘错误或命令错误,程序会异常退出(退出码为
1
),同时将错误信息打印到标准错误(stderr
)
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
),但以下两种情况的行为略有区别:
- 登记训练数据:会将错误信息打印到标准错误(
stderr
),用户可根据需要提取和处理这部分信息 - 电池容量预测:不会输出对应的错误信息,仅会在打印到标准输出(
stdout
)的内容中指明NG的类型
类型 | 错误信息 | 详细含义 |
---|---|---|
BadCurve | [Barcode] comes with misktake in the file(s) or file(s) not exist | 曲线文件有错误:
|
StandingMismatch | [Barcode] has incorrect standing status | 电芯曲线数据存在异常的静置工步 |
NStepMismatch | [Barcode] has incorrect number of step | 工步数目与该批次的工步数量不一致 |
DurationMismatch | [Barcode] has incorrect duration at the [nth] step | 第n 个工步持续时间与该批次总体有明显差异 |
GapOffCenter | The circulation time of the battery [barcode] between formation and grading deviates from the overall distribution | 化成结束至分容开始的流转时间偏离总体分布 |
FeatureOffCenter | The [nth] step of the battery [barcode] deviates from the overall distribution | 电芯第n 个特征值偏离总体分布 |
Unpredictable | - | 该电芯无法预测 |
托盘错误
若托盘中存在严重问题,程序会异常退出(退出码为1
),同时将错误信息打印到标准错误(stderr
)。托盘错误分以下两种情况:
一般托盘错误
命名 | 错误信息 | 详细含义 |
---|---|---|
BatteryOverflow | Battery count exceeds limit (maximum of 256)! | 单个托盘的电芯数量太多(一个托盘最多 256 个电芯) |
ModeMismatch | The 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] | 该批次还不能预测电芯容量 |
建立批次错误
仅在建立批次时(推送第一个托盘的数据),会进行以下额外检查:
命名 | 错误信息 | 详细含义 |
---|---|---|
BadTray | Bad curve detected! Please check battery [barcode] (perhaps at the [nth] step). | 某个电芯的第n 个工步的静置状态与其他不同(托盘内所有电芯的曲线对应位置的工步状态必须一致) |
NStep | Battery [barcode] has different step count from others! | 某个电芯的工步总数与其他电芯不同(托盘内所有电芯的工步数目必须一致) |
TooManySteps | Step count exceeds limit (maximum of 128)! | 工步数目太多,不得多于128 个 |
BatteryUnderflow | The tray does not have enough batteries (needs at least 16 for new batch)! | 电芯数目太少,不可少于16 个 |
命令错误
若出现命令错误,程序会异常退出(退出码为1
),同时将错误信息打印到标准错误(stderr
):
命名 | 错误信息 | 详细含义 |
---|---|---|
BadJson | Bad JSON in [error_message] | JSON 格式错误 |
BadUrl | Bad URL! | URL 格式错误 |
NetworkError | Timeout! | 网络错误 |
KunError | StatusCode: [http_status_code] Error when communicate with kun: [error_message] | 服务器内部错误(联系我们) |
附录
充放电曲线格式
ikun
所需的充放电曲线为标准的不含表头的CSV (Comma-Separated Values)格式,现将其必需列及含义列出:
序号 | 字段名 | 解释 |
---|---|---|
0 | Timestamp | 数据保存时间,格式为yyyy-MM-dd HH:mm:ss 4 |
1 | Cycle | 循环数5 |
2 | Step | 工步数6 |
3 | Station | 工步状态 |
4 | Time | 当前工步持续时间(单位为秒)7 |
5 | Voltage | 电压采集值(单位为mV) |
6 | Current | 电流采集值(单位为mA,放电电流以负数表示) |
7 | Capacity | 容量采集值8(单位为mA·h) |
8 | Energy | 能量采集值9(单位为mW·h) |
9 | Temperature | 主温度10 |
10 | StopFlag | 停止码11 |
可按需要在必需列后增加其他列,但仍需保证文件符合标准的不含表头的CSV格式。
如果仍对具体格式存疑,可参照ikun fabricate
生成的文件格式。
24
小时制(不含时区),比如2022-02-25 18:18:18
。详见RFC3339
循环为简化中位机工步设置的功能,往往仅在实验室启用。在不明确时可将该列均设置为0
,不影响容量预测结果
任意整数,用来标记哪些行属于同一工步,即当工步切换时,该数值应变为一个此前未出现过的值。
可以考虑从0
开始,每次切换工步时将该值+ 1
为时间戳相减或设备(比如中位机)上传得到的真实持续时间,切勿使用自加等逻辑生成序数替代!
容量计算方式: $$\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}$$
能量计算方式: $$\int_{t_0}^{t_\tau} P(t) dt = E$$ 其中: $$\begin{aligned} E &= \text{能量值(Energy)} \\ P &= \text{功率值} \end{aligned}$$ 其余同上。
一般指夹具温度。若缺少该采集值,则考虑用最接近电芯的温度传感器记录值替代
一般由中位机记录,表示充/放电停止时的状态。若缺少该采集值,可将该列均设置为0
,不影响容量预测结果;但请注意,该列有任何大于等于10
的值均会导致当前电芯被判NG
工步状态
值 | 解释 |
---|---|
1 | 恒流充电 |
2 | 恒流恒压充电 |
3 | 搁置 |
4 | 恒流放电 |
7 | OCV |
8 | 恒功率充电 |
9 | 恒功率放电 |
12 | 恒流恒压放电 |
17 | 恒压充电 |
18 | 恒压放电 |
5 | 循环 |
6 | 结束 |