exponenta event banner

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

В этом примере показано, как создать ансамбль данных для проектирования алгоритма прогнозирующего обслуживания путем моделирования модели машины Simulink ® с изменением параметра отказа. Далее в примере показаны некоторые способы взаимодействия с хранилищем данных ансамбля моделирования. В примере показано, как считывать данные из хранилища данных в рабочую область MATLAB ®, обрабатывать данные для вычисления производных переменных и записывать новые переменные обратно в хранилище данных.

Модель в этом примере является упрощенной версией модели коробки передач, описанной в разделе Использование Simulink для генерации данных о неисправности. Загрузите модель Simulink.

mdl = 'TransmissionCasingSimplified';
open_system(mdl)

В этом примере моделируется только один режим отказа. Неисправность зубьев зубьев моделируется как нарушение в Gear Tooth fault подсистема. Величина возмущения контролируется переменной модели ToothFaultGain, где ToothFaultGain = 0 соответствует отсутствию отказа зубьев шестерни (исправная работа).

Создание ансамбля моделируемых данных

Для создания хранилища данных имитационного ансамбля данных об отказах используется 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 - A Dataset объект, содержащий все данные, которые модель Simulink сконфигурирована для регистрации.

  • PMSignalLogName - имя переменной, содержащей записанные данные ('logsout' в этом примере). simulationEnsembleDatastore использует это имя для синтаксического анализа данных в файле.

  • SimulationMetadata - другая информация о моделировании, которое сгенерировало данные, зарегистрированные в файле.

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

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

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"

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

См. также

| | |

Связанные темы