AI 预测性维护模拟组件 (燃气轮机轴承)
概述
这是一个交互式的 Web 组件,旨在模拟基于 AI 的预测性维护 (Predictive Maintenance, PdM) 概念,应用于工业燃气轮机的关键部件(例如轴承)。它通过模拟传感器数据、动态预测剩余使用寿命 (RUL),并根据预测结果提供相应的维护建议,展示 PdM 的基本工作流程和价值。
重要提示: 此组件是一个高度简化的概念演示,其传感器数据、RUL 计算和 AI 模型均为模拟,不代表真实的物理过程或复杂的机器学习模型。它的主要目的是教学和概念展示。
主要功能
- 设备与部件选择: 用户可以选择模拟的燃气轮机型号和具体的监测部件(如主轴承、输出轴承)。
- 实时传感器数据模拟: 模拟与所选部件相关的关键传感器(如振动、温度、声发射、负载、油液颗粒等)的实时读数,并根据模拟的健康状况显示状态(正常、警告、临界)。
- 动态 RUL 预测: 模拟 AI 模型根据当前的传感器数据和运行时间,持续预测所选部件的剩余使用寿命 (RUL),单位通常为小时或运行周期。
- 预测置信度: 显示模拟的 AI 模型对其当前 RUL 预测的置信度百分比。
- 三级维护建议: 根据预测的 RUL 值,自动生成并显示不同级别的维护建议:
- 监控 (Monitor): RUL 充足,状态良好,建议常规监控。
- 建议检查 (Inspect): RUL 低于警告阈值,建议在下次维护窗口进行检查。
- 紧急更换 (Replace): RUL 低于临界阈值,存在较高失效风险,建议立即安排更换。
- AI 模型特征重要性 (模拟): 展示模拟的 AI 模型认为哪些传感器特征对当前的 RUL 预测影响最大,帮助理解判断依据。
- 可视化界面:
- 采用简洁的科技感风格(类苹果工业风)。
- 响应式三栏布局(选择区 | 传感器与预测区 | 建议与特征区),适应不同屏幕尺寸。
- 通过颜色变化(RUL 值、传感器状态、建议卡片)提供直观的状态反馈。
如何使用
- 打开页面: 在现代浏览器中打开
index.html
文件。 - 选择设备: 从左上角的"选择设备"下拉菜单中选择一个燃气轮机型号(例如 GT-101)。
- 选择部件: 在"选择部件"下拉菜单中选择要监控的具体部件(例如 主轴承 A1)。
- 观察模拟:
- 中间面板会显示该部件相关的模拟传感器读数,并实时更新。
- 同时,中间面板也会显示模拟的 RUL 预测值和置信度,RUL 会随模拟时间的推移而逐渐降低。
- 右侧面板会根据当前的 RUL 显示相应的维护建议级别、描述和行动建议。
- 右下角会显示对当前预测影响最大的模拟特征及其相对重要性。
- 模拟会持续进行,直到 RUL 降至 0 或用户选择其他部件。
模拟逻辑简述
- 时间: 模拟以固定的时间步长(例如,每隔几秒代表运行 8 小时)推进。
- 传感器数据: 每个传感器有一个基础值和正常的波动范围(通过高斯噪声模拟)。当模拟的 RUL 降低时,部分传感器的读数会根据预设的退化模型(例如线性增加)逐渐偏离正常范围,模拟部件老化的过程。
- RUL 计算: 每个部件有一个基础的初始 RUL。RUL 的减少速度受基础退化率和当前传感器异常程度(通过计算一个综合的"异常分数"模拟)的影响。传感器读数越异常,RUL 下降越快。
- 置信度: 模拟的置信度会随着 RUL 降低或传感器异常增多而逐渐下降。
- 特征重要性: 预设了不同部件下各传感器的相对重要性得分,并可能随 RUL 变化进行微小的模拟调整。
再次强调,以上均为简化模拟,用于演示概念。
文件结构
ai-predictive-maintenance-turbine/
├── index.html # 组件的 HTML 结构
├── styles.css # 定义视觉样式的 CSS 文件
├── script.js # 实现交互逻辑和模拟功能的 JavaScript 文件
└── README.md # 本说明文件
技术栈
- HTML5
- CSS3 (使用了 CSS 变量和 Flexbox/Grid 布局)
- JavaScript (ES6+)
- 无外部库依赖。
效果展示
源码
index.html
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>AI预测性维护 - 燃气轮机轴承</title>
<link rel="stylesheet" href="styles.css">
</head>
<body>
<div class="pdm-container">
<header class="main-header">
<h1>基于AI的预测性维护组件</h1>
<div class="header-info">
<span class="model-info">模型类型: LSTM</span>
<span class="time-display" id="currentTime">--:--:--</span>
</div>
</header>
<main class="main-content">
<!-- Column 1: Component Selection & Sensor Dashboard -->
<section class="selection-sensors-panel panel">
<div class="selection-section">
<h2><i class="icon icon-turbine"></i> 设备与部件</h2>
<select id="turbineSelector">
<option value="GT001">燃气轮机 GT-001</option>
<option value="GT002">燃气轮机 GT-002</option>
</select>
<select id="bearingSelector">
<option value="B01">主轴承 #1 (输入端)</option>
<option value="B02">主轴承 #2 (输出端)</option>
</select>
<button class="action-button" id="loadDataBtn">加载/刷新数据</button>
</div>
<div class="sensors-dashboard-section">
<h2><i class="icon icon-sensors"></i> 实时传感器数据</h2>
<div id="sensorDashboard" class="sensor-dashboard">
<div class="sensor-reading placeholder" id="sensorPlaceholder">请选择设备并加载数据</div>
<!-- Sensor readings populated by JS -->
<!-- Example Structure (repeated by JS): -->
<!--
<div class="sensor-reading" data-sensor-id="vibration_rms">
<span class="sensor-name">振动 RMS</span>
<span class="sensor-value">-- <span class="unit">mm/s</span></span>
<div class="status-indicator good"></div>
</div>
-->
</div>
</div>
</section>
<!-- Column 2: AI Prediction & History -->
<section class="prediction-history-panel panel">
<h2><i class="icon icon-ai"></i> AI 预测与历史趋势</h2>
<div class="prediction-output">
<h3><i class="icon icon-rul"></i> 预测剩余使用寿命 (RUL)</h3>
<div class="rul-display">
<span class="rul-value" id="predictedRulValue">--</span>
<span class="rul-unit" id="predictedRulUnit">小时</span>
</div>
<div class="prediction-confidence">
置信度: <span id="predictionConfidence">--</span>%
<div class="confidence-bar-container">
<div class="confidence-bar" id="confidenceBar"></div>
</div>
</div>
</div>
<div class="history-chart-section">
<h3><i class="icon icon-chart"></i> 关键传感器与 RUL 历史趋势</h3>
<div class="chart-placeholder" id="historyChart">
<div class="fake-chart prediction-trend"></div>
<span class="chart-axis-label y-axis">数值 / RUL</span>
<span class="chart-axis-label x-axis">运行时间 / 周期</span>
<div class="chart-legend">
<span class="legend-item sensor">传感器值 (模拟)</span>
<span class="legend-item rul">预测 RUL (模拟)</span>
</div>
</div>
</div>
</section>
<!-- Column 3: Maintenance Recommendation -->
<section class="recommendation-panel panel">
<h2><i class="icon icon-wrench"></i> 维护建议</h2>
<div id="recommendationDetails" class="recommendation-details">
<div class="recommendation-card placeholder" id="recommendationPlaceholder">等待预测结果...</div>
<!-- Recommendation card populated by JS -->
<!-- Example Structure:
<div class="recommendation-card level-monitor">
<div class="card-header">
<i class="icon icon-monitor"></i>
<span class="level-text">继续监控</span>
</div>
<p class="card-description">当前状态正常,RUL 充足。按标准周期进行巡检。</p>
<div class="next-action">下次评估: <span id="nextEvalTime">--</span></div>
</div>
-->
</div>
<div class="feature-importance-section">
<h4><i class="icon icon-features"></i> 模型特征重要性 (概念)</h4>
<ul id="featureImportanceList" class="feature-list">
<li class="placeholder">模型加载中...</li>
<!-- Features populated by JS -->
</ul>
</div>
</section>
</main>
<footer class="main-footer">
<p>© 2024 AI预测性维护模拟系统. 概念演示.</p>
</footer>
</div>
<script src="script.js"></script>
</body>
</html>
styles.css
:root {
--bg-color-light: #f9f9f9;
--bg-color-container: #ffffff;
--header-bg: #f5f5f7;
--panel-bg: #ffffff;
--border-color: #d1d1d6;
--border-color-subtle: #e5e5ea;
--text-primary: #1d1d1f;
--text-secondary: #515154;
--text-label: #6e6e73;
--accent-blue: #007aff;
--accent-green: #34c759;
--accent-orange: #ff9500;
--accent-red: #ff3b30;
--accent-purple: #af52de; /* AI/Prediction related */
--accent-teal: #5ac8fa; /* Sensor/Data related */
--accent-grey: #8e8e93;
--status-good: var(--accent-green);
--status-warning: var(--accent-orange);
--status-critical: var(--accent-red);
--level-monitor-bg: rgba(52, 199, 89, 0.08);
--level-monitor-border: var(--status-good);
--level-inspect-bg: rgba(255, 149, 0, 0.08);
--level-inspect-border: var(--status-warning);
--level-replace-bg: rgba(255, 59, 48, 0.08);
--level-replace-border: var(--status-critical);
--list-item-hover-bg: #f0f0f0;
--input-bg: #f0f2f5;
--input-border: transparent;
--input-focus-border: var(--accent-blue);
--placeholder-text: #aaaaaa;
--chart-placeholder-bg: #f8f8f8;
--chart-axis-color: #b0b0b0;
--chart-sensor-color: var(--accent-teal);
--chart-rul-color: var(--accent-purple);
--shadow-color: rgba(0, 0, 0, 0.05);
--font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
--font-monospace: "SF Mono", Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
--border-radius: 8px;
--border-radius-small: 4px;
--transition-speed: 0.3s; /* Slightly slower for smoother transitions */
}
* {
box-sizing: border-box;
margin: 0;
padding: 0;
}
body {
font-family: var(--font-family);
background-color: var(--bg-color-light);
color: var(--text-primary);
line-height: 1.4;
overflow-x: hidden;
}
.pdm-container {
max-width: 1600px;
margin: 1rem auto;
background-color: var(--bg-color-container);
border-radius: var(--border-radius);
box-shadow: 0 4px 12px var(--shadow-color);
overflow: hidden;
display: flex;
flex-direction: column;
height: calc(100vh - 2rem); /* Limit height */
min-height: 650px;
}
/* Header */
.main-header {
background-color: var(--header-bg);
padding: 0.75rem 1.5rem;
border-bottom: 1px solid var(--border-color);
flex-shrink: 0;
display: flex;
justify-content: space-between;
align-items: center;
}