Создайте графики при помощи API Stateflow

Создайте новую модель и график

  1. Закройте все модели.

  2. Введите функциональный sfnew, чтобы создать новую, неназванную модель с новым графиком Stateflow® в нем.

MATLAB® является языком действия по умолчанию графика, который вы создаете с sfnew. Чтобы открыть новый график C или изменить язык действия по умолчанию, смотрите, Изменяют Язык Действия для Графика.

У вас есть только одна модель Simulink® в памяти. Не открывайте график. Можно теперь получить доступ к Объекту модели API, который представляет саму модель.

Доступ к объекту модели

В API Stateflow каждая модель вы создаете или загружаете в память, представлен объектом Модели типа. Прежде, чем получить доступ к диаграмме Stateflow вы создали в предыдущем разделе, необходимо сначала соединиться с его Объектом модели. Однако в API Stateflow, все Объекты модели содержатся в Корневом объекте API Stateflow, таким образом, необходимо использовать Корневой объект, возвращенный функциональным sfroot, чтобы получить доступ к Объекту модели:

  1. Используйте эту команду, чтобы получить указатель на Корневой объект:

    rt = sfroot;
  2. Используйте указатель на Корневой объект, rt, чтобы найти Объект модели, представляющий вашу новую неназванную модель Simulink и присвоить его указатель m в этой команде:

    m = rt.find('-isa','Simulink.BlockDiagram');
    

Если вместо одной модели существует несколько открытых моделей, эта команда возвращает массив различных Объектов модели, к которым можно получить доступ посредством индексации (m(1), m(2), и т.д.) Можно идентифицировать определенный Объект модели с помощью свойств каждой модели, особенно свойство Name, которое является именем модели. Например, можно использовать свойство Name найти Объект модели названным myModel с этой командой:

m = rt.find('-isa', 'Simulink.BlockDiagram', '-and', ...
'Name', 'myModel');

Однако, поскольку у вас теперь есть только одна загруженная модель, указатель на объект, m в команде для шага 2 возвращает Объект модели для модели, которую вы только создали. Вы теперь готовы использовать m, чтобы получить доступ к пустому графику так, чтобы можно было начать заполнять его с объектами Stateflow.

Доступ к объекту диаграммы

В доступе к Объекту модели вы получили доступ к Объекту модели, содержащему ваш новый график, чтобы возвратить указатель на Объект модели для вашей новой модели, m. Выполните эти шаги, чтобы получить доступ к новому графику:

  1. Доступ к новому Объекту диаграммы и присвоению это к переменной ch рабочей области можно следующим образом:

    ch = m.find('-isa','Stateflow.Chart');
    

    В предыдущей команде методе find Объекта модели m возвращает массив всех графиков, принадлежащих той модели. Поскольку вы создали только один график, результатом этой команды является график, который вы создали. Если вы создали несколько графиков, метод find возвращает массив графиков, к которым вы могли получить доступ посредством индексации (например, ch(1), ch(2), и так далее).

    Можно также использовать обозначение стандартной функции вместо записи через точку для предыдущей команды. В этом случае первый аргумент является указателем Объекта модели, m.

    ch = find(m, '-isa','Stateflow.Chart');
    
  2. Откройте диаграмму Stateflow с этой командой API:

    ch.view;
    

    Предыдущая команда вызывает метод view Объекта диаграммы, указателем которого является ch. Заданный график появляется. Другие объекты API Stateflow имеют методы view также.

Создайте новые объекты в графике

В предыдущем разделе вы создали указатель на новый Объект диаграммы, ch. Продолжите путем создания новых объектов для графика с помощью этих шагов:

  1. Создайте новое состояние в Объекте диаграммы ch с этой командой:

    sA = Stateflow.State(ch);
    

    Эта команда является конструктором API Stateflow для нового состояния, в котором Stateflow.State является типом объекта для состояния, ch является переменной рабочей области, содержащей указатель на вышестоящую диаграмму нового состояния, и sA является переменной рабочей области, чтобы получить возвращенный указатель на новое состояние.

    Пустое состояние теперь появляется в верхнем левом угле графика.

  2. Используйте команду ch.view, чтобы принести график к переднему плану для просмотра.

  3. Присвойте имя и положение к новому состоянию путем присвоения значений свойствам нового объекта State можно следующим образом:

    sA.Name = 'A';
    sA.Position = [50 50 310 200];
    
  4. Создайте новые состояния, A1 и A2 в утверждают A и присваивают их свойства с этими командами:

    sA1 = Stateflow.State(ch);
    sA1.Name = 'A1';
    sA1.Position = [80 120 90 60];
    sA2 = Stateflow.State(ch);
    sA2.Name = 'A2';
    sA2.Position = [240 120 90 60];
    

    Эти команды создают и используют переменные sA рабочей области, sA1 и sA2 как указатели на новые состояния, которые теперь появляются можно следующим образом.

  5. Создайте переход от 3-часового положения (правая сторона) A1 состояния к 9-часовой позиции (левая сторона) A2 состояния с этими командами:

    tA1A2 = Stateflow.Transition(ch);
    tA1A2.Source = sA1;
    tA1A2.Destination = sA2;
    tA1A2.SourceOClock = 3;
    tA1A2.DestinationOClock = 9;
    

    Переход теперь появляется как показано.

  6. Добавьте метку E1 в переход от A1 состояния, чтобы утвердить A2 с этой командой:

    tA1A2.LabelPosition = [180 140 0 0];
    tA1A2.LabelString = 'E1';
    

    График теперь выглядит так:

    Состояние и метки перехода в этом графике являются простыми короткими метками. Чтобы ввести более комплексные многострочные метки, смотрите, Вводят Многострочные Метки в состояния и Переходы. Метки для переходов также имеют свойство LabelPosition, которое можно использовать, чтобы переместить метки в лучшие местоположения.

  7. Используйте эти команды, чтобы переместить метку для перехода от A1 до A2 направо на 5 пикселей:

    pos = tA1A2.LabelPosition;
    pos(1) = pos(1)+5;
    tA1A2.LabelPosition = pos;
    
  8. Закончите свой новый график путем добавления переходов по умолчанию к состояниям A и A1 с исходными точками на 20 пикселей выше и 10 пикселей слева от главной средней точки каждого состояния:

    % Add a default transition to state A
    dtA = Stateflow.Transition(ch);
    dtA.Destination = sA;
    dtA.DestinationOClock = 0;
    xsource = sA.Position(1)+sA.Position(3)/2;
    ysource = sA.Position(2)-30;
    dtA.SourceEndPoint = [xsource ysource];
    dtA.MidPoint = [xsource ysource+15];
    
    % Add a default transition to state A1
    dtA1 = Stateflow.Transition(ch);
    dtA1.Destination = sA1;
    dtA1.DestinationOClock = 0;
    xsource = sA1.Position(1)+sA1.Position(3)/2;
    ysource = sA1.Position(2)-30;
    dtA1.SourceEndPoint = [xsource ysource];
    dtA1.MidPoint = [xsource ysource+15];
    

    Ваш полный график выглядит так:

  9. Сохраните модель с новым графиком к текущей папке как myModel:

    sfsave(m.Name, 'myModel');

    Эта команда использует свойство Name Объекта модели m для сохранения модели под новым именем.

Смотрите также

| | | | |

Похожие темы