3. 数据采集与归档:采集频率设置、数据质量标记、归档策略

大家好,我是老张。今天咱们聊聊数据采集与归档这个环节。说实话,很多SCADA项目上线后出问题,十有八九都出在这一块。要么数据丢了,要么存得太多把硬盘撑爆了,要么查历史数据时发现一堆乱码。嗯,咱们今天就把这些坑一个个填上。

3.1 采集频率设置——不是越快越好

我刚入行那会儿,总觉得采集频率越高越好。有一次给一个水处理项目做配置,把所有模拟量都设成了100毫秒采集一次。结果呢?一周后服务器直接卡死。后来才明白,采集频率要根据信号变化特性来定。

我个人习惯这样分类:

  • 慢变信号(如液位、温度):1~5秒采集一次就够了。你想想看,一个大水箱的水位能一秒变几次?
  • 快变信号(如压力、流量):200~500毫秒。我在电厂项目中遇到过,汽包压力变化很快,设成1秒采集会漏掉关键波动。
  • 数字量/开关量:50~100毫秒。特别是保护信号,慢了会出大事。
  • 累计量(如电能、流量累计):1~15分钟。这类数据本身就有积分特性,没必要高频采集。

核心原则:采集频率 = 信号变化周期 ÷ 5 ~ 10。也就是说,一个信号每秒钟变化10次,你至少每100~200毫秒采一次。

3.2 数据质量标记——给每个数据贴个标签

数据质量标记,说白了就是告诉下游系统:「这个数据靠不靠谱」。我曾经在一个化工项目上吃过亏——没有做质量标记,结果报表里混入了传感器故障时的坏数据,导致产量统计偏差了15%。

我建议至少标记以下几类:

质量码 含义 典型场景
0x00 Good(好数据) 正常采集,无异常
0x01 Uncertain(不确定) 信号波动大,超出正常范围但未超限
0x02 Bad(坏数据) 传感器断线、通讯超时
0x03 Substituted(替代值) 用历史均值或前一值填充
0x04 Manually Overridden(人工置数) 操作员手动输入的值

避坑指南:我曾经见过一个项目,把所有坏数据直接删掉了。结果做事故分析时,发现关键时间点的数据是空的。正确的做法是:保留坏数据,但打上质量标记。这样查询时可以选择「只看好数据」或「包含坏数据」。

3.3 归档策略——按时间 vs 按事件

归档策略,说白了就是决定「什么时候把数据从内存写到硬盘」。我见过最蠢的做法是——每来一条数据就写一次硬盘。结果呢?硬盘寿命直接减半。

常用的归档策略有两种:

3.3.1 按时间归档

这是最基础的方式。每隔固定时间,把缓存中的数据批量写入历史库。

  • 优点:实现简单,性能可控
  • 缺点:如果两次归档之间发生了事故,关键数据可能丢失
  • 我建议:对于慢变信号,归档周期可以设长一些(比如5~10秒)。对于快变信号,建议1~2秒归档一次。

3.3.2 按事件归档

只有当数据发生变化时才归档。比如一个阀门状态从「开」变成「关」,才记录一笔。

  • 优点:数据量小,存储效率高
  • 缺点:如果信号频繁抖动,会产生大量无用记录
  • 避坑指南:我曾经在一个振动监测项目上用了纯事件归档,结果传感器一个小时内产生了20万条记录——因为振动信号一直在微幅波动。后来加了死区设置(变化超过1%才记录),数据量直接降了90%。

3.3.3 混合策略——我推荐的做法

实际项目中,我通常把两种策略结合起来:

// 伪代码示例:混合归档策略
if (信号变化量 > 死区阈值) {
    立即归档(事件触发)
} else if (距离上次归档 > 最大间隔) {
    强制归档(时间触发)
} else {
    继续缓存,等待下次判断
}

这样做的好处是:既不会漏掉关键变化,又不会因为信号抖动而写爆硬盘。

注意:归档策略一定要考虑磁盘空间。我建议设置一个「滚动窗口」——比如保留最近90天的原始数据,超过90天的自动压缩成分钟级或小时级均值。这样既能满足近期查询的精度要求,又不会把硬盘撑爆。

3.4 知识体系总览

下面这张图,是我自己总结的数据采集与归档的核心逻辑。你把它理解了,这一章就算吃透了。

数据采集与归档核心逻辑 数据采集 采集频率设置 数据质量标记 慢变信号:1~5s 快变信号:200~500ms 数字量:50~100ms 累计量:1~15min Good / Uncertain Bad / Substituted Manually Overridden 归档策略:按时间归档 + 按事件归档 → 混合策略 核心目标:不丢数据、不爆硬盘、查询高效

嗯,这一章的内容就到这里。数据采集与归档,说白了就是三个字:准、全、省——采集要准,归档要全,存储要省。你把这个逻辑理清了,后面做报表生成就轻松多了。


公众号:蓝海资料掘金营,微信deep3321