城市供水SCADA中的时序数据库架构实践

Jing Wang

2026-10-23 /

供水数据的典型画像

一座百万人口级别城市的供水系统,SCADA终端数量通常在3000到8000台之间。这些终端分布在水厂、加压泵站、阀门井、用户水表井等位置,采集的物理量涵盖:

监测点类型

主要物理量

采样频率

数据量级/天/单测点

水厂出水

压力、流量、余氯、浊度、pH、水池水位

1秒

86,400条

加压泵站

进出口压力、流量、水泵状态、电流

1秒

86,400条

阀门井

阀门开度、前后压力、流量

5秒

17,280条

DMA分区计量

分区入口流量、压力

5秒

17,280条

用户水表井

瞬时流量、水压

10秒

8,640条

若按5000个终端计算,日新增原始数据约30亿条。这还未包含报警事件、离线在线状态、以及故障时的高频录波。一个中型地级市的完整供水数据,一年就能突破10TB原始存储量。

DMA分区计量的核心逻辑

DMA(District Metering Area,独立计量分区)技术是国际水协(IWA)推荐的供水管网漏损管理标准方法。其基本思路是将管网按自然边界或阀门关断划分为独立计量区,只允许有限的入口和出口,分别安装计量表计,通过出入口流量差计算该分区的漏损量。

DMA的核心计算链路:

夜间最小流量(1:00-5:00) 
    → 减去合法夜间用水量(通过用户水表折算)
    → 得出真实漏损量
    → 漏损率 = 漏损量 / 分区供水量
    → 报警阈值 = 历史均值 × 1.15(动态设定)

这里的关键挑战在于:夜间流量是秒级或5秒级的原始数据,而漏损分析需要天级甚至月级的聚合视角。同时,分区入口流量与出口流量需要精确时间对齐,否则流量差计算会出现伪差。一个DMA分区可能有4~8个计量点,数据量虽不及整个管网大,但时间同步精度要求在100ms以内。

时序数据库的标签模型设计

供水管网的数据天然具有空间层级属性:水厂→管网干管→DMA分区→街区→楼栋→用户。TDengine的标签体系可以直接映射这一结构。

CREATE STABLE water.pressure_sensor (
    ts timestamp, 
    val float, 
    quality tinyint
) TAGS (
    city nchar(16),        -- 城市
    water_plant nchar(32), -- 所属水厂
    dma_zone nchar(16),    -- DMA分区编号
    pipe_type nchar(16),   -- 管材类型(PE/铸铁/钢管)
    elevation int          -- 海拔高度(用于压力校正)
);

CREATE TABLE water.p_sensor_0001 USING water.pressure_sensor
TAGS ('Hangzhou', 'Qiantang', 'DMA-018', 'PE-200', 12);

这种设计的优势体现在两个查询场景:当运行人员需要查询”西湖区DMA-018分区过去7天的压力波动”时,标签过滤直接定位到相关子表;而当需要统计”杭州市所有PE管材管道的年平均压力”时,可以跨DMA分区聚合,不需要复杂的JOIN操作。

漏损定位的数据链路

传统漏损检测依赖夜间听音、相关仪、电磁定位等现场手段,效率低、覆盖有限。基于SCADA数据的漏损分析,核心是通过流量异常模式识别可能的漏点位置。

一个有效的漏损定位算法需要同时拉取以下数据:

  • 目标DMA分区出入口的秒级流量曲线
  • 分区内主要干管压力曲线(用于判断是否存在异常压降)
  • 相邻分区的流量变化(排除跨区转供干扰)
  • 历史同期数据(用于季节性调整基线)

计算引擎需要在秒级完成上述多源数据的拼接和聚合,这对数据库的JOIN性能和标签过滤能力提出了要求。TDengine的分布式计算引擎可以将关联计算下推到数据节点执行,避免将大量原始数据拉到查询端处理。

通信链路的特殊性

供水SCADA终端的通信方式以GPRS/4G/5G为主,部分偏远阀门井使用LoRaWAN或NB-IoT。这些链路的稳定性远不如有线以太网,丢包率在恶劣天气下可达10%~20%。

数据库层面需要处理的情况包括:数据延迟到达(超过写入窗口)、数据乱序(终端本地缓存断电重启后批量上报)、以及虚假时间戳(终端时钟漂移未同步)。TDengine通过时间窗口排序和质量码过滤来应对前两类问题,同时支持对延迟到达数据的写入配置专门的窗口阈值。

实际部署中,建议在采集网关层增加本地缓存(至少24小时容量)和时间戳校验逻辑,确保进入数据库的数据在时序上是基本连续的。

产销差计算的准确性保障

产销差(Non-Revenue Water,NRW)是供水企业最核心的KPI之一,计算公式为:

产销差率 = (水厂供水量 - 用户计费水量) / 水厂供水量 × 100%

供水量来自水厂出水总管的高精度流量计(通常是电磁流量计或超声波流量计,精度0.2%),计费水量来自用户水表(精度1%~2%)。两者的计量精度差异本身就会引入计算偏差,需要数据库在聚合计算时对不同精度的数据源加权处理。

实践中,供水量按小时粒度存储聚合值,计费水量按天粒度存储,产销差计算按天输出。TDengine的多级连续查询可以自动从原始数据生成小时级和天级聚合表,产销差计算作为依赖链的末端任务,在上游聚合完成后自动触发。

典型部署规模参考

城市规模

终端数量

日原始数据量

年存储量(原始+聚合)

推荐集群规模

县级市(10~30万人口)

1000~2000

5~10亿条

30~50TB

3节点,每节点8C32G×2TB SSD

地级市(50~100万人口)

3000~6000

15~30亿条

80~150TB

6节点,每节点16C64G×4TB SSD

直辖市/省会(200万+人口)

10000~20000

50~100亿条

300~600TB

12+节点,每节点16C128G×8TB SSD

结语

城市供水的数据架构,本质上是在有限的通信资源和分散的终端条件下,构建一条从物理管网到数字孪生的感知通道。时序数据库的选型,不能只看实验室写入TPS,更要看在真实网络条件下数据能否准确、连续地入库、能否支撑DMA分区这种跨终端的关联查询、以及能否以可接受的成本支撑5年以上的数据留存。TDengine在供水行业的多个标杆项目中,已经验证了其在这些维度上的工程可行性。