常州金坛一家锂电厂的分容车间,8 台分容柜共 512 个通道,化成+分容工序连续跑 48 小时以上。上位机要干的事听起来简单——把每个通道的电压、电流、容量持续记下来——但算一下数据量就知道这不是普通的采集项目:每秒 5000+ 条记录、单工单数据量上亿条、中途断电不能丢也不能重。这篇讲我们在这套系统里的四个关键设计:数据量规划、分组采集、攒批入库、断点续采。

一、先算账:数据量决定一切架构选择

512通道总数(8柜×64)
10/s每通道采样频率
5120/s全车间记录速率
≈8.8亿48小时工单总条数

算完账,几个架构结论直接出来了:

  • 逐条 INSERT 必死。SQLite 单条插入每条都要走一遍事务提交,5000 条/秒根本写不进去,必须攒批 + 事务;
  • 明细数据按工单分表。一张大表堆几亿条,查询和备份都会失控;按"工单号_柜号"分表,工单结束即归档;
  • 曲线回放要降采样。48 小时 10Hz 的原始曲线直接画是 170 万点,回放查询时按时间桶取最值降采样(这个手法在趋势曲线那篇里详细讲过);
  • 磁盘按天估容。每条记录压缩存储前约 40 字节,全车间每天原始数据约 17GB,工控机配 1TB 固态 + 工单结束转存 NAS。

二、采集侧:通道分组轮询,别让一条总线挤 512 个通道

分容柜内部是 CAN/RS485 总线挂 64 块通道板,上位机轮询读取。如果按"每块板一次全读"串行轮询,64 块板轮一圈 2 秒,单通道实际刷新率只有 0.5Hz,远达不到 10Hz 要求。我们的做法:

  1. 板内批量读:一条报文读一块板的 64 通道电压 + 64 通道电流(连续寄存器区,一次读 256 字),把每板每轮的报文数从 128 条压到 2 条;
  2. 柜内双通道并发:每柜的总线拆成两段,两段并行轮询,单柜轮询周期压到 100ms;
  3. 快慢分离:电压电流按 100ms 周期进实时库;温度、SOC、工步状态按 1 秒周期进慢速表——不是所有数据都值得最高频率;
  4. 超时隔离:某块板连续 3 次超时,从轮询表摘除并报警,不拖累整条总线的节拍,恢复后自动加回。

三、入库侧:攒批 + 事务,SQLite 也能扛住 5000 条/秒

采集线程把记录丢进有界队列(容量 10 万条,水位超 70% 报警),入库线程每 200ms 或攒满 2000 条触发一次批量写入:

using var tx = conn.BeginTransaction();
using var cmd = conn.CreateCommand();
cmd.CommandText = "INSERT INTO detail_@tbl(ts,ch,volt,curr,cap) VALUES($t,$c,$v,$i,$q)";
var pTs = cmd.CreateParameter(); pTs.ParameterName = "$t"; cmd.Parameters.Add(pTs);
// ...其余参数同理,复用参数对象避免重复创建
foreach (var r in batch)
{
    pTs.Value = r.Time; pCh.Value = r.Channel;
    pV.Value = r.Volt;  pI.Value = r.Curr; pQ.Value = r.Cap;
    cmd.ExecuteNonQuery();
}
tx.Commit();   // 一批一次提交,这是吞吐量的命门

配合三个 SQLite 参数:journal_mode=WAL(读写不互斥)、synchronous=NORMAL(WAL 模式下安全且快)、temp_store=MEMORY。实测这套组合在工控机(i5 + SATA SSD)上稳定写入 8000 条/秒,留了 60% 余量。

容量计算放在入库线程做。容量 = ∫I·dt,用梯形法在攒批窗口内累加,和原始数据一起落库。别放采集线程——采集线程的职责只有"把数据完整搬进来",任何计算都可能拖慢轮询节拍。

四、断点续采:掉电后不丢不重,靠工单状态机对账

化成柜掉电是锂电车间的常态事件(跳闸、检修、UPS 切换),恢复后最怕两件事:丢一段数据、或者重复一段数据导致容量算错。我们的对账机制:

机制实现作用
工单状态机待开始/运行中/暂停/断电恢复/已完成,状态变更全部落库上电后知道每个工单该不该续跑
通道级断点每通道记录最后入库时间戳与累计容量续采从断点时间继续,不重复累计
柜侧缓存回补分容柜自带缓存,断电期间数据存柜内,恢复后上位机主动回读断电窗口(<10分钟)数据可回补
上电对账逐柜比对"柜内工步进度"与"库内最后记录",差异生成对账报告不自动猜,差异交工艺员确认
容量数据宁可缺一段,不能错一分。回补数据与实时数据时间戳重叠时,以柜内缓存为准但必须打"回补"标记,曲线回放时可见。锂电容量是出货结算依据,数据口径的任何模糊都会在客户审计时变成大问题。

五、数据之上的两件事:容量判定与曲线异常

数据攒齐之后,分容的业务价值才刚开始:容量判定按工单配方算实际容量与标称容量的比值,自动分档(A/B/C/降级);曲线异常检测盯三类典型缺陷——电压平台异常(微短路前兆,表现为恒流段电压持续低于同批中位数)、容量跳水(单周期容量增量突变)、温度尖峰(通道板接触不良)。这三类异常在数据里都有明确特征,规则引擎就能抓,检出即锁定通道并通知工艺员复判。

这套系统上线后,分容车间的数据完整率从人工抄表时代的"说不清"变成了 99.97%(缺失全部来自断电窗口且带标记),容量分档争议归零。高频采集项目的经验浓缩成一句话:先算数据量,再定存储粒度,入库靠攒批,断电靠对账