Автономный график 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