Автономная диаграмма Stateflow ® - это класс MATLAB ®, определяющий поведение конечного конечного автомата. Автономные диаграммы реализуют классическую семантику диаграмм с MATLAB в качестве языка действий. Можно запрограммировать диаграмму с помощью всех функциональных возможностей MATLAB, включая функции, ограниченные для генерации кода в Simulink ®. Дополнительные сведения см. в разделе Создание диаграмм потока состояний для выполнения в виде объектов 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 является пустым массивом в новом объекте диаграммы. 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 в диаграммах потока состояний.
Execute и Finish состояния доступа к локальным данным для автономной диаграммы путем вызова get функция.

При моделировании этой диаграммы с вводом x = 27, блок «Дисплей» 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, блок «Дисплей» 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