Этот пример показывает, как изменить размер выходных данных в графике 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. Анимация графика показывает активное состояние, чередующееся между состояниями Vector
и Scalar
.
Измените вкладки, чтобы возвратиться к модели Simulink. Блоки отображения периодически показывают 1, 8, и 16 значений от векторов переменного размера.