Выполните объекты диаграммы Stateflow через скрипты и модели

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

Чтобы запустить алгоритм подсчета изменений до своего завершения, необходимо выполнить автономную диаграмму несколько раз. Например, скрипт 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)
При запуске этого скрипта автономная диаграмма вычисляет количество способов внести изменения за 27 центов при помощи стандартных американских монет:
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].

Выполните автономную диаграмму в модели Simulink

Можно выполнить автономную диаграмму 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

Похожие темы