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