Этот пример показывает, как сгенерировать ансамбль данных для проекта алгоритма прогнозирующего обслуживания путем симуляции модели Simulink ® машины с изменением параметра отказа. Затем пример иллюстрирует некоторые способы взаимодействия с симуляцией ансамблем datastore. Пример показывает, как считать данные из datastore в рабочую область MATLAB ®, обработать данные для вычисления производных переменных и записать новые переменные обратно в datastore.
Модель в этом примере является упрощенной версией модели коробки передач, описанной в Использовании Simulink для Генерации данных о отказе. Загрузите модель Simulink.
mdl = 'TransmissionCasingSimplified';
open_system(mdl)
В данном примере моделируется только один режим отказа. Отказ зубчатого колеса моделируется как нарушение порядка в Gear Tooth fault
подсистема. Величина нарушения порядка определяется переменной модели ToothFaultGain
, где ToothFaultGain = 0
не соответствует отказу зубчатого колеса (исправная операция).
Чтобы сгенерировать симуляцию ансамбль datastore данных о отказе, вы используете generateSimulationEnsemble
для симуляции модели при различных значениях ToothFaultGain
, в диапазоне от -2 до нуля. Эта функция симулирует модель один раз для каждой записи в массиве Simulink.SimulationInput
объекты, которые вы предоставляете. Каждая симуляция генерирует отдельного представителя ансамбля. Создайте такой массив и используйте setVariable
для назначения значения усиления при отказе зуба для каждого запуска.
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
В данном примере модель уже сконфигурирована, чтобы записать определенные значения сигналов, Vibration
и Tacho
(см. «Экспорт данных сигнала с использованием регистрации сигналов» (Simulink)). The generateSimulationEnsemble
функция дополнительно конфигурирует модель так:
Сохраните записанные данные в файлы в указанной папке
Используйте timetable
формат для логгирования сигналов
Храните каждую Simulink.SimulationInput
объект в сохраненном файле с соответствующими записанными данными
Укажите местоположение сгенерированных данных. В данном примере сохраните данные в папку с именем Data
в текущей папке. Если все симуляции завершаются без ошибок, функция возвращается true
в выходных данных индикатора status
.
mkdir Data location = fullfile(pwd,'Data'); [status,E] = generateSimulationEnsemble(simin,location);
[22-Apr-2021 20:09:35] Running simulations... [22-Apr-2021 20:10:06] Completed 1 of 5 simulation runs [22-Apr-2021 20:10:37] Completed 2 of 5 simulation runs [22-Apr-2021 20:11:03] Completed 3 of 5 simulation runs [22-Apr-2021 20:11:25] Completed 4 of 5 simulation runs [22-Apr-2021 20:11:47] Completed 5 of 5 simulation runs
status
status = logical
1
Внутри Data
папка, исследуйте один из файлов. Каждый файл является MAT-файлом, содержащим следующие переменные MATLAB ® :
SimulationInput
- The Simulink.SimulationInput
объект, который использовался для конфигурирования модели для генерации данных в файле. Вы можете использовать это для извлечения информации о условиях (таких как неисправные или исправные), в которых была запущена эта симуляция.
logsout
- A Dataset
объект, содержащий все данные, для регистрации которых сконфигурирована модель Simulink.
PMSignalLogName
- имя переменной, содержащей записанные в записанные данные ('logsout'
в этом примере). The simulationEnsembleDatastore
команда использует это имя для анализа данных в файле.
SimulationMetadata
- Другая информация о симуляции, которая сгенерировала данные, записанные в файл.
Теперь можно создать datastore ансамбля симуляции с помощью сгенерированных данных. Результат simulationEnsembleDatastore
объект указывает на сгенерированные данные. Объект перечисляет переменные данных в ансамбле, и по умолчанию для чтения выбираются все переменные.
ensemble = simulationEnsembleDatastore(location)
ensemble = simulationEnsembleDatastore with properties: DataVariables: [4x1 string] IndependentVariables: [0x0 string] ConditionVariables: [0x0 string] SelectedVariables: [4x1 string] ReadSize: 1 NumMembers: 5 LastMemberRead: [0x0 string] Files: [5x1 string]
ensemble.DataVariables
ans = 4x1 string
"SimulationInput"
"SimulationMetadata"
"Tacho"
"Vibration"
ensemble.SelectedVariables
ans = 4x1 string
"SimulationInput"
"SimulationMetadata"
"Tacho"
"Vibration"
Предположим, что для анализа, который вы хотите сделать, вам нужно только Vibration
данные и Simulink.SimulationInput
объект, который описывает условия, при которых моделировался каждый представитель. Задайте ensemble.SelectedVariables
чтобы задать переменные, которые вы хотите считать. The read
затем команда извлекает эти переменные из первого представителя ансамбля, как определено программным обеспечением.
ensemble.SelectedVariables = ["Vibration";"SimulationInput"]; data1 = read(ensemble)
data1=1×2 table
Vibration SimulationInput
_________________ ______________________________
{580x1 timetable} {1x1 Simulink.SimulationInput}
data.Vibration
- массив ячеек, содержащий один timetable
строка, сохраняющая времена симуляции и соответствующий сигнал вибрации. Теперь можно обработать эти данные по мере необходимости. Например, извлеките данные о вибрации из таблицы и постройте график.
vibdata1 = data1.Vibration{1};
plot(vibdata1.Time,vibdata1.Data)
title('Vibration - First Ensemble Member')
The LastMemberRead
свойство ансамбля содержит имя файла последнего прочитанного представителя. При следующем звонке read
на этом ансамбле программное обеспечение переходит к следующему представителю ансамбля. (Для получения дополнительной информации смотрите Data Ensembles для мониторинга условия и прогнозирующего обслуживания.) Прочитайте выбранные переменные от следующего представителя ансамбля.
data2 = read(ensemble)
data2=1×2 table
Vibration SimulationInput
_________________ ______________________________
{592x1 timetable} {1x1 Simulink.SimulationInput}
Чтобы подтвердить это data1
и data2
содержат данные от разных представителей ансамбля, исследуют значения переменного параметра модели, ToothFaultGain
. Для каждого ансамбля это значение хранится в Variables
поле SimulationInput
переменная.
SimInput1 = data1.SimulationInput{1}; SimInput1.Variables
ans = Variable with properties: Name: 'ToothFaultGain' Value: -2 Workspace: 'global-workspace' Description: ""
SimInput2 = data2.SimulationInput{1}; SimInput2.Variables
ans = Variable with properties: Name: 'ToothFaultGain' Value: -1.5000 Workspace: 'global-workspace' Description: ""
Этот результат подтверждает, что data1
из ансамбля с ToothFaultGain
= -2, и data2
из ансамбля с ToothFaultGain
=-1.5 <reservedrangesplaceholder0>
Предположим, что вы хотите преобразовать ToothFaultGain
значения для каждого ансамбля представителя в двоичный индикатор наличия или отсутствия отказа зуба. Предположим далее, что вы знаете из своего опыта работы с системой, что значения усиления при отказе зуба менее 0,1 в величину достаточно малы, чтобы считаться здоровыми операциями. Преобразуйте значение усиления для только что считанного представителя ансамбля в индикатор 0 (без отказа) для -0,1 < коэффициент усиления < 0,1 и 1 (отказ) в противном случае.
sT = (abs(SimInput2.Variables.Value) < 0.1);
Чтобы добавить новый индикатор отказа зуба к соответствующим данным ансамбля, сначала разверните список переменных данных в ансамбле.
ensemble.DataVariables = [ensemble.DataVariables;"ToothFault"];
ensemble.DataVariables
ans = 5x1 string
"SimulationInput"
"SimulationMetadata"
"Tacho"
"Vibration"
"ToothFault"
Затем используйте writeToLastMemberRead
чтобы записать значение для новой переменной в последний читаемый представитель ансамбля.
writeToLastMemberRead(ensemble,'ToothFault',sT);
На практике вы хотите добавить индикатор зубного разлома каждому представителю ансамбля. Для этого сбросьте ансамбль в непрочитанное состояние, чтобы начиналось следующее чтение у первого представителя ансамбля. Затем прокрутите все представители ансамбля, вычисляя ToothFault
для каждого представителя и добавления его.
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
Наконец, обозначите новый индикатор отказа зуба как переменное условие в ансамбле. Вы можете использовать это обозначение для отслеживания и обращения к переменным в данных ансамбля, которые представляют условия, при которых были сгенерированы данные представителя.
ensemble.ConditionVariables = "ToothFault";
ensemble.ConditionVariables
ans = "ToothFault"
Теперь каждый представитель ансамбля содержит исходные необработанные данные и дополнительную переменную, указывающую на условие отказа, при котором данные были собраны. На практике можно вычислить и добавить другие значения, полученные из необработанных данных о вибрации, чтобы идентифицировать потенциальные индикаторы состояния, которые можно использовать для обнаружения и диагностики отказов. Для более подробного примера, который показывает больше способов манипулировать и анализировать данные, хранящиеся в simulationEnsembleDatastore
объект, см. Использование Simulink для генерации данных о отказе.
Если он эффективен или полезен для обработки, которую вы хотите выполнить, можно сконфигурировать ансамбль так, чтобы он считывал данные сразу от нескольких представителей. Для этого используйте ReadSize
свойство. The read
команда использует это свойство, чтобы определить, сколько представители ансамбля читать за один раз. Например, сконфигурируйте ансамбль, чтобы он читал по два представителей за раз.
ensemble.ReadSize = 2;
Изменение значения ReadSize
также сбрасывает ансамбль в непрочитанное состояние. Таким образом, следующая операция чтения читает первых двух представителей ансамбля. read
возвращает таблицу с количеством строк, равным ReadSize
.
ensemble.SelectedVariables = ["Vibration";"ToothFault"]; data3 = read(ensemble)
data3=2×2 table
Vibration ToothFault
_________________ __________
{580x1 timetable} false
{592x1 timetable} false
The LastMemberRead
свойство ансамбля содержит имена файлов всех представителей ансамбля, которые были прочитаны в этой операции.
ensemble.LastMemberRead
ans = 2x1 string
"/tmp/BR2021ad_1657350_6935/mlx_to_docbook2/tpf6f5fb9e/predmaint-ex54897023/Data/TransmissionCasingSimplified_log_1.mat"
"/tmp/BR2021ad_1657350_6935/mlx_to_docbook2/tpf6f5fb9e/predmaint-ex54897023/Data/TransmissionCasingSimplified_log_2.mat"
Когда вы добавляете данные к ансамблевому datastore, который имеет ReadSize
> 1, вы должны написать к тому же количеству представителей ансамбля как вы читаете. Таким образом, например, когда ReadSize
= 2, поставьте таблицу с двумя строками в writeToLastMemberRead
.
generateSimulationEnsemble
| read
| simulationEnsembleDatastore
| writeToLastMemberRead