TDengine 应用案例 — 能源与电力监控

分类 :15.应用案例 | 篇章 :04 能源与电力

免费详情

电力行业的时序数据涵盖发电、输电、配电、用电全链路。本文以一个虚拟的智能电网监控系统为例,展示 TDengine 在能源场景的应用。

场景速查表

维度 参数
变电站 500 座
测点 100 万
频率 秒级
数据量 50 GB/天
保留 永久

详细解析

1. 业务背景

复制代码
智能电网监控:

  ① 监控范围:
     - 500 座变电站
     - 1 万条线路
     - 10 万台开关
     - 100 万只电表
  
  ② 数据类型:
     - 电气量(电压/电流/功率)
     - 设备状态
     - 谐波
     - 温度
     - 故障录波
  
  ③ 需求:
     - SCADA 实时监控
     - 故障定位
     - 负荷预测
     - 线损分析
     - 新能源消纳

2. 数据建模

sql 复制代码
-- 1. 电网数据库
CREATE DATABASE grid 
  PRECISION 'ms' 
  KEEP 3650 
  DURATION 30 
  REPLICA 3 
  VGROUPS 32;

USE grid;


-- 2. 变电站测点
CREATE STABLE substation_metrics (
  ts TIMESTAMP,
  voltage_a FLOAT,         -- A 相电压
  voltage_b FLOAT,         -- B 相电压
  voltage_c FLOAT,         -- C 相电压
  current_a FLOAT,         -- A 相电流
  current_b FLOAT,         -- B 相电流
  current_c FLOAT,         -- C 相电流
  active_power FLOAT,      -- 有功功率 kW
  reactive_power FLOAT,    -- 无功功率 kvar
  power_factor FLOAT,      -- 功率因数
  frequency FLOAT,         -- 频率 Hz
  temperature FLOAT,       -- 设备温度
  thd FLOAT                -- 谐波畸变率 %
) TAGS (
  station_id BINARY(20),
  station_name NCHAR(50),
  voltage_level NCHAR(10), -- 110kV/220kV/500kV
  region NCHAR(30),
  province NCHAR(20)
);


-- 3. 电表数据
CREATE STABLE meter_data (
  ts TIMESTAMP,
  energy_active DOUBLE,     -- 有功电量 kWh
  energy_reactive DOUBLE,   -- 无功电量
  power_now FLOAT,          -- 瞬时功率
  voltage FLOAT,
  current FLOAT,
  pf FLOAT
) TAGS (
  meter_id BINARY(20),
  user_id BINARY(20),
  user_type TINYINT,        -- 1居民/2工业/3商业
  line_id BINARY(20),
  city NCHAR(20)
);


-- 4. 开关状态
CREATE STABLE switch_status (
  ts TIMESTAMP,
  state TINYINT,            -- 0断开/1闭合
  reason TINYINT,           -- 操作原因
  protection_op INT         -- 保护动作码
) TAGS (
  switch_id BINARY(20),
  station_id BINARY(20),
  switch_type NCHAR(20)
);


-- 5. 新能源发电
CREATE STABLE renewable_generation (
  ts TIMESTAMP,
  power_active FLOAT,
  wind_speed FLOAT,         -- 风电
  irradiance FLOAT,         -- 光伏辐照
  panel_temp FLOAT,
  efficiency FLOAT
) TAGS (
  plant_id BINARY(20),
  plant_type TINYINT,       -- 1风电/2光伏
  capacity_mw FLOAT,
  region NCHAR(30)
);

3. 实时监控

sql 复制代码
-- 1. 全网电压合格率
SELECT 
  voltage_level,
  COUNT(CASE WHEN voltage_a BETWEEN 209 AND 231 THEN 1 END) * 100.0 / COUNT(*) 
    AS qualified_pct 
FROM substation_metrics 
WHERE ts > NOW - 5m 
PARTITION BY voltage_level;


-- 2. 重载线路
SELECT station_name, line_id, LAST(current_a) AS current_a 
FROM substation_metrics 
WHERE ts > NOW - 5m 
PARTITION BY station_name, line_id 
HAVING current_a > 800;


-- 3. 高负荷变电站
SELECT station_name, 
       MAX(active_power) AS max_power 
FROM substation_metrics 
WHERE ts > NOW - 1h 
PARTITION BY station_name 
ORDER BY max_power DESC LIMIT 10;


-- 4. 异常谐波
SELECT station_name, AVG(thd) AS avg_thd 
FROM substation_metrics 
WHERE ts > NOW - 1h 
PARTITION BY station_name 
HAVING avg_thd > 5;

4. 负荷预测分析

sql 复制代码
-- 1. 日负荷曲线
SELECT _wstart, AVG(active_power) AS power 
FROM substation_metrics 
WHERE ts > NOW - 1d 
INTERVAL(15m);


-- 2. 历史同期对比
SELECT 
  _wstart, 
  AVG(active_power) AS today,
  (SELECT AVG(active_power) FROM substation_metrics 
    WHERE ts BETWEEN _wstart - 7d AND _wstart - 7d + 15m) AS last_week 
