Автономный Stateflow® график является MATLAB® класс, который задает поведение конечного конечного автомата. Автономные диаграммы реализуют классическую семантику графика с MATLAB в качестве языка действий. Можно запрограммировать график, используя полную функциональность MATLAB, включая те функции, которые ограничены для генерации кода в Simulink®. Для получения дополнительной информации смотрите Создание диаграмм Stateflow для выполнения в качестве объектов MATLAB.
В этом примере показано, как выполнить автономную диаграмму Stateflow с помощью скрипта MATLAB или модели Simulink.
Файл sf_change.sfx
задает автономную диаграмму Stateflow, которая подсчитывает количество способов внести изменения для заданной суммы денег. График содержит следующие объекты данных:
x
- сумма денег, которые нужно изменить. Значение по умолчанию является 100.
coinValues
- вектор номиналов монет, расположенных в порядке возрастания. coinNames
является массивом соответствующих имен монет. Значения по умолчанию представляют стандартные американские монеты (пенни, никели, даймы и кварталы).
tally
- количество допустимых строений изменений.
tabula
- массив, содержащий различные допустимые строения изменений.
chg
, done
, i
, и n
являются локальными данными, используемыми алгоритмом подсчета изменений.
textWidth
и quietMode
являются локальными данными, которые управляют отображением результатов на графике.
График начинается с потенциального строения изменения, состоящей полностью из монет с самой низкой стоимостью, заданной индексом 1. На каждом шаге выполнения состояние exchange
изменяет это строение одним из двух способов:
Область подсостояния move_up
обменивает некоторые монеты с самой низкой стоимостью на монету с более высоким значением, заданным индексом i
.
Область подсостояния move_down
обменивает все монеты со значением, заданным индексом i
для монет с самой низкой стоимостью. Затем move_up
обменивает некоторые монеты с самой низкой стоимостью на монету со значением, заданным индексом i+1
или выше.
Потенциальное строение изменения действительно, когда количество центов, представленных монетами с самой низкой стоимостью, делится на значение этого типа монеты. Когда график встречается с новым допустимым строением, он увеличивается tally
и добавляет новое строение к tabula
.
Когда больше нет возможности обменов монетами, состояние stop
становится активным. Это состояние печатает результаты расчетов, преобразует содержимое tabula
в таблицу и устанавливает значение done
на true
.
Чтобы запустить алгоритм подсчета изменений до своего завершения, необходимо выполнить автономную диаграмму несколько раз. Например, скрипт MATLAB sf_change_script.m
создает объект графика chartObj
и инициализирует значение локальных данных x
по 27. Опция строения '-warningOnUninitializedData'
, на который устанавливается скрипт false
, устраняет предупреждение, что tabula
- пустой массив в новом объекте графика. The while
цикл выполняет график до тех пор, пока локальные данные не done
становится true
. Наконец, скрипт отображает значение tabula
.
chartObj = sf_change('x',27,'-warningOnUninitializedData',false); while ~chartObj.done step(chartObj); end disp(chartObj.tabula)
sf_change_script
............. There are 13 ways to make change for 27 cents. Pennies Nickels Dimes Quarters _______ _______ _____ ________ 27 0 0 0 22 1 0 0 17 2 0 0 12 3 0 0 7 4 0 0 2 5 0 0 17 0 1 0 12 1 1 0 7 2 1 0 2 3 1 0 7 0 2 0 2 1 2 0 2 0 0 1
Чтобы определить количество способов внести изменение на другую сумму или использовать другую систему валют, измените значения x
и coinValues
. Для примера, чтобы использовать британскую валюту, инициализируйте coinValues
на [1 2 5 10 20 25 50]
.
Можно выполнить автономную диаграмму Stateflow из модели Simulink. Для примера, модель sf_change_model
содержит две диаграммы Stateflow, которые используют автономную диаграмму sf_change
подсчитать количество способов внести изменения для 27 центов в двух разных валютных системах. Можно симулировать модель, но функции, которые выполняют автономную диаграмму, не поддерживают генерацию кода.
Каждый график содержит следующие состояния:
Initialize
создает локальный график объекта chartObj
который реализует алгоритм подсчета изменений для входа значения x
.
Execute
вызывает step
функция для выполнения автономной диаграммы и хранения результата в виде выхода данных tally
.
Finish
отображает результаты алгоритма в окне Diagnostic Viewer и устанавливает значение выходных данных done
на true
.
Когда оба графиков достигают своих соответствующих Finish
состояние, симуляция остановок модели и блоков Display показывают окончательные значения двух талий.
Выполнение с использованием MATLAB в качестве языка действий
График MATLAB syntax
использует MATLAB в качестве языка действий. Чтобы выполнить автономную диаграмму Stateflow, этот график должна следовать следующим рекомендациям:
Локальная переменная chartObj
который содержит указатель на график, объект имеет тип Inherit: From definition in chart
.
Перед созданием объекта графика Initialize
состояние вызывает coder.extrinsic
функция для объявления sf_change
как внешняя функция, которая ограничена для генерации кода в Simulink. Смотрите Call Extrinsic Функций MATLAB в Stateflow Charts.
The Execute
и Finish
состояния получают доступ к локальным данным для автономной диаграммы путем вызова get
функция.
Когда вы симулируете этот график с входом x
= 27, блок Display Olde English
показывает значение 4. В окне Diagnostic Viewer показаны следующие результаты:
Pennies Shillings Florins _______ _________ _______ 27 0 0 15 1 0 3 2 0 3 0 1
Выполнение с использованием C в качестве языка действий
График C syntax
использует C в качестве языка действий. Чтобы выполнить автономную диаграмму Stateflow, этот график должна следовать следующим рекомендациям:
Локальная переменная chartObj
который содержит указатель на график, объект имеет тип ml
.
The Initialize
состояние вызывает ml
функция для создания объекта графика.
The Execute
и Finish
состояния используют ml
оператор пространства имен для доступа к step
, get
, и displ
функции для выполнения автономной диаграммы, доступа к ее локальным данным и отображения результатов алгоритма.
Для получения дополнительной информации смотрите Доступ к функциям MATLAB и Данные рабочей области в графиках С.
Когда вы симулируете этот график с входом x
= 27, блок Display Modern American
показывает отметку 13. В окне Diagnostic Viewer показаны следующие результаты:
Safety FieldGoal TouchDown ______ _________ _________ 12 1 0 9 3 0 6 5 0 3 7 0 0 9 0 10 0 1 7 2 1 4 4 1 1 6 1 5 1 2 2 3 2 3 0 3 0 2 3