Этот пример показывает, как сгенерировать ансамбль данных для проекта алгоритма прогнозирующего обслуживания путем симуляции модели 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-Feb-2019 01:45:24] Running simulations... [22-Feb-2019 01:45:34] Completed 1 of 5 simulation runs [22-Feb-2019 01:45:40] Completed 2 of 5 simulation runs [22-Feb-2019 01:45:46] Completed 3 of 5 simulation runs [22-Feb-2019 01:45:53] Completed 4 of 5 simulation runs [22-Feb-2019 01:46:00] Completed 5 of 5 simulation runs
status
status = logical
1
В папке Data
исследуйте один из файлов. Каждым файлом является MAT-файл, содержащий следующие переменные MATLAB®:
Объект SimulationInput
— The Simulink.SimulationInput
, который использовался, чтобы сконфигурировать модель для генерации данных в файле. Можно использовать это, чтобы извлечь информацию об условиях (такой как дефектный или здоровый), под которым была запущена эта симуляция.
Объект logsout
— A 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 array
"SimulationInput"
"SimulationMetadata"
"Tacho"
"Vibration"
ensemble.SelectedVariables
ans = 4x1 string array
"SimulationInput"
"SimulationMetadata"
"Tacho"
"Vibration"
Предположим, что для анализа вы хотите сделать, вам нужны только данные Vibration
и объект Simulink.SimulationInput
, который описывает условия, при которых моделировался каждый участник. Установите ensemble.SelectedVariables
задавать переменные, которые вы хотите считать. Команда read
затем извлекает те переменные от первого члена ансамбля, как определено программным обеспечением.
ensemble.SelectedVariables = ["Vibration";"SimulationInput"]; data1 = read(ensemble)
data1=1×2 table
Vibration SimulationInput
___________________ ______________________________
[20202x1 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
___________________ ______________________________
[20215x1 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'
SimInput2 = data2.SimulationInput{1}; SimInput2.Variables
ans = Variable with properties: Name: 'ToothFaultGain' Value: -1.5000 Workspace: 'global-workspace'
Этот результат подтверждает, что 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 array
"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
___________________ __________
[20202x1 timetable] false
[20215x1 timetable] false
Свойство LastMemberRead
ансамбля содержит имена файлов всех членов ансамбля, которые были считаны в этой операции.
ensemble.LastMemberRead
ans = 2x1 string array
"/tmp/BR2019ad_1062519_57051/mlx_to_docbook3/tp6e80af6f/predmaint-ex54897023/Data/TransmissionCasingSimplified_log_1.mat"
"/tmp/BR2019ad_1062519_57051/mlx_to_docbook3/tp6e80af6f/predmaint-ex54897023/Data/TransmissionCasingSimplified_log_2.mat"
Когда вы добавляете данные к datastore ансамбля, который имеет ReadSize
> 1, необходимо записать в то же количество членов ансамбля, как вы читаете. Таким образом, например, когда ReadSize
= 2, предоставляют таблицу 2D строки к writeToLastMemberRead
.
generateSimulationEnsemble
| read
| simulationEnsembleDatastore
| writeToLastMemberRead