В этом примере показано, как изменить размер выходных данных в графике Stateflow® в течение времени выполнения. Диаграммы Stateflow обмениваются данными переменного размера с другими графиками и блоками в модели через функции MATLAB®, функции Simulink® и таблицы истинности MATLAB. Этот пример иллюстрирует этот процесс при помощи функций MATLAB в двух диаграммах Stateflow.
В этой модели одна диаграмма Stateflow, VarSizeSignalSource, использует временную логику, чтобы сгенерировать сигнал переменного размера. Второй график, SizeBasedProcessing, вычисляет выход на основе размера сигнала, сгенерированного первым графиком.
График VarSizeSignalSource использует временную логику для перехода между тремя состояниями. Каждое состояние генерирует различный размер выход.
График работает как исходный блок. Это не имеет никакого входа и одного переменного размера выход y
.
Для переменного размера выходные параметры необходимо явным образом задать размер и верхнюю границу для каждой размерности. В этом случае, y
вектор, длина которого имеет верхнюю границу 16.
Поскольку состояния или переходы не могут читать из или записать в данные переменного размера, y
не появляется ни в каких состояниях активности или логике перехода. Все расчеты включающие данные переменного размера должны произойти в функциях MATLAB в графике.
Функция MATLAB: generateOutput
Размер переменной доступа функций MATLAB, данные уровня графика непосредственно. Вы не передаете данные как вводы или выводы к функциям. В этом графике, generateOutput
функционируйте создает выходной вектор переменного размера y
как последовательность номера на основе входа это получает.
function generateOutput(len) %#codegen assert(len<=16); y = (1:len)';
Функции MATLAB должны смочь определить верхние границы данных переменного размера во время компиляции. В этом случае, однако, верхней границей является len
, вход, для которого модель вычисляет значение во время выполнения. Предоставить эту информацию, assert
функция задает явную верхнюю границу для len
это совпадает с верхней границей, заданной для графика выход y
.
График SizeBasedProcessing использует три функции MATLAB, чтобы вычислить переменный размер выход y
на основе значения входа u
переменного размера.
Введите u
сигнал переменного размера, сгенерированный графиком VarSizeSignalSource.
Выведите y
сигнал переменного размера, размер которого зависит от ли u
скаляр или вектор.
Как в графике VarSizeSignalSource, данные переменного размера не появляются в логике перехода или состояниях активности. Вместо этого состояния вызывают функции MATLAB, чтобы вычислить переменный размер выход. Переходы вызывают функцию MATLAB в условном операторе, чтобы оценить вход переменного размера.
Функция MATLAB: isScalarInput
Эта функция тестирует ли вход u
графика, сигнал, сгенерированный графиком VarSizeSignalSource, является скалярным или векторным значением:
function isScalar = isScalarInput %#codegen isScalar = length(u)==1;
Функция MATLAB: computeOutput
Если вход u
вектор, этот функциональные выходные параметры синус каждого из его значений:
function computeOutput %#codegen y = sin(u);
Функция MATLAB: resetOutput
Если вход u
скаляр, этот функциональные выходные параметры значение нуля:
function resetOutput %#codegen y = 0;
Откройте модель. Вкладки вдоль верхней части холста Редактора позволяют вам переключиться между моделью Simulink и этими двумя диаграммами Stateflow.
Запустите симуляцию с графика VarSizeSignalSource. Анимация графика показывает активное состояние, циклически повторяющееся между Scalar
, VectorPartial
, и VectorFull
состояния.
Измените вкладки, чтобы просмотреть график SizeBasedProcessing. Анимация графика показывает активное состояние, чередующееся между Scalar
и Vector
состояния.
Измените вкладки, чтобы возвратиться к модели Simulink. Блоки отображения периодически показывают 1, 8, и 16 значений от векторов переменного размера.