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

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

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

| | |

Похожие темы