Сгенерируйте и используйте смоделированный ансамбль данных

В этом примере показано, как сгенерировать ансамбль данных для проекта алгоритма прогнозирующего обслуживания путем симуляции модели 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);
[18-Aug-2020 02:50:40] Running simulations...
[18-Aug-2020 02:50:58] Completed 1 of 5 simulation runs
[18-Aug-2020 02:51:07] Completed 2 of 5 simulation runs
[18-Aug-2020 02:51:16] Completed 3 of 5 simulation runs
[18-Aug-2020 02:51:25] Completed 4 of 5 simulation runs
[18-Aug-2020 02:51:33] Completed 5 of 5 simulation runs
status
status = logical
   1

В Data папка, исследуйте один из файлов. Каждым файлом является MAT-файл, содержащий следующие переменные MATLAB®:

  • SimulationInputSimulink.SimulationInput объект, который использовался, чтобы сконфигурировать модель для генерации данных в файле. Можно использовать это, чтобы извлечь информацию об условиях (такой как дефектный или здоровый), под которым была запущена эта симуляция.

  • logsoutDataset объект, содержащий все данные, которые модель 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        
    _________________    ______________________________

    {581x1 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        
    _________________    ______________________________

    {594x1 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
    _________________    __________

    {581x1 timetable}      false   
    {594x1 timetable}      false   

LastMemberRead свойство ансамбля содержит имена файлов всех членов ансамбля, которые были считаны в этой операции.

ensemble.LastMemberRead
ans = 2x1 string
    "/tmp/BR2020bd_1459859_105924/mlx_to_docbook2/tp1a108234/predmaint-ex54897023/Data/TransmissionCasingSimplified_log_1.mat"
    "/tmp/BR2020bd_1459859_105924/mlx_to_docbook2/tp1a108234/predmaint-ex54897023/Data/TransmissionCasingSimplified_log_2.mat"

Когда вы добавляете данные к datastore ансамбля, который имеет ReadSize > 1, необходимо записать в то же количество членов ансамбля, как вы читаете. Таким образом, например, когда ReadSize = 2, предоставьте таблицу 2D строки к writeToLastMemberRead.

Смотрите также

| | |

Похожие темы