TDengine 应用案例 — 工业大数据与智能制造

分类 :15.应用案例 | 篇章 :02 工业大数据

免费详情

智能制造场景具有测点数量大、采集频率高、对实时分析要求严格的特点。本文以汽车装配车间为例,展示 TDengine 在 SCADA/MES 场景下的应用。

场景速查表

维度 参数
设备数 500 台
测点数 5 万(每设备 100 个)
频率 1 秒/点(部分高频 100ms)
数据量 数十 GB/天
保留 1 年热 + 3 年冷

详细解析

1. 业务背景

复制代码
汽车装配车间:

  ① 设备类型:
     - 焊接机器人 100 台
     - 涂装线 50 台
     - 装配工位 200 台
     - 检测设备 150 台
     
  ② 测点:
     - 设备运行参数(温度、压力、电流、振动)
     - 工艺参数(焊接电流、涂层厚度)
     - 质量数据(尺寸、扭矩)
     - 能耗(电、水、气)
     
  ③ 需求:
     - SCADA 实时显示
     - 工艺追溯(按车架号反查)
     - OEE / 设备效率分析
     - 预测性维护
     - 能耗管理

2. 数据建模

sql 复制代码
-- 1. 数据库
CREATE DATABASE manufacturing 
  PRECISION 'ms' 
  KEEP 365 
  DURATION 7 
  REPLICA 3 
  VGROUPS 32;

USE manufacturing;


-- 2. 按设备类型建超级表

-- 焊接机器人
CREATE STABLE robot_welding (
  ts TIMESTAMP,
  current_a FLOAT,        -- 焊接电流
  voltage_v FLOAT,        -- 焊接电压
  wire_speed FLOAT,       -- 送丝速度
  gas_flow FLOAT,         -- 保护气流量
  temperature FLOAT,      -- 焊枪温度
  vibration FLOAT,        -- 振动 mm/s
  motor_current FLOAT,    -- 电机电流
  cycle_count BIGINT,     -- 循环计数
  status TINYINT,         -- 状态
  fault_code INT          -- 故障码
) TAGS (
  equipment_id BINARY(20),
  workshop NCHAR(20),
  line BINARY(20),
  station BINARY(20),
  model NCHAR(50),
  install_year SMALLINT
);


-- 装配工位
CREATE STABLE station_assembly (
  ts TIMESTAMP,
  torque FLOAT,           -- 扭矩
  angle FLOAT,            -- 角度
  duration_ms INT,        -- 工序时长
  vin BINARY(20),         -- 车架号
  part_no BINARY(30),     -- 零件号
  operator BINARY(20),    -- 操作员
  result TINYINT          -- 结果 0/1
) TAGS (
  equipment_id BINARY(20),
  workshop NCHAR(20),
  station BINARY(20)
);


-- 能耗
CREATE STABLE energy_meter (
  ts TIMESTAMP,
  power_kw FLOAT,         -- 瞬时功率
  energy_kwh DOUBLE,      -- 累计电量
  voltage FLOAT,
  current FLOAT,
  pf FLOAT                -- 功率因数
) TAGS (
  meter_id BINARY(20),
  workshop NCHAR(20),
  feeder BINARY(20)
);

3. 数据采集架构

复制代码
OPC UA Server (PLC)
        │
        ├── 协议:OPC UA / Modbus / S7
        │
        ▼
  taosX OPC UA Connector
        │
        ├── 周期采集
        ├── 字段映射
        │
        ▼
   TDengine
        │
        ├── Stream → 实时 KPI
        ├── TMQ → 告警系统
        └── Grafana → SCADA 大屏


采集要点:
  - 高频测点单独建超级表(100ms)
  - 低频测点合并(1s)
  - 状态变化用 STATE_WINDOW
  - 大量 boolean 用位图压缩

4. SCADA 实时查询

sql 复制代码
-- 1. 车间总览
SELECT 
  workshop, 
  COUNT(DISTINCT tbname) AS active_equipment,
  AVG(motor_current) AS avg_load 
FROM robot_welding 
WHERE ts > NOW - 1m 
PARTITION BY workshop;


-- 2. 单设备最新状态
SELECT * FROM robot_welding 
WHERE equipment_id = 'WR_001' 
ORDER BY ts DESC LIMIT 1;


-- 3. 故障设备列表
SELECT tbname, equipment_id, LAST(fault_code) AS code 
FROM robot_welding 
WHERE ts > NOW - 5m 
PARTITION BY tbname 
HAVING code != 0;


