TDengine 应用案例 — 工业大数据与智能制造
·
分类:15.应用案例 | 篇章:02 工业大数据
免费详情
智能制造场景具有测点数量大、采集频率高、对实时分析要求严格的特点。本文以汽车装配车间为例,展示 TDengine 在 SCADA/MES 场景下的应用。
场景速查表
| 维度 | 参数 |
|---|---|
| 设备数 | 500 台 |
| 测点数 | 5 万(每设备 100 个) |
| 频率 | 1 秒/点(部分高频 100ms) |
| 数据量 | 数十 GB/天 |
| 保留 | 1 年热 + 3 年冷 |
详细解析
1. 业务背景
汽车装配车间:
① 设备类型:
- 焊接机器人 100 台
- 涂装线 50 台
- 装配工位 200 台
- 检测设备 150 台
② 测点:
- 设备运行参数(温度、压力、电流、振动)
- 工艺参数(焊接电流、涂层厚度)
- 质量数据(尺寸、扭矩)
- 能耗(电、水、气)
③ 需求:
- SCADA 实时显示
- 工艺追溯(按车架号反查)
- OEE / 设备效率分析
- 预测性维护
- 能耗管理
2. 数据建模
-- 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 实时查询
-- 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. 工艺追溯
-- 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 计算
-- 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. 预测性维护
-- 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. 能耗分析
-- 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;
代码示例
实时大屏流计算
-- 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 实时监控应用
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 推荐
-- 大量历史聚合查询
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 同步到云端
- 边缘做实时分析,云端做长期归档
参考
系统构架篇
- 01-《TDengine 整体架构全景》
- 02-《集群拓扑深度解析》
- 03-《MNode 内部机制深度解析》
- 04-《RPC 通信层深度解析》
- 05-《VNode 生命周期》
- 06-《RAFT 共识协议》
- 07-《端到端的消息流》
数据模型
- 01-《数据库创建与参数详解》
- 02-《超级表/子表/普通表》
- 03-《支持数据类型深度解析》
- 04-《TDengine Tag 设计哲学与 Schema 变更机制》
- 05-《TDengine 虚拟表实现原理》
存储引擎
- 01-《TDengine 存储引擎概览》
- 02-《TDengine MemTable 深度解析》
- 03-《TDengine WAL 预写日志机制》
- 04-《TDengine 数据文件格式》
- 05-《TDengine Commit 与 Flush 机制 》
- 06-《TDengine Compaction 合并策略 》
- 07-《TDengine 数据保留与 TTL》
- 08-《TDengine 压缩编码机制》
- 09-《TDengine Cache 与 Last 查询加速》
- 10-《TDengine 逻辑计划生成》
查询引擎
- 01-《TDengine 查询引擎概览》
- 02-《TDengine SQL 解析与词法分析》
- 03-《TDengine 语义分析与 AST 重写》
- 04-《TDengine 逻辑计划生成》
- 05-《TDengine 物理计划生成》
- 06-《TDengine 扫描算子》
- 07-《TDengine 聚合算子》
- 08-《TDengine 连接算子》
- 09-《TDengine 排序、填充与投影》
- 10-《TDengine 分布式查询执行》
- 11-《TDengine EXPLAIN 与查询优化》
数据写入
- 01-《TDengine SQL INSERT》
- 02-《TDengine 无模式写入》
- 03-《TDengine STMT 写入》
- 04-《TDengine 写入内部流程》
- 05-《TDengine 数据更新删除》
数据订阅
- 01-《TDengine 数据订阅》
- 02-《TDengine 订阅 vs Kafka》
- 03-《TDengine TMQ 消费流程》
- 04-《TDengine 内部机制》
- 05-《TDengine TMQ 最佳实践》
预聚合
索引
SQL 语句
- 01-《TDengine DDL》
- 02-《TDengine DML SELECT》
- 03-《TDengine DML 函数完整参考》
- 04-《TDengine JOIN 完整语法》
- 05-《TDengine 窗口完整语法》
- 06-《TDengine 操作符与表达式》
- 07-《TDengine 系统表》
- 08-《TDengine SQL 与标准 SQL 差异》
客户端与连接器
- 01-《TDengine 的连接方式》
- 02-《TDengine C/C++ 连接器》
- 03-《TDengine java 连接器》
- 04-《TDengine Python 连接器》
- 05-《TDengine Go 与 Rust 连接器》
- 06-《TDengine Node.js 与 C# 连接器》
运维
- 01-《TDengine 部署指南》
- 02-《TDengine 配置详解》
- 03-《TDengine 监控系统》
- 04-《TDengine 备份与恢复》
- 05-《TDengine 版本升级》
- 06-《TDengine 加密使用指南》
安全
生态
应用案例
关于 TDengine
TDengine 专为物联网IoT平台、工业大数据平台设计。其中,TDengine TSDB 是一款高性能、分布式的时序数据库(Time Series Database),同时它还带有内建的缓存、流式计算、数据订阅等系统功能;TDengine IDMP 是一款AI原生工业数据管理平台,它通过树状层次结构建立数据目录,对数据进行标准化、情景化,并通过 AI 提供实时分析、可视化、事件管理与报警等功能。
更多推荐

所有评论(0)