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

Этот пример показывает, как сгенерировать ансамбль данных для проекта алгоритма прогнозирующего обслуживания путем симуляции модели 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"

Чтение данных от представителей Ensemble

Предположим, что для анализа, который вы хотите сделать, вам нужно только 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')

Figure contains an axes. The axes with title Vibration - First Ensemble Member contains an object of type line.

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>

Добавление данных к представителю Ensemble

Предположим, что вы хотите преобразовать 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.

См. также

| | |

Похожие темы