Автономный график 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.
Чтобы запустить считающий изменение алгоритм к завершению, необходимо выполнить автономный график многократно. Например, sf_change_script.m скрипта MATLAB создает объект диаграммы chartObj и инициализирует значение локальных данных x к 27. Параметр конфигурации '-warningOnUninitializedData', который скрипт устанавливает на false, устраняет предупреждение, что tabula является пустым массивом в новом объекте диаграммы. Цикл 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, симуляция образцовых остановок и блоков Отображения показывает окончательные значения двух счетов.
Выполнение Используя MATLAB как язык действия
График MATLAB syntax использует MATLAB в качестве языка действия. Чтобы выполнить автономную диаграмму Stateflow, этот график должен следовать этим инструкциям:
Локальная переменная, которую имеет chartObj, который содержит указатель на объект диаграммы, вводит Inherit: From definition in chart.
Прежде, чем создать объект диаграммы, состояние Initialize вызывает функцию coder.extrinsic, чтобы объявить sf_change как внешнюю функцию, которая ограничивается для генерации кода в Simulink. Смотрите Вызов Внешние функции MATLAB в диаграммах Stateflow.
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.
Состояние Initialize вызывает функцию ml, чтобы создать объект диаграммы.
Execute и состояния Finish используют оператор пространства имен ml, чтобы получить доступ к step, get, и функциям displ, чтобы выполнить автономный график, получить доступ к его локальным данным и отобразить результаты алгоритма.
Для получения дополнительной информации смотрите доступ к функциям MATLAB и Данным о Рабочей области в Графиках C.

Когда вы моделируете этот график с входом 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