В этом примере показано, как сгенерировать ансамбль данных для проекта алгоритма прогнозирующего обслуживания путем симуляции модели 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)). 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
— Simulink.SimulationInput
объект, который использовался, чтобы сконфигурировать модель для генерации данных в файле. Можно использовать это, чтобы извлечь информацию об условиях (такой как дефектный или здоровый), под которым была запущена эта симуляция.
logsout
— Dataset
объект, содержащий все данные, которые модель Simulink сконфигурирована, чтобы регистрировать.
PMSignalLogName
— Имя переменной, которая содержит записанные данные ('logsout'
в этом примере). 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
чтобы задать переменные, вы хотите читать. 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')
LastMemberRead
свойство ансамбля содержит имя файла последний раз член чтения. В следующий раз вы вызываете read
на этом ансамбле программное обеспечение переходит к следующему члену ансамбля. (См. Ансамбли Данных для Мониторинга состояния и Прогнозирующего Обслуживания для получения дополнительной информации.) Чтение выбранные переменные от следующего члена ансамбля.
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.
Предположим, что вы хотите преобразовать 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
свойство. 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
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, предоставьте таблицу 2D строки к writeToLastMemberRead
.
generateSimulationEnsemble
| read
| simulationEnsembleDatastore
| writeToLastMemberRead