Автономный 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