2. 历史数据源解析:SCADA历史数据库类型、采集频率与存储格式
好,咱们进入第二章。说实话,很多搞SCADA的同行,一提到“历史数据”就觉得头疼——数据量太大、查起来慢、存起来贵。但你想过没有,这些数据其实是座金矿,关键是你得先搞清楚“矿脉”在哪。
我个人习惯,拿到一个SCADA系统,第一件事不是看画面,而是先摸清它的历史数据源。说白了,就是搞清楚三个问题:数据存在哪?多久存一次?存成什么样?
2.1 SCADA历史数据库的三大类型
我这些年接触过的SCADA项目,历史数据库基本逃不出这三类:实时库、关系库、时序库。它们各有各的脾气,选错了后面全是坑。
2.1.1 实时数据库
实时库,也叫内存数据库。它的核心特点就一个字——快。数据不落盘,全在内存里转圈。我记得在某个钢铁厂的项目中,PLC每10毫秒发一个数据,实时库就像个高速缓存,扛住了每秒上万点的写入压力。
典型代表:PI System(OSIsoft)、eDNA、Wonderware Historian
适用场景:需要毫秒级响应的实时监控、报警触发、快速趋势展示
但这里有个坑——实时库的数据是“易失”的。一旦断电,内存里的数据就没了。所以它通常只作为“中转站”,后面还得接一个持久化存储。
2.1.2 关系数据库
关系库,大家最熟悉了,MySQL、SQL Server、Oracle这些。早期很多SCADA系统直接拿关系库当历史库用。嗯,怎么说呢,能用,但不好用。
我曾经接手过一个水处理项目,他们用SQL Server存历史数据,一张表里塞了上亿条记录。查询一个月的趋势,要等好几分钟。为什么?因为关系库的B+树索引,对时间序列这种“写多读少”的场景,天生不友好。
避坑指南:我曾经见过一个项目,用关系库存高频数据,结果每天产生几百万条记录,三个月后数据库直接崩溃。如果你非要用关系库,建议只存分钟级或小时级的聚合数据,别碰原始高频数据。
2.1.3 时序数据库
时序库,是专门为时间序列数据设计的。它把时间戳作为主键,做了大量优化。比如InfluxDB、TimescaleDB、TDengine这些。我最近几年做的项目,基本都转向时序库了。
它的优势很明显:写入速度快(每秒百万点级别)、压缩率高(能压到原始数据的十分之一)、查询效率高(按时间范围查几乎秒出)。
| 数据库类型 | 写入速度 | 压缩率 | 查询效率 | 典型场景 |
|---|---|---|---|---|
| 实时库 | 极高 | 无 | 极高 | 实时监控 |
| 关系库 | 低 | 低 | 低 | 低频存储 |
| 时序库 | 高 | 高 | 高 | 历史分析 |
2.2 数据采集频率与精度
这里我要重点说一下。很多工程师觉得“频率越高越好”,其实不是。你想想看,一个温度传感器,变化很慢,你每秒采100次,存下来的全是重复数据,白白浪费存储空间。
我建议的做法是:按信号类型定频率。
- 快速变化信号(如振动、电流、压力波动):建议10-100ms采集一次
- 中等变化信号(如液位、流量、温度):建议1-10秒采集一次
- 慢变化信号(如环境温度、累计量):建议分钟级甚至小时级采集
精度方面,同样要“够用就好”。我记得有个项目,客户要求所有数据保留4位小数。我一看,传感器本身精度只有0.5%,保留4位小数纯属浪费。最后我建议统一保留2位小数,存储空间直接省了40%。
小技巧:对于模拟量信号,可以设置“死区”或“变化率触发”。只有数值变化超过一定阈值(比如0.5%)才记录,这样能大幅减少冗余数据。我在一个风电项目中用这个方法,数据量减少了70%以上。
2.3 数据存储格式
数据存成什么格式,直接影响后续的分析效率。我见过三种主流格式:CSV、Parquet、自定义二进制。
2.3.1 CSV格式
CSV是最通用的格式,任何工具都能打开。但它的缺点也很明显:文件大、读写慢、不支持压缩。我建议只用于小数据量的导出或交换,别拿它当主力存储格式。
# 一个典型的CSV历史数据文件
timestamp,tag_name,value,quality
2024-01-01 00:00:00,PT101,12.34,Good
2024-01-01 00:00:01,PT101,12.35,Good
2024-01-01 00:00:02,PT101,12.33,Good
2.3.2 Parquet格式
Parquet是列式存储格式,这几年在大数据领域很火。它的优势是压缩率高、查询效率高。我最近在做一个数据湖项目,所有SCADA历史数据都转成了Parquet格式,存储空间节省了80%,查询速度提升了10倍以上。
推荐场景:如果你需要做大规模历史数据分析(比如用Spark、Presto),Parquet是首选。它支持按列读取,你只需要读需要的列,不用全表扫描。
2.3.3 自定义二进制格式
有些老牌SCADA系统,比如西门子的WinCC、施耐德的Citect,都有自己的二进制格式。这种格式读写速度最快,但可移植性差。我建议,除非你确定只用这个厂商的工具,否则尽量导出为开放格式。
我曾经遇到一个项目,客户用了某厂商的私有二进制格式,后来想换平台,结果数据迁移花了整整三个月。嗯,这个教训挺深刻的。
知识体系总览
下面这张图,是我梳理的本章知识结构。你可以把它当作一个“数据源地图”,以后遇到SCADA历史数据问题,先看这张图,心里就有数了。
好了,这一章的内容就这些。记住,搞历史数据挖掘,第一步就是搞清楚数据源。源不对,后面再牛的分析算法也是白搭。下一章,咱们聊聊怎么把这些原始数据清洗成可用的“干净数据”。