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