exponenta event banner

Ведение журнала состояний в структурном формате

Регистрация состояний с помощью Structure формат может предоставить преимущества по сравнению с Array формат. При регистрации состояний с помощью Array формат, порядок состояний по столбцам в записанном массиве зависит от порядка сортировки блоков. На порядок сортировки блоков могут влиять различные факторы, которые могут изменять порядок состояний от одного моделирования к следующему. При использовании Structure имена блоков сохраняются вместе с записанными данными о состоянии для этого блока, что позволяет обрабатывать данные без учета порядка сортировки блоков.

Ведение журнала состояний в формате массива

При регистрации состояний с помощью Array формат, записанные данные хранятся в массиве с N столбцы, где N - количество состояний, и M строки, по одной на каждый временной шаг моделирования. Этой формой матрицы M-by-N легко манипулировать в MATLAB ®. Однако порядок переменных состояния по столбцам протоколированной матрицы зависит от порядка сортировки блоков. Поэтому любой код MATLAB, который ожидает фиксированного отображения между состояниями блоков в модели и столбцами матрицы состояний, склонен к разрыву при изменении порядка сортировки блоков из-за изменений в модели.

Например, рассмотрим модели sldemo_state_logging1 и sldemo_state_logging2.

mdl1 = 'sldemo_state_logging1';
mdl2 = 'sldemo_state_logging2';
open_system(mdl1);
open_system(mdl2);

Две модели содержат одинаковые блоки, соединенные одинаковым образом. Единственным отличием является порядок выходных портов. Моделирование моделей и регистрация состояний с помощью Array формат.

simOut1 = sim(mdl1, 'SaveFormat','Array');
simOut2 = sim(mdl2, 'SaveFormat','Array');

Извлеките векторы состояний из Simulink.SimulationOutput , который содержит все данные, зарегистрированные в моделировании.

x1 = simOut1.get('xout');
x2 = simOut2.get('xout');

Данные зарегистрированных состояний для x1 и x2 отличаются, потому что блоки упорядочены по-разному, поэтому сопоставление между столбцами в записанном массиве и блоками в модели отличается.

isequal(x1, x2)
ans =

  logical

   0

Состояния журнала с использованием структурного формата

Снова смоделируйте модели, но на этот раз запишите состояния в формате структуры.

simOut1=sim(mdl1,'SaveFormat','Structure');
simOut2=sim(mdl2,'SaveFormat','Structure');

Извлеките структуры, содержащие зарегистрированные состояния, из SimulationOutput объект.

x1s = simOut1.get('xout');
x2s = simOut2.get('xout');

Просмотрите эти структуры, содержащие два поля: time и signals. time пустое поле, поскольку данные были зарегистрированы с помощью Structure формат, а не StructureWithTime формат. Вы можете использовать StructureWithTime форматировать, когда необходимо сохранить временные данные вместе с данными состояний.

disp(x1s);
disp(x2s);
       time: []
    signals: [1x2 struct]

       time: []
    signals: [1x2 struct]

Структура signals поле представляет собой массив структур с одной структурой для каждого блока в модели, имеющего данные о состоянии. Каждая структура блочных данных в пределах signals поле содержит values поле с данными состояний и blockName с именем блока, который создал данные о состоянии. Можно извлечь данные о состояниях в матрицу, которую можно обработать аналогично тому, как бы вы зарегистрировали состояния с помощью Array формат.

Чтобы устранить проблему заказа состояния, сначала используйте имена блоков для сортировки данных состояний в фиксированный порядок. Например, можно отсортировать данные состояний так, чтобы блоки находились в алфавитном порядке, который будет оставаться неизменным от одного моделирования к другому, независимо от порядка сортировки блоков.

[~, idx1] = sort({x1s.signals.blockName});
x1 = [x1s.signals(idx1).values];

[~, idx2] = sort({x2s.signals.blockName});
x2 = [x2s.signals(idx2).values];

isequal(x1, x2)
ans =

  logical

   1

После изменения порядка полей сигналов в алфавитном порядке по имени блока, если данные полей значений извлекаются в том же порядке, можно обработать данные аналогично тому, как это было бы при использовании Array формат, но порядок данных состояний блока не изменяется от одного моделирования к следующему.