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