Выполните объекты диаграммы 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

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

Выполнение Используя 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

Похожие темы