-- 4. 高频曲线(最近 1 分钟)
SELECT ts, current_a, voltage_v 
FROM robot_welding 
WHERE equipment_id = 'WR_001' 
  AND ts > NOW - 1m 
ORDER BY ts;

5. 工艺追溯

sql 复制代码
-- 1. 按车架号查所有工序
SELECT * FROM station_assembly 
WHERE vin = 'VIN12345678' 
ORDER BY ts;


-- 2. 某车架在某工位的过程数据
SELECT 
  a.ts, a.torque, a.angle, a.result,
  w.current_a, w.voltage_v 
FROM station_assembly a 
LEFT JOIN robot_welding w 
  ON timetruncate(a.ts, 1s) = timetruncate(w.ts, 1s) 
  AND a.station = w.station 
WHERE a.vin = 'VIN12345678';


-- 3. 质量问题溯源(不合格批次共性)
SELECT 
  station, operator, 
  AVG(torque) AS avg_torque,
  COUNT(*) AS fail_count 
FROM station_assembly 
WHERE result = 0 
  AND ts > NOW - 7d 
PARTITION BY station, operator 
HAVING fail_count > 10 
ORDER BY fail_count DESC;

6. OEE 计算

sql 复制代码
-- OEE = 可用率 × 性能 × 质量

-- 1. 可用率(运行时间 / 计划时间)
SELECT 
  equipment_id,
  SUM(CASE WHEN status = 1 THEN 1 ELSE 0 END) * 1.0 / COUNT(*) 
    AS availability 
FROM robot_welding 
WHERE ts > NOW - 1d 
PARTITION BY equipment_id;


-- 2. 性能(实际节拍 / 理论节拍)
WITH cycle_data AS (
  SELECT 
    equipment_id, 
    LAST(cycle_count) - FIRST(cycle_count) AS cycles,
    LAST(ts) - FIRST(ts) AS duration_ms 
  FROM robot_welding 
  WHERE ts > NOW - 1d 
  PARTITION BY equipment_id
)
SELECT 
  equipment_id, 
  cycles * 1.0 / (duration_ms / 1000) AS actual_rate,
  cycles * 1.0 / (duration_ms / 1000) / theoretical_rate AS performance 
FROM cycle_data;


-- 3. 质量率
SELECT 
  station,
  SUM(result) * 1.0 / COUNT(*) AS quality_rate 
FROM station_assembly 
WHERE ts > NOW - 1d 
PARTITION BY station;


-- 4. OEE 综合
-- 三个指标相乘

7. 预测性维护

sql 复制代码
-- 1. 振动趋势异常检测
SELECT 
  equipment_id, 
  AVG(vibration) AS current_vib,
  (SELECT AVG(vibration) FROM robot_welding 
    WHERE equipment_id = r.equipment_id 
      AND ts BETWEEN NOW - 30d AND NOW - 7d) AS baseline 
FROM robot_welding r 
WHERE ts > NOW - 1d 
PARTITION BY equipment_id 
HAVING current_vib > baseline * 1.5;


-- 2. 状态变化频率
SELECT 
  equipment_id,
  COUNT(*) AS state_changes 
FROM (
  SELECT equipment_id, _wstart, status 
  FROM robot_welding 
  PARTITION BY equipment_id 
  STATE_WINDOW(status)
) 
WHERE _wstart > NOW - 1d 
PARTITION BY equipment_id 
HAVING state_changes > 50;


-- 3. 故障预测特征
SELECT 
  equipment_id, 
  STDDEV(motor_current) AS current_std,
  MAX(temperature) AS max_temp,
  AVG(vibration) AS avg_vib 
FROM robot_welding 
WHERE ts > NOW - 7d 
PARTITION BY equipment_id;

8. 能耗分析

sql 复制代码
-- 1. 车间日能耗
SELECT 
  workshop, 
  LAST(energy_kwh) - FIRST(energy_kwh) AS daily_kwh 
FROM energy_meter 
WHERE ts > NOW - 1d 
PARTITION BY workshop;


-- 2. 单位产量能耗(kWh/件)
WITH energy AS (
  SELECT workshop, 
         LAST(energy_kwh) - FIRST(energy_kwh) AS kwh 
  FROM energy_meter 
  WHERE ts > NOW - 1d 
  PARTITION BY workshop
),
production AS (
  SELECT workshop, COUNT(*) AS units 
  FROM station_assembly 
  WHERE ts > NOW - 1d AND result = 1 
  PARTITION BY workshop
)
SELECT 
  e.workshop, 
  e.kwh / p.units AS kwh_per_unit 
FROM energy e JOIN production p ON e.workshop = p.workshop;


