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 知识体系总览
下面这张图,是我自己总结的数据采集与归档的核心逻辑。你把它理解了,这一章就算吃透了。
嗯,这一章的内容就到这里。数据采集与归档,说白了就是三个字:准、全、省——采集要准,归档要全,存储要省。你把这个逻辑理清了,后面做报表生成就轻松多了。
公众号:蓝海资料掘金营,微信deep3321