Логгирование состояний в формате структуры

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

Логгирование состояний в формате массивов

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