Stateflow® API состоит из объектов, которые представляют графические и неграфические объекты диаграммы Stateflow. Для примера объекты API Stateflow.State
и Stateflow.Transition
представление состояний и переходов на диаграмме Stateflow.
С find
вы задаете критерии поиска для объекта API, который хотите найти. Можно объединить такие критерии, как:
Тип объекта
Имя свойства или функции
A имени свойства и значение
Для примера эта команда ищет Simulink.Root
и возвращает каждую Stateflow.State
объект с именем 'On'
:
onState = find(sfroot,'-isa','Stateflow.State','Name','On')
Если более одного объекта соответствует критериям поиска, find
возвращает массив квалифицированных объектов. Для примера, если открыто несколько графиков, эта команда возвращает массив Stateflow.Chart
объекты:
chartArray = find(sfroot,'-isa','Stateflow.Chart')
После получения доступа к объекту API можно перемещаться по иерархии Stateflow и находить его children (объекты, которые он содержит) или его parent (объект, который его содержит). Для примера, в этом графике, состояния A
является родительским состоянием дочерних состояний A1
и A2
. Вы можете использовать find
и up
функции для перехода от графика к состоянию A
и его дочерние элементы, и обратно из дочерних состояний в родительское состояние и график. Для получения дополнительной информации об этом примере смотрите Создание графиков при помощи скрипта MATLAB.
Чтобы найти дочерние элементы объекта API, вызовите find
функция. По умолчанию, find
функция находит объекты на всех глубинах защитной оболочки в объекте. Например, предположим, что ch
является Stateflow.Chart
объект, который соответствует графику в предыдущем примере. Вызов find
функция для поиска всех состояний в ch
возвращает массив с тремя Stateflow.State
объекты:
states = find(ch,'-isa','Stateflow.State'); get(states,'Name')
ans = 3×1 cell array {'A'} {'A1'} {'A2'}
Чтобы ограничить максимальную глубину защитной оболочки для поиска, используйте '-depth'
аргумент как часть критериев поиска. Например, чтобы найти единственное Stateflow.State
объект на первом уровне локализации в ch
, введите:
sA = find(ch,'-isa','Stateflow.State','-depth',1); sA.Name
ans = 'A'
Точно так же, чтобы найти все состояния в A
, можно вызвать find
функция на Stateflow.State
sA объекта
. В этом случае поиск включает нулевой уровень сдерживания, который является самим искомым объектом:
states = find(sA,'-isa','Stateflow.State'); get(states,'Name')
ans = 3×1 cell array {'A'} {'A1'} {'A2'}
Чтобы исключить состояние A
из результатов поиска вызовите MATLAB® функция setdiff
:
childStates = setdiff(states,sA);
get(childStates,'Name')
ans = 2×1 cell array {'A1'} {'A2'}
Чтобы найти родительский элемент объекта API, вызовите up
функция. Например, предположим, что sA1
является Stateflow.State
объект, который соответствует состоянию A1
в предыдущем примере. Вызов up
функция на sA1
возвращает Stateflow.State
объект, который соответствует состоянию A
:
parent = up(sA1); parent.Name
ans = 'A'
Точно так же вызывая up
функция на parent
возвращает Stateflow.Chart
объект, который соответствует графику:
grandparent = up(parent); grandparent.Name
ans = 'Chart'
Можно получить последние выбранные объекты на графике, вызвав sfgco
функция. Эта функция возвращает один объект или массив объектов, в зависимости от вашего выбора.
Например, рассмотрим график в предыдущем примере. Предположим, что вы выбираете переход от состояния A1
в состояние A2
. Вызов sfgco
возвращает соответствующее Stateflow.Transition
объект:
tr = sfgco; str = ['Transition from ' tr.Source.Name ' to ' tr.Destination.Name]
str = 'Transition from A1 to A2'
Точно так же, если вы одновременно выбираете три состояния на графике, вызывая sfgco
возвращает массив Stateflow.State
объекты.
states = sfgco;
get(states,'Name')
ans = 3×1 cell array {'A'} {'A1'} {'A2'}
Примечание
Когда вы используете sfgco
для доступа к нескольким объектам порядок объектов массива зависит от порядка, в котором вы выбираете объекты.