2. SCADA实时数据库与历史数据库
在SCADA系统中,“数据库”并不是一个单一概念。同一套系统里通常同时存在两类数据服务:实时数据库负责“此刻的值”,历史数据库负责“过去的值”。报表统计几乎全部建立在历史库之上,但报表中的“当前值”“最新状态”又往往来自实时库。理解两者的分工,是后续做日报、月报、能耗统计和KPI计算的基础。
一、实时库与历史库的本质区别
实时数据库(RTDB)是内存型数据库,它以“点(Tag/测点)”为单位驻留最新值。每个点通常包含:当前值、时间戳、质量码、工程单位、量程、报警状态等。它的特点是只保留最新一份快照,读写极快,典型访问周期为100ms~1s,服务于画面刷新、报警判断、联锁逻辑和闭环控制。实时库不关心“昨天14:00的流量是多少”,它只回答“现在是多少”。
历史数据库(Historian)是持久化存储,它按时间序列保存每个点的历史采样。它的核心价值是可回溯、可统计、可审计。报表系统取“昨日累计电量”“本月最大负荷”“某班次平均温度”,都必须查历史库。历史库的写入频率通常低于实时库,常见为1s、5s、10s或变化存储(仅当值变化超过死区才记录)。
两者的关键差异可以归纳为:实时库是“点快照”,历史库是“点的时间序列”;实时库服务于“现在”,历史库服务于“过去与统计”;实时库容量小、速度快,历史库容量大、可压缩、可长期保存。
二、数据存储机制:从采集到归档
数据进入SCADA后,先写入实时库,再由归档任务按策略写入历史库。归档策略通常包含三个参数:采样周期、存储死区、归档触发方式。采样周期决定“多久看一次”,死区决定“变化多少才值得记”,触发方式分为周期归档和变化归档。
以某电力监控点“有功功率”为例:采集周期1s,实时库每秒更新;历史库配置为“周期归档5s + 死区0.5kW”。若5s内功率从100.0kW变为100.3kW,变化量0.3kW小于死区0.5kW,则历史库不记录该中间值,只在下一次满足条件时记录。这样既保留了趋势,又大幅减少存储量。
历史库的物理存储通常采用“时间序列文件 + 索引”的方式。每个点按时间段切分成数据块,块内按时间戳排序,块头记录起止时间和压缩参数。查询时先定位时间块,再在块内做插值或聚合。报表常用的聚合函数包括:AVG(平均)、SUM(累计)、MAX(最大)、MIN(最小)、COUNT(有效点数)、INTEGRAL(积分,用于电量/流量累计)。
三、数据压缩:旋转门与死区
历史库最常用的压缩算法是旋转门压缩(Swinging Door)。它不保存每个采样点,而是用“斜率变化是否超出容差”来判断是否记录。容差通常由死区或压缩偏差决定。压缩率可达5:1到20:1,代价是丢失局部细节。
压缩对报表的影响必须提前评估。例如做“最大需量”统计时,如果压缩把峰值削掉,报表就会偏小。因此,对需要精确峰值的点,应单独设置较小的死区或关闭压缩;对只做趋势观察的点,可以放宽死区。压缩参数不是全局统一值,而应按点类型分组配置。
四、数据质量标记:报表可信度的关键
SCADA的每个采样值都带质量码。常见质量码包括:好(Good)、坏(Bad)、不确定(Uncertain)、超时(Timeout)、手动(Manual)。质量码决定了这个值能不能参与统计。
报表取数时,必须对质量码做过滤。例如计算“昨日平均温度”时,若某段时间质量码为“坏”,应将该时段剔除,而不是把0或前值直接算进去。否则平均值会被拉低或拉高,导致KPI失真。建议在报表SQL或脚本中显式加入质量条件,例如:
SELECT AVG(value)
FROM historian
WHERE tag = 'TEMP_01'
AND ts >= '2025-01-01 00:00:00'
AND ts < '2025-01-02 00:00:00'
AND quality = 0; -- 仅取质量码为“好”的点
对于“超时”点,常见处理是保持前值并标记,或补零但标记为估算。报表中应区分“实测值”和“估算值”,避免把补值当成真实数据。
五、报表取数来源选择
报表取数不是“一律查历史库”这么简单。正确做法是按数据用途选择来源:
- 当前值、最新状态、实时报警:取实时库,保证低延迟。
- 历史趋势、日报月报、累计量、平均值、最大值:取历史库,保证可回溯。
- 班次统计、跨天累计:取历史库,并注意时区与班次边界。
- 需要精确峰值的考核点:取历史库中未压缩或小死区的归档点。
- 质量码异常时段:按规则剔除或标记,不能直接参与统计。
一个实用的判断原则是:“看现在”用实时库,“算过去”用历史库,“算得准”看质量码和压缩配置。在报表开发前,先确认每个指标的数据来源、采样周期、死区、质量过滤规则和聚合函数,再写取数逻辑,才能保证报表结果与现场实际一致。