Доступ к существующим объектам Stateflow

Об указателях на объект Stateflow

Создание объектов Stateflow® через API Stateflow дает вам мгновенный указатель на недавно созданные объекты (см., Создают Объекты Stateflow). Можно также соединиться с объектами Stateflow, которые уже существуют, для которого у вас нет текущего указателя API.

Найдите объекты и свойства

Существует несколько методов объекта, которые вы используете, чтобы пересечь иерархию Stateflow, чтобы определить местоположение существующих объектов. Например, можно использовать метод find.

С методом find вы задаете, что искать путем определения комбинаций этих типов информации:

  • Тип объекта найти

  • Имя свойства объекта найти и его значение

Этот пример перерывает Объект модели m, чтобы возвратить каждый объект State с именем 'On'.

onState = m.find('-isa','Stateflow.State','-and','Name','On');

Если команда find находит больше чем один объект, который соответствует его спецификациям, это возвращает массив квалификации объектов. Этот пример возвращает массив всех графиков в вашей модели:

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

Используйте индексацию массива, чтобы получить доступ к отдельным свойствам и методам для графика. Например, если предыдущая команда возвращает три графика, эта команда возвращает свойство Name второго найденного графика:

name2 = chartArray(2).Name;

Совет

Чтобы получить доступ к свойству объекта Stateflow в соединенном графике библиотеки, выполнить одно из следующих действий:

  • Откройте модель библиотеки явным образом.

  • Просмотрите соединенную подсистему или блок в основной модели.

  • Скомпилируйте или моделируйте модель.

Выполнение одного из тех шагов загружает модель библиотеки в рабочую область Simulink®. Только открытие основной модели, которая относится к соединенной диаграмме Stateflow, не гарантирует, что API Stateflow может найти соединенный график.

По умолчанию команда find находит объекты на всех глубинах включения в объекте. Это включает нулевой уровень включения, которое является самим искавшим объектом. Например, предположите, что A состояния, который соответствует объекту State sA, содержит два состояния, A1 и A2. Используйте команду find, которая находит все состояния в A:

states= sA.find('-isa','Stateflow.State');

Предыдущая команда находит три состояния: A, A1 и A2.

Примечание

Будьте осторожны при определении объектов, которые вы хотите найти с методом find для Корневого объекта или Объекта модели. Используя метод find для этих объектов может возвратить объекты Simulink, совпадающие с аргументами, которые вы задаете. Например, если rt является указателем на Корневой объект, команда find('Name', 'ABC') может возвратить Подсистему Simulink или блокироваться, назвал ABC. Смотрите ссылку для метода find для полного описания метода и его параметров.

Найдите объекты на разных уровнях включения

Если вы находите конкретный объект в диаграмме Stateflow ее именем или другим свойством, вы можете хотеть найти объекты, которые оно содержит (дочерние элементы) или объект, который содержит его (родительский элемент). Чтобы найти дочерние объекты, используйте метод find. Чтобы найти родительский объект, используйте метод up.

Найдите дочерние объекты

Метод find находит объекты на глубине включения в объекте, который вы задаете. Если вы хотите ограничить глубину поиска включения с командой find, используйте переключатель depth. Например, чтобы найти все объекты в объекте State sA на первом уровне включения, используйте эту команду:

objArray = sA.find('-depth', 1);

Не забывайте, однако, что команда find всегда включает нулевой уровень включения, которое является самим объектом. Так, предыдущая команда также включает состояние в список найденных объектов. Однако можно исключить состояние из вектора объектов в objArray с функцией MATLAB® setdiff можно следующим образом:

objArray = setdiff(objArray, sA);

Эта команда возвращает набор всех соединений на первом уровне включения в состоянии, который представлен объектом State sA:

juncArray = sA.find('-isa','Stateflow.Junction','-depth',1);

Эта команда возвращается, массив всех переходов в утверждают на всех уровнях включения:

transArray = sA.find('-isa','Stateflow.Transition');

Найдите родительский объект

Метод up находит объект родительского контейнера любого данного объекта. Предположим, что у вас есть график, где состояние A содержит состояния A1 и A2. Кроме того, A1 состояния содержит A11 состояния. В примере sA11 является указателем на A11 состояния. Это означает это

>> pA11 = sA11.up;
>> pA11.Name

ans =

A1

возвращает указатель pA11 в A1 состояния, родительский элемент A11 состояния, и

>> ppA11 = pA11.up;
>> ppA11.Name

ans =

A

возвращает указатель ppA11 в состояние A, родительский элемент A1 состояния.

Получите недавно выбранные объекты

Можно получить последний раз выбранные объекты в графике при помощи функции sfgco. Эта функция возвращает указатели на объект или вектор указателей в зависимости от этих условий:

Если...Затем sfgco возвращается...
Нет никаких открытых графиковПустая матрица
Нет никакого списка выбораПо указателю графика последний раз кликают
Вы выбираете один объект в графикеОбработайте к выбранному объекту
Вы выбираете несколько объектов в графикеВектор указателей для выбранных объектов
Вы выбираете объекты в нескольких графикахУказатели последний раз выбранных объектов в последний раз выбранной диаграмме

Например, предположите, что вы запускаете модель sf_boiler и открываете график Bang-Bang Controller. Если вы выбираете состояние Off в графике, sfgco возвращается:

ans =
 
               Path: 'sf_boiler/Bang-Bang Controller/Heater'
                 Id: 20
            Machine: [1x1 Stateflow.Machine]
               Name: 'Off'
        Description: ''
        LabelString: [1x27 char]
           FontSize: 12
          ArrowSize: 8
          TestPoint: 0
              Chart: [1x1 Stateflow.Chart]
    BadIntersection: 0
          Subviewer: [1x1 Stateflow.Chart]
           Document: ''
                Tag: []
    RequirementInfo: ''
     ExecutionOrder: 0
      HasOutputData: 0
           Position: [31.7440 40.9730 214.1807 88.1000]
      Decomposition: 'EXCLUSIVE_OR'
               Type: 'OR'
         IsSubchart: 0
          IsGrouped: 1
              Debug: [1x1 Stateflow.StateDebug]

Доберитесь и набор свойства объектов

Если вы получаете конкретный объект, можно получить доступ к его свойствам непосредственно или через метод get. Например, вы получаете описание для объекта State s с одной из этих команд:

  • od = s.Description;

  • od = s.get('Description');

  • od = get(s, 'Description');

Вы изменяете свойства объекта непосредственно или через метод set. Например, вы изменяете описание объекта State s с одной из этих команд:

  • s.Description = 'This is the On state.';

  • s.set('Description', 'This is the On state.');

  • set(s, 'Description', 'This is the On state.');

Похожие темы