FROM substation_metrics 
WHERE ts > NOW - 1d 
INTERVAL(15m);


-- 3. 用户用电模式
SELECT 
  HOUR(ts) AS hour, user_type, 
  AVG(power_now) AS avg_power 
FROM meter_data 
WHERE ts > NOW - 30d 
GROUP BY hour, user_type 
ORDER BY hour;


-- 4. 峰谷分析
SELECT 
  user_type, 
  MAX(power_now) AS peak,
  MIN(power_now) AS valley,
  MAX(power_now) / MIN(power_now) AS ratio 
FROM meter_data 
WHERE ts > NOW - 7d 
PARTITION BY user_type;

5. 线损分析

sql 复制代码
-- 1. 线路线损率
-- 线损 = (输入电量 - 输出电量) / 输入电量
WITH line_input AS (
  SELECT line_id, 
         SUM(LAST(energy_active) - FIRST(energy_active)) AS in_kwh 
  FROM meter_data 
  WHERE user_type = 99   -- 关口表
    AND ts > NOW - 30d 
  PARTITION BY line_id
),
line_output AS (
  SELECT line_id, 
         SUM(LAST(energy_active) - FIRST(energy_active)) AS out_kwh 
  FROM meter_data 
  WHERE user_type != 99 
    AND ts > NOW - 30d 
  PARTITION BY line_id
)
SELECT 
  i.line_id, 
  i.in_kwh, o.out_kwh,
  (i.in_kwh - o.out_kwh) * 100.0 / i.in_kwh AS loss_rate 
FROM line_input i 
JOIN line_output o ON i.line_id = o.line_id 
ORDER BY loss_rate DESC;

6. 故障定位

sql 复制代码
-- 1. 故障录波(保护动作前后波形)
SELECT ts, voltage_a, voltage_b, voltage_c, 
       current_a, current_b, current_c 
FROM substation_metrics 
WHERE station_id = 'ST001' 
  AND ts BETWEEN '2026-06-04 14:23:00' AND '2026-06-04 14:24:00' 
ORDER BY ts;


-- 2. 故障定位
SELECT ts, switch_id, station_id, state, protection_op 
FROM switch_status 
WHERE protection_op > 0 
  AND ts > NOW - 1h 
ORDER BY ts;


-- 3. 故障影响用户数(断电用户)
SELECT line_id, COUNT(DISTINCT user_id) AS affected 
FROM meter_data 
WHERE line_id IN (
  SELECT DISTINCT line_id FROM switch_status 
  WHERE state = 0 AND ts > NOW - 1h
);

7. 新能源消纳

sql 复制代码
-- 1. 新能源出力
SELECT _wstart, plant_type, SUM(power_active) AS total_mw 
FROM renewable_generation 
WHERE ts > NOW - 1d 
PARTITION BY plant_type 
INTERVAL(1h);


-- 2. 风光出力曲线(光伏 + 风电)
SELECT _wstart, 
  SUM(CASE WHEN plant_type=1 THEN power_active ELSE 0 END) AS wind_mw,
  SUM(CASE WHEN plant_type=2 THEN power_active ELSE 0 END) AS solar_mw 
FROM renewable_generation 
WHERE ts > NOW - 1d 
INTERVAL(1h);


-- 3. 弃风弃光率
WITH theoretical AS (
  SELECT plant_id, SUM(capacity_mw) * 24 AS theory_mwh 
  FROM renewable_generation 
  WHERE ts > NOW - 1d 
  PARTITION BY plant_id
),
actual AS (
  SELECT plant_id, SUM(power_active) AS actual_mw 
  FROM renewable_generation 
  WHERE ts > NOW - 1d 
  PARTITION BY plant_id
)
SELECT 
  a.plant_id, 
  (t.theory_mwh - a.actual_mw) / t.theory_mwh * 100 AS curtail_pct 
FROM theoretical t JOIN actual a ON t.plant_id = a.plant_id;

8. 电能质量分析

sql 复制代码
-- 1. 电压偏差统计
SELECT 
  station_name,
  COUNT(CASE WHEN ABS(voltage_a - 220) > 22 THEN 1 END) AS deviations 
FROM substation_metrics 
WHERE ts > NOW - 1d 
PARTITION BY station_name 
ORDER BY deviations DESC LIMIT 20;


-- 2. 频率偏差(电网频率应稳定在 50Hz)
SELECT 
  station_name,
  MAX(ABS(frequency - 50)) AS max_freq_dev 
FROM substation_metrics 
WHERE ts > NOW - 1d 
PARTITION BY station_name;


-- 3. 三相不平衡
SELECT 
  station_name,
  AVG((voltage_a + voltage_b + voltage_c) / 3 - voltage_a) AS imbalance_a,
  AVG((voltage_a + voltage_b + voltage_c) / 3 - voltage_b) AS imbalance_b,
  AVG((voltage_a + voltage_b + voltage_c) / 3 - voltage_c) AS imbalance_c 
FROM substation_metrics 
WHERE ts > NOW - 1h 
PARTITION BY station_name;

代码示例

流计算实时电力告警

sql 复制代码
-- 1. 电压越限告警
CREATE STREAM stream_voltage_alert TRIGGER AT_ONCE INTO voltage_alerts AS 
SELECT ts, station_id, station_name, 
       voltage_a, voltage_b, voltage_c 
FROM substation_metrics 
WHERE voltage_a < 209 OR voltage_a > 231 
   OR voltage_b < 209 OR voltage_b > 231 
   OR voltage_c < 209 OR voltage_c > 231;


-- 2. 重载告警
CREATE STREAM stream_overload TRIGGER AT_ONCE INTO overload_alerts AS 
SELECT ts, station_id, station_name, active_power 
FROM substation_metrics 
WHERE active_power > 80000;   -- 80 MW


-- 3. 区域负荷统计
CREATE STREAM stream_region_load INTO region_load_15m AS 
SELECT _wstart, region, 
       SUM(active_power) AS total_load 
FROM substation_metrics 
PARTITION BY region 
INTERVAL(15m);

Python 故障实时定位

python 复制代码
import taosws

consumer = taosws.Consumer({
  'td.connect.user': 'root',
  'td.connect.pass': 'taosdata',
  'group.id': 'fault_locator',
  'auto.offset.reset': 'latest',
})

consumer.subscribe(['voltage_alerts_topic'])

while True:
  msg = consumer.poll(1)
  if msg:
    for record in msg:
      for row in record:
        # 查相关线路状态
        nearby = query_nearby_switches(row['station_id'])
        if any(s['state'] == 0 for s in nearby):
          create_outage_ticket(row, nearby)

性能考量

数据规模

测点 频率 日量
100 万电表 1/min 1.5 亿条
100 万变电站测点 1/s 86 亿条

必要 TSMA

sql 复制代码
CREATE TSMA tsma_sub_1m ON substation_metrics 
FUNCTION(AVG(voltage_a), AVG(active_power), MAX(temperature)) 
INTERVAL(1m);

CREATE TSMA tsma_sub_1h ON substation_metrics 
FUNCTION(AVG(voltage_a), AVG(active_power), MAX(temperature)) 
INTERVAL(1h);

CREATE TSMA tsma_meter_1h ON meter_data 
FUNCTION(LAST(energy_active), AVG(power_now)) 
INTERVAL(1h);

FAQ

Q1: 电力数据如何保证不丢?

  • REPLICA=3
  • WAL fsync=2(同步)
  • 边缘缓存 + 重传
  • 定期数据完整性检查

Q2: 故障录波数据怎么存?

高频波形:

  • 单独超级表
  • 高频写入(事件触发)
  • 短期保留(7~30 天)

Q3: 电量统计跨天怎么算?

LAST(energy) - FIRST(energy),按设备 PARTITION BY 然后按天 INTERVAL(1d)。

Q4: 新能源场站接入?

  • 风机/光伏发电单独超级表
  • Tag 区分场站、类型、容量
  • 与上网电量关联分析

Q5: 安全要求?

  • 内网部署
  • 网络隔离
  • 等保 2.0/3.0
  • 操作审计
  • 数据加密

参考

系统构架篇

数据模型

存储引擎

查询引擎

数据写入

数据订阅

预聚合

索引

SQL 语句

客户端与连接器

运维

安全

生态

应用案例

关于 TDengine

TDengine 专为物联网IoT平台、工业大数据平台设计。其中,TDengine TSDB 是一款高性能、分布式的时序数据库(Time Series Database),同时它还带有内建的缓存、流式计算、数据订阅等系统功能;TDengine IDMP 是一款AI原生工业数据管理平台,它通过树状层次结构建立数据目录,对数据进行标准化、情景化,并通过 AI 提供实时分析、可视化、事件管理与报警等功能。

相关推荐
电商API_1800790524714 分钟前
自动化获取淘宝评论数据技术分享之API调用示例
大数据·运维·人工智能·自动化·网络爬虫
福建佰胜张工18 分钟前
西门子 ULTRAMAT23 分析仪 7MB2337‑0NH10‑3PW1 原理、调试、故障处理与现场运维全记录
大数据·运维·人工智能·自动化
jkyy201421 分钟前
从商品售卖到健康服务,数字化重构大健康品牌会员运营底层逻辑
大数据·人工智能·信息可视化·健康医疗
anxiao_m26 分钟前
电商云桌面解决方案哪个好?主流品牌深度测评,选型不踩坑
大数据
大模型码小白1 小时前
Spring AI 框架中集成 MCP 的完整指南:从服务端到客户端的全流程实践
大数据·运维·数据库·人工智能·python·sql·spring
YHL1 小时前
🐉 天龙八部 RAG 知识库实战:从零构建你的武侠 AI 助手
数据库·人工智能
小K讲AI营销1 小时前
固态电池战局拆解:机器人为何先于汽车吃到红利
大数据·人工智能·区块链
lhldsg1 小时前
课程排课实战指南:从需求分析到系统落地全流程
数据库·数据挖掘·需求分析
ECT-OS-JiuHuaShan1 小时前
共轭互逆链路论,彻底打击庸俗辩证法和不可知论
数据库·人工智能·算法·机器学习·数学建模