-- 3. 峰谷电费分析
SELECT 
  workshop, 
  SUM(CASE WHEN HOUR(ts) BETWEEN 8 AND 22 THEN power_kw ELSE 0 END) * 0.001 
    AS peak_kwh,
  SUM(CASE WHEN HOUR(ts) NOT BETWEEN 8 AND 22 THEN power_kw ELSE 0 END) * 0.001 
    AS valley_kwh 
FROM energy_meter 
WHERE ts > NOW - 30d 
PARTITION BY workshop;

代码示例

实时大屏流计算

sql 复制代码
-- 1 分钟级 KPI
CREATE STREAM stream_workshop_kpi INTO workshop_kpi_1m AS 
SELECT 
  _wstart, workshop,
  AVG(motor_current) AS avg_current,
  COUNT(CASE WHEN status = 1 THEN 1 END) * 1.0 / COUNT(*) 
    AS availability,
  COUNT(CASE WHEN fault_code != 0 THEN 1 END) AS fault_count 
FROM robot_welding 
PARTITION BY workshop 
INTERVAL(1m);


-- 实时告警
CREATE STREAM stream_alerts TRIGGER AT_ONCE INTO alerts_stream AS 
SELECT 
  ts, equipment_id, workshop, 
  fault_code, status 
FROM robot_welding 
WHERE fault_code != 0 OR temperature > 80;

Python 实时监控应用

python 复制代码
import taosws

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

consumer.subscribe(['alerts_topic'])

while True:
  msg = consumer.poll(1)
  if msg:
    for record in msg:
      for row in record:
        send_to_andon(row)   # 推送到安灯系统
        if row['fault_code'] in CRITICAL_CODES:
          stop_line(row['workshop'])

性能考量

高频测点优化

频率 优化策略
100ms 单独超级表 + 高 CACHE
1s 标准建模
10s+ 普通建模 + TSMA

TSMA 推荐

sql 复制代码
-- 大量历史聚合查询
CREATE TSMA tsma_robot_1m ON robot_welding 
FUNCTION(AVG(current_a), AVG(voltage_v), MAX(temperature), MAX(vibration)) 
INTERVAL(1m);

CREATE TSMA tsma_robot_1h ON robot_welding 
FUNCTION(AVG(current_a), AVG(voltage_v), MAX(temperature), MAX(vibration)) 
INTERVAL(1h);

FAQ

Q1: OPC UA 怎么对接?

通过 taosX OPC UA Connector,或自研 Python/Java 客户端。

Q2: 高频 100ms 测点能存吗?

可以。注意:

  • 单独超级表
  • 用 STMT2 批量写
  • 多节点分摊
  • 提前规划存储

Q3: 车架号怎么关联?

把 VIN 作为列存储(不是 Tag)。可在多个超级表中通过 VIN + ts 关联查询。

Q4: MES 系统怎么集成?

  • 通过 REST API 写入工序数据
  • 通过 SQL 查询追溯
  • 通过 TMQ 订阅事件

Q5: 边缘端怎么部署?

  • 工厂边缘部署小集群
  • 通过 taosX 同步到云端
  • 边缘做实时分析,云端做长期归档

参考

系统构架篇

数据模型

存储引擎

查询引擎

数据写入

数据订阅

预聚合

索引

SQL 语句

客户端与连接器

运维

安全

生态

应用案例

关于 TDengine

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

相关推荐
狂热开发者1 小时前
打印机卖到欧洲以后 App 更新了,旧包装二维码还能用吗
数据库
SXkehuirongsheng1 小时前
定制软件开发哪家的售后响应速度更快?
大数据
2601_957879331 小时前
Seedance排队太久怎么办?2026免排队AI视频工具与替代方案怎么选
大数据·人工智能·深度学习
智码看视界1 小时前
Spark 3.5 AQE 调优:10 个生产环境案例让作业提速 3-10 倍
大数据·spark·性能调优·aqe·sparksql·数据倾斜·etl优化
张3蜂1 小时前
2026 中国国产数据库 Top 20:市场格局、开源协议与竞品分析
数据库
烟雨归来1 小时前
Oracle 19c RAC登录风暴引发library cache lock生产故障分析
数据库·oracle
longxiaozhang62 小时前
C#异常处理:程序出错了怎么办?
开发语言·数据库·c#
starzy19902 小时前
SparkStreaming 之容错机制深度剖析
大数据·spark
NineData2 小时前
DTCC 2026 NineData 叶正盛:如何统一管理人与 AI Agent 的数据访问行为
数据库·人工智能·sql·oracle·agent·ninedata·dtcc