预测性维护相关资料

引言

对预测性维护相关资料进行整理,便于查阅。

预测性维护工作流

使用数字孪生体进行预测性维护

预测性维护工作流
预测性维护工作流

结合Simulink仿真和预测性维护工具箱(Predictive Maintenance Toobbox)

  • 构建数字孪生体
  • 获取数据
  • 数据预处理
  • 创建预测模型
  • 部署算法

预测性维护主要包括两个方向:故障诊断和剩余寿命(RUL)预测。

Data Ensembles for Condition Monitoring and Predictive Maintenance

所需数据主要包括三类:

  • 系统正常运行
  • 系统在故障状态下运行
  • 系统运行的寿命记录(从正常到故障的数据)

小迈步之人工智能(二):大数据跌进人工智能的坑,预测性维护如何实现和落地

主要内容包括:

  • 利用数字孪生仿真目标对象,并产生仿真数据
  • 利用数据进行预处理和特征提取
  • 利用机器学习技术构建设备的故障诊断和剩余寿命预测模型
  • 利用 App Designer 生成用户界面

故障诊断工作流相关

Predictive Maintenance in Hydraulic Pump

Multi-Class Fault Detection Using Simulated Data

Analyze and Select Features for Pump Diagnostics

  • 导入带标签的数据
  • 对数据进行预处理
  • 对数据进行探索和特征提取
  • 选择合适的机器学习分类模型
    • 决策树
    • SVM
    • 朴素贝叶斯分类器
    • 最近邻分类器
    • 集成分类器
      • 提升树
      • 装袋树

寿命预测工作流相关

Wind Turbine High-Speed Bearing Prognosis

Data Import

数据导入主要通过 fileEnsembleDatastore 函数来完成。

Data Exploration

对初始数据进行初步的探索,包括一些基础特征的变化等等。主要通过各类统计图的观察来初步分析。

Feature Extraction

基于前一步数据探索后的结果对需要、有价值的特征进行提取,主要包括以下特征:

  • 时域(time-domain)
    • Mean
    • Std
    • Skewness
    • Kurtosis
    • Peak2Peak
    • RMS
    • CrestFactor
    • ShapeFactor
    • ImpulseFactor
    • MarginFactor
    • Energy
  • 频域
    • 谱峰(spectral kurtosis)
      • SKMean
      • SKStd
      • SKSkewness
      • SKKurtosis

关于信号频域分析方法的理解,参见:信号频域分析方法的理解(频谱、能量谱、功率谱、倒频谱、小波分析) - Mr.括号的文章 - 知乎

Feature Postprocessing

提取出的特征通常包含噪声,因此需要进行平滑处理。

这里采用的是移动均值平滑(moving mean smothing),对应的 matlab 函数为 movmean 。该方法会引入信号的时间延迟,可以通过在 RUL 预测中选择适当的阈值来减轻延迟影响。

对于时间序列的平滑处理主要包括两种方法:移动平均法(Moving average, MA)和指数平滑法(Exponential Smoothing, ES),具体可参考:

Training Data

创建训练集。通常利用现有数据的部分数据作为训练集。

Feature Importance Ranking

对数据特征的重要性进行排序。这里选择的是单调性(monotonicity)来度量这些特征的重要性。对应的 matlab 函数为 monotonicity

Dimension Reduction and Feature Fusion

利用主成分分析(PCA)对特征进行降维,在进行 PCA 之前,需要对特征数据进行归一化处理。

可通过观察主成分之间的关系,选择合适的健康指标。

Fit Exponenential Degradation Models for Remaining Useful Life (RUL) Estimation

观察健康指标的变化趋势选择合适的衰退模型,这里使用的是指数衰退模型(Exponenential Degradation Models)。利用 predictRULupdate 方法对 RUL 进行预测,并实时更新参数分布。

real-time RUL estimation
real-time RUL estimation

RUL Estimation Using RUL Estimator Models

使用 RUL 预测模型的工作流:

  1. 选择合适的 RUL 预测模型
  2. 利用历史数据训练该模型,使用 fit 命令
  3. 利用同种类型组件的历史数据预测待估计 RUL 的测试组件,使用 predictRUL 命令,同时还可以利用该测试组件已产生的数据对预测模型进行更新,使用 update 命令

RUL 预测模型家族:

rul_families
rul_families

Performance Analysis

\(\alpha-\lambda\) 图用于预后性能分析(prognosis performance analysis),其中 \(\alpha\) 界限设为 \(20\%\)。估计的 RUL 介于真实 RUL 的 \(\alpha\) 界限之间的概率被计算作为模型的性能度量:

\[ {\rm Pr}(r^*(t)-\alpha r^*(t)<r^*(t)+\alpha r^*(t)|\Theta(t)) \]

其中 \(r(t)\)\(t\) 时刻估计的 RUL,\(r^*(t)\) 表示在 \(t\) 时刻真实的 RUL,\(\Theta(t)\)\(t\) 时刻估计的模型参数。

alpha-lambda plot
alpha-lambda plot
alpha20 probability
alpha20 probability

matlab 相关方法

编程建模

编程建模基础知识

  • 加载模型
    • load_system(<modelname>)
  • 创建模型并指定参数设置
    • new_model(<modelname>)
    • set_param(<modelname>, <Variable>, <Value>)
  • 打开模型时通过编程方式加载变量
    • set_param(<modelname>, 'PreloadFcn', <variable=value>)
  • 以编程方式添加和连接模块
    • add_block
    • add_line
    • delete_line
  • 通过编程方式命名信号
  • 自动排列模型布局
    • Simulink.BlockDiagram.arrangeSystem
    • Simulink.BlockDiagram.routeLine
  • 在多个窗口中打开同一个模型
    • open_system(<modelname>, 'window')
  • 获取 Simulink 标识符
    • Simulink.ID.getSID(<model/block>)
  • 以编程方式指定颜色

控制仿真状态:

1
set_param(<modelname>, 'SimulationCommand', <command>)

<command> 可以是 startpausecontinuestop

如果使用 start 参数启动仿真,则必须使用 stop 参数来停止仿真。

<command> 还可以是:

  • update:在仿真运行时动态更新以更改的工作区变量
  • WriteDataLogs:将所有数据记录变量写入基础工作区

检查仿真的状态:

1
get_param(<modelname>, 'SimulationStatus')

将返回 stoppedinitialzingrunningpausedcompiledupdatingterminatingexternal

常用 matlab 特性

对于大数据,防止数据溢出内存,可以使用 tall 类型,推迟运算,使用 gather 函数进行运算获取结果。具体参见:Deferred Evaluation of Tall Arrays

timer:定时器。

生成和使用模拟数据集合

Generate and Use Simulated Data Ensemble

Manage System Data

载入模型

1
2
mdl = 'TransmissionCasingSimplified';
open_system(mdl)

生成模拟数据集合

1
2
3
4
5
6
7
8
9
10
11
12
toothFaultValues  = -2:0.5:0; % 5 ToothFaultGain values

% 设置多组仿真
for ct = numel(toothFaultValues):-1:1
tmp = Simulink.SimulationInput(mdl);
tmp = setVariable(tmp,'ToothFaultGain',toothFaultValues(ct));
simin(ct) = tmp;
end

mkdir Data
location = fullfile(pwd,'Data');
[status,E] = generateSimulationEnsemble(simin,location);

模拟数据集合存储

1
2
3
4
ensemble = simulationEnsembleDatastore(location)

% ensemble.DataVariables
% ensemble.SelectedVariables

读取数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
ensemble.SelectedVariables = ["Vibration";"SimulationInput"];
data1 = read(ensemble)
% data1=1×2 table
% Vibration SimulationInput
% _________________ ______________________________
%
% {581x1 timetable} {1x1 Simulink.SimulationInput}

data2 = read(ensemble)
% data2=1×2 table
% Vibration SimulationInput
% _________________ ______________________________
%
% {594x1 timetable} {1x1 Simulink.SimulationInput}

% 可以设置一次性读取数据的大小
ensemble.ReadSize = 2;

ensemble.SelectedVariables = ["Vibration";"ToothFault"];
data3 = read(ensemble)

% data3=2×2 table
% Vibration ToothFault
% _________________ __________
%
% {581x1 timetable} false
% {594x1 timetable} false

read(<ensemble>) 函数类似于 Python 中的 next,模拟数据集合相当于 Pyhon 中的生成器。

可通过 reset(<ensemble>) 来将整体数据置于未读状态,从而能够从头读取数据。

追加集合成员数据

1
2
3
4
5
6
7
8
9
reset(ensemble);
sT = false;
while hasdata(ensemble)
data = read(ensemble);
SimInputVars = data.SimulationInput{1}.Variables;
TFGain = SimInputVars.Value;
sT = (abs(TFGain) < 0.1);
writeToLastMemberRead(ensemble,'ToothFault',sT);
end
KivenC wechat
微信扫一扫,订阅本博客
0%