В этой главе приводится описание отдельных объектов Stateflow, из которых строятся Stateflow-диаграммы. Диаграммы Stateflow составляются из символических объектов языка Stateflow. Изучение этих объектов - первый шаг к построению эффективных диаграмм Stateflow. Познакомившись с нотациями Stateflow, можно будет перейти к рассмотрению того, как объекты диаграмм взаимодействуют друг с другом (Этому вопросу будет посвящена глава "Семантика Stateflow").
Перечислим различные типы доступных в Stateflow объектов.
Графические Объекты
В таблице приводится название (Name) и условное обозначение (Notation) каждого графического объекта Stateflow. Объект появляется, когда вы рисуете диаграмму в редакторе диаграмм, для этого используется соответствующий значок (Toolbar icon) на панели инструментов.
Name |
Notation |
Toolbar Icon |
State (состояние) |
||
Transition (переход) |
NA |
|
Default transition (переход по умолчанию) |
||
Connective junction (подключаемое соединение) |
||
History junction (соединение с памятью) |
||
Box (ящик) |
(state) |
|
Graphical function (графическая функция) |
(state) |
Неграфические Объекты
Stateflow определяет неграфические объекты, описанные в следующих разделах:
События, данные и коды не имеют графического представления в редакторе диаграмм Stateflow. Но их можно увидеть в проводнике Stateflow.
События
События - это объекты Stateflow, которые могут переключать всю диаграмму Stateflow или конкретные действия в диаграмме. Так как диаграммы Stateflow выполняются посредством реакции на события, вы определяете и программируете события в ваших диаграммах, чтобы контролировать их выполнение. Вы можете распространять событие на все объекты, либо посылать событие на определенный объект. Вы можете подробно определить события, которые вы сами назначаете. Так же вы можете определить события по умолчанию, имеющие место, например, при входе в состояние.
Данные
Диаграмма Stateflow хранит и восстанавливает данные, которые используются для управления действием диаграммы. Данные Stateflow помещены в свое собственное рабочее пространство, но вы можете иметь доступ к данным, которые располагаются в модели Simulink или приложениях, которые встроены в машину Stateflow. Когда вы создаете диаграмму Stateflow, вы должны определить внутренние и внешние данные, которые вы используете в языке действий диаграммы Stateflow.
Коды
Вы строите коды в Stateflow для выполнения приложений, которые вы программируете в диаграммах Stateflow и моделях Simulink. Код - это программа, которая выполняет диаграммы Stateflow и модели Simulink, включенные в машину Stateflow. Вы строите коды моделирования (называемые sfun) для выполнения вашей модели. Вы строите коды Мастерской Реального Времени (называемые rtw) для выполнения модели Simulink или поддержки окружения процессора. Вы строите обычные коды (они могут быть названы как угодно, за исключением sfun или rtw), чтобы поместить ваше приложение в определенное окружение.
Словарь данных
Словарь данных - это база данных, включающая в себя всю информацию о графических и неграфических объектах. Словарь данных для графических объектов создается автоматически. Для неграфических объектов необходимо определять данные, используя Проводник. Грамматический отладчик анализирует входы и связи между входами в словаре данных, чтобы проверить правильность нотаций.
Как представлена иерархия
Нотации Stateflow поддерживают представление графических объектов в виде иерархии в диаграммах Stateflow. Рассмотрим следующие примеры представления иерархий в диаграммах Stateflow:
Иерархия данных и событий, как неграфических объектов, представлена в проводнике. Иерархия данных и событий определяются при их создании назначением им родительского объекта.
Пример представления иерархии состояний
В представленном примере изображено одно состояние, в рамках которого другое состояние показывает, что внутреннее состояние - это подсостояние или потомок внешнего состояния или надсостояния, и внешнее состояние - родительское по отношению к внутреннему:
В этом примере диаграмма Stateflow - родитель по отношению к состоянию Car_done. Состояние Car_done - родитель состояний Car_made и Car_shipped. Состояние Car_made - также родитель состояний Parts_assembled и Painted. Вы также можете сказать, что состояния Parts_assembled и Painted - потомки состояния Car_made. Иерархия Stateflow также может быть представлена в текстовом виде, тогда символ слэш (/) представляет диаграмму Stateflow, и каждый уровень иерархии состояний разделяется символом (.). Далее показано текстовое представление иерархии объектов предыдущего примера:
Пример представления иерархии переходов
Это пример того, как представляется иерархия переходов:
Иерархия переходов описывает родителя перехода, источник и расположение. Родитель перехода - это низший уровень из тех, которые включают в себя источник и расположение перехода. Машина - это корень (основание) иерархии. Диаграмма Stateflow представляется символом /. Каждый уровень иерархии состояний разделяется символом (.). Три перехода, указанных в примере, представлены в следующей таблице.
Метка Перехода |
Родитель Перехода |
Источник Перехода |
Расположение Перехода |
switch_off |
/ |
/Power_on.Low.Heat |
/Power_off |
Switch_high |
/Power_on |
/Power_on.Low.Heat |
/Power_on.High |
Switch_cold |
/Power_on.Low |
/Power_on.Low.Heat |
/Power_on.Low.Cold |
Состояния
Этот раздел описывает основные объекты Stateflow - состояния. Состояния представляют режимы реактивной системы. Рассмотрим следующие вопросы для получения информации о состояниях и их свойствах:
Что такое состояние?
Состояния описывают режимы реактивных структур Stateflow. Состояния в структурах Stateflow представлены этими режимами.
Иерархия состояний
Состояния могут быть надсостояниями, подсостояниями и просто состояниями. Состояние называется надсостоянием, если включает в себя другие состояния, называемые подсостояниями. Состояние называется подсостоянием, если оно находится внутри другого состояния. Если состояние не является ни надсостоянием, ни подсостоянием, то это просто состояние. Каждое состояние - это часть иерархии. В диаграмме Stateflow, состоящей из одного состояния, родителем этого состояния является сама диаграмма Stateflow. Состояние также имеет память, которая применима к его уровню иерархии диаграммы Stateflow. Состояния могут иметь действия, которые выполняются в последовательности, которая оперделяется их типом. Типы действий: действия при входе (entry), действия во время активности (during), действия при выходе (exit) и действия при наступлении события с именем event_name (on event_name).
Активные и неактивные состояния
Когда состояние активно, диаграмма переходит в этот режим. Когда состояние неактивно, диаграмма не в этом режиме. Активность и неактивность состояний диаграммы динамически изменяется, базируясь на событиях и условиях. Появление событий управляет выполнение диаграммы Stateflow посредством активности и неактивности состояний. На любой стадии выполнения диаграмма Stateflow есть комбинация активных и неактиных состояний.
Декомпозиция состояний
Каждое состояние и диаграмма имеет декомпозицию, которая определяет, какие виды подсостояний оно может включать в себя. Все подсостояния должны быть такого же типа, как декомпозиция надсостояния. Декомпозиция может быть последовательной (ИЛИ) или параллельной (И). Эти типы декомпозиций описаны в следующих подразделах:
Последовательная декомпозиция состояний (ИЛИ)
Если подсостояния имеют сплошные границы, декомпозиция состояний является последовательной (ИЛИ). Последовательная (ИЛИ) декомпозиция используется для описания режимов системы, которые взаимно последовательны. Когда состояние имеет последовательную (ИЛИ) декомпозицию, в любой момент времени может быть активно только одно состояние. Потомками родителей с последовательной (ИЛИ) декомпозицией являются состояния ИЛИ. В следующем примере активным может быть или состояние А, или состояние В. Если состояние А активно, то в любой момент времени может быть активным одно из состояний А1 и А2.
Параллельная декомпозиция состояний (И)
Потомки родителя с параллельной (И) декомпозицией - это параллельные (И) состояния. Если подсостояния имеют пунктирную границу, декомпозиция состояний является последовательной (ИЛИ). Это представление применяется, если все состояния на этом уровне иерархии всегда активны в одно и тоже время. В следующем примере, когда состояние А активно, и А1 и А2 активны одновременно:
Активность в параллельных состояниях практически независима, как это показано в следующем примере. Когда состояние А становится активным, то В и С становятся активными одновременно. Когда С становится активным, активным может стать или С1 или С2.
Нотации меток состояний
Метки состояний отображаются в верхнем левом углу рамки состояния в следующем основном формате:
name/
entry:entry action
during:during action
exit:exit action
on event_name:on event_name action
Метки состояний начинаются с имени состояния Кроме того, метка состояния может иметь символ / и одно или несколько ключевых слов. Ключевые слова определяют различные типы действий, связанных с состоянием. Эти ключевые слова приведены в таблице (сокращенная форма представлена полужирным шрифтом):
Приставка |
Тип действия |
Entry |
Действия при входе в состояние. |
During |
Действия во время активности состояния. |
Exit |
Действия при выходе из состояния. |
On event_name |
Действия при наступлении события event_name. |
После ввода метки, которая определяет тип действия, Вы должны указать, какие именно действия будут выполняться. Составные действия для каждого типа разделяются одним из символов: возврат на начало строки; точка с запятой; запятая.
Вы можете определить составные действия типа on event_name для различных событий.
Каждое ключевое слово опционально и независимо. Вы можете не определять их вовсе либо определить одно или несколько. После каждого ключевого слова ставится двоеточие. За именем состояния может идти / (слэш). Если вы вводите имя и слэш / непосредственно перед действиями, действия интерпретируются как действия при входе в состояние. Сокращенная форма нужна, когда вы определяете только действия при входе в состояние. Действия определяются в метках состояний, составляющих часть языка действий Stateflow.
Правильное имя состояния может состоять из букв, цифр и может включать знак подчеркивания (_), например, Transmission или Green_on. Использование иерархии придает гибкость наименованию состояний. Имя, которое вы вводите в качестве части метки, должно быть уникальным по отношению к именам предков в его иерархии. Имя сохраняется в словаре данных в виде полного имени. Несколько состояний могут иметь одинаковое имя, если их полные имена в словаре данных уникальны. Иначе при грамматическом разборе выявится ошибка. Следующий пример показывает, как иерархия поддерживает уникальность имен состояний.
Каждое из этих состояний имеет уникальное имя в иерархии диаграммы Stateflow. Хотя имена, являющееся частью метки, не уникальны, когда иерархия будет добавлена в имя в словаре данных, результат будет уникальным. Полные имена этих состояний, как они выглядят в словаре данных, показаны ниже:
Пример метки состояния
Следующий пример демонстрирует компоненты метки состояния.
В этом примере имена состояний - On и Off. Имя состояния формирует первую часть метки состояния. Далее указаны следующие действия.
Entry Action (Действие при входе в состояние). Состояние On имеет действие при входе on_count=0. Это значит, что значение on_count устанавливается равным 0, когда выполняется вход в состояние On.
During Action (Действие во время активности состояния). Состояние On имеет два During действия: light_on() и on_count++. Эти действия выполняются, когда выполняются текущие действия состояния On.
Exit Action (Действие при выходе из состояния). Состояние Off имеет действие при выходе light_off(). Это действие выполняется, когда выполняется выход из состояния Off.
On Event_Name Action (Действие при наступлении события Event_Name). Состояние On имеет такое действие. Когда событие power_outage произойдет, действие handle_outage() выполнится.
Переходы
Реактивная система меняет одно состояние на другое при помощи объекта, называемого переходом.
Что такое переход?
Переход - это линия со стрелкой, соединяющая один графический объект с другим. В большинстве случаев переход представляет скачок системы из одного режима (состояния) в другой. Переход соединяет объект-источник с объектом-адресатом. Объект-источник - это место, где переход начинается, объект-адресат - это место, где переход заканчивается. Вот пример перехода из состояния-источника On к состоянию-адресату Off.
Соединения делят переходы на сегменты. В этом случае переход состоит из сегментов перехода и в процессе определения действительности всего перехода каждый сегмент анализируется по отдельности. В следующем примере имеется два сегментированных перехода: один от состояния On к состоянию Off, а другой - от состояния On обратно к состоянию On.
Имеется еще один тип перехода - безусловный переход. Безусловный переход - это специальный тип перехода, у которого нет объекта источника.
Нотации меток переходов
Переходы характеризуются метками. Метка может включать в себя имя события, условие, действие условия и/или действие перехода. Первоначально переходы помечаются символом (?). Метки перехода имеют следующий основной формат: event[condition]{condition_action}/transition_action.
Вы заполняете части event, condition, condition_action и transition_action, как показано в примере. Любая часть метки может отсутствовать. Действия, которые вы определяете в метках, составляют часть языка действий Stateflow.
Пример метки перехода
Использование метки перехода иллюстрируется следующим примером.
Переход происходит при наступлении события, но с учетом истинности условия, если оно определено. Определение имени события необязательно. Если имя события не указано, то переход произойдет при наступлении любого события. Составные события определяются посредством использования логического оператора ИЛИ (|). В этом примере при наступлении события Е происходит переход из состояния On в состояние Off, если при этом будет истинно условие [off_count==0].
Условия - это булевы выражения, которые должны быть истинны для осуществления перехода. Условия заключаются в квадратные скобки ([]). В этом примере условие [off_count==0] должно быть истинным для того, чтобы произошло действие условия и переход стал возможен.
Действия условий следуют за условиями и заключаются в фигурные скобки ({}). Они выполняются тогда, когда условие становится истинным, но перед тем, как переход осуществится. Если ни одно условие не определено, подразумеваемое условие принимается за истинное и действие выполняется. В этом примере если условие [off_count==0] истинно, то действие off_count++ немедленно выполняется.
Действия перехода выполняется после того, как переход стал возможен и при истинности условия, если оно определено. Если переход состоит из сегментов, действие перехода выполняется только когда становится возможен полный путь перехода. Действия перехода обозначаются символом (\). В данном примере, если условие [off_count==0] истинно и состояния Off достигнуто, осуществляется действие перехода Light_off.
Когда переход возможен
В большинстве случаев переход возможен, когда состояние-источник активно и метка перехода действительна. Переходы по умолчанию отличаются тем, что не имеют состояния-источника. Переход по умолчанию к подсостоянию возможен, когда есть переход к надсостоянию или оно активно. Следующие критерии применим и к переходам, и к безусловным переходам.
Метка перехода |
Переход стал возможен, если: |
Событие |
Событие произошло |
Событие и условие |
Событие произошло и условие истинно |
Условие |
Любое событие произошло и условие истинно |
Действие |
Любое событие произошло |
Не определена |
Любое событие произошло |
Типы переходов
Нотации Stateflow поддерживают самые различные типы переходов, которые рассмотрены в следующих разделах.
Переходы к последовательным (ИЛИ) состояниям
Рассмотрим простой пример.
Переход от On к Off действителен, когда состояние On активно и событие Switch_off произошло. Переход от Off к On действителен, когда состояние Off активно и событие Switch_on произошло.
Переходы к подключаемым соединениям
Этот пример перехода к подключаемому соединению (к точке принятия решения) и из подключаемого соединения.
Это Stateflow-диаграмма автомата для продажи газированной воды. Stateflow-диаграмма вызывается, когда внешнее событие Selection_made (Выбор_сделан) произошло. В начальный момент активно состояние Waiting (Ожидание). Состояние Waiting - это общий источник для всех состояний. Когда событие Selection_made происходит, переход из состояния Waiting к одному из остальных четырех состояний базируется на значении переменной select (выбор). Так, если значение переменной select равно 2, диаграмма переходит в состояние Cola. От состояния Waiting к подключаемому соединению ведет один переход, от подключаемого соединения к четырем возможным состояниям ведут четыре различных перехода. Переходы к последовательным (ИЛИ) надсостояниям
Этот пример показывает переходы к последовательным (ИЛИ) надсостояниям и из них, а также использование безусловного перехода.
Это - продолжение двух предыдущих примеров. Сейчас On (автомат включен) - это надсостояние, которое включает состояние Waiting и состояния, соответствующие выбранным напиткам. Переход от Off к On действителен, когда состояние Off активно и событие Switch_on произошло. Однако теперь, когда On является надсостоянием, мы имеем дело с переходом к надсостоянию. Чтобы переход к надсостоянию был действителен, подсостояние-адресат также должно быть определено. Такое подсостояние неявно определено посредством безусловного перехода к Waiting. Приведенная в этом примере нотация определяет, что переход из состояния Off будет сделан обязательно к состоянию On.Waiting. Состояние Off (автомат выключен) не является надсостоянием. Переход от On к Off действителен, когда состояние On активно и событие Switch_off произошло. Другими словами, когда событие Switch_off произошло, переход к состоянию Off выполнится невзирая на то, какое из подсостояний On активно. Это упрощает наблюдения за переходами внутри Stateflow-диаграмм.
Переходы к подсостояниям
Следующий пример показывает переходы к последовательным (ИЛИ) подсостояниям.
Эта диаграмма Stateflow показывает переход от одного ИЛИ-подсостояния к другому ИЛИ-подсостоянию: переход Waiting.Ready к Orange. Переход к состоянию In_motion действителен, когда состояние Waiting.Ready активно, событие Selection_made произошло и переменная select равна 1. Этот переход определяет явный выход из состояния Waiting.Ready и неявный выход из надсостояния Waiting. На стороне адресата этот переход определяет неявный вход в надсостояние Orange и явный вход в подсостояние Orange.In_motion.
Циклические переходы
Сегмент перехода от состояния к подключаемому соединению, а от него назад к тому же самому состоянию, называется циклическим переходом. Вот пример циклического перехода:
Внутренние переходы
Внутренние переходы - это переходы, которые не покидают состояния-источника. Использование внутренних переходов значительно упрощает диаграмму Stateflow. В наибольшей степени это проявляется, когда внутренние переходы определены для надсостояний с последовательной декомпозицией.
Рассмотрим Stateflow-диаграмму, которую можно упростить, если применить внутренние переходы.
Пусть произошло какое-либо событие. При этом обновляется Stateflow-диаграмма. Происходит безусловный переход к подключаемому соединению. Переход-адресат определяется после анализа условий [C_one] и [C_two]. Если [C_one] истинно, осуществится переход к A1. Если [C_two] истинно, осуществится переход к A2. Если ни условие [C_one], ни условие [C_two] не является истинным, осуществится переход к A3. Переходы между A1, A2, и A3 определены метками E_one, [C_one], и [C_two].
А вот как выглядит аналогичная Stateflow-диаграмма после использования внутреннего перехода для подключаемых соединений.
Пусть произошло какое-либо событие. При этом обновляется Stateflow-диаграмма. Происходит безусловный переход к подключаемому соединению. Переход-адресат определяется анализом условий [C_one] и [C_two]. Диаграмма упрощается использованием одного внутреннего перехода вместо большого числа переходов, как в данном примере. Если состояние А уже активно, внутренний переход используется для определения того, какое из подсостояний А активно. Когда событие E_one произошло, внутренний переход потенциально действителен. Если [C_one] истинно, переход к A1 действителен. Если [C_two] истинно, переход к A2 действителен. Если ни условие [C_one], ни условие [C_two] не является истинным, произойдет переход к А3. Это решение проще, чем предыдущее.
Использование внутреннего перехода для соединения с памятью
Этот пример показывает внутренний переход к соединению с памятью.
Пусть состояние Power_on.High изначально активно. Когда событие Reset происходит, внутренний переход к соединению с памятью действителен. Так как внутренний переход действителен, выходим из текущего состояния Power_on.High. Когда происходит внутренний переход к соединению с памятью, предыдущее активное состояние, Power_on.High, вновь становится активным (повторный вход). Аналогично, если состояние Power_on.Low было активным, то в результате произойдет выход из Power_on.Low и повторный вход в него. Внутренний переход в этом примере эквивалентен двум циклическим переходам для Power_on.Low и Power_on.High.
Безусловные переходы
Вы используете безусловные переходы, чтобы сообщить Stateflow, какое именно (одно из нескольких возможных) состояние должно стать активным, когда активизируется состояние или диаграмма, имеющие подсостояния.
Что такое безусловный переход?
Безусловные переходы преимущественно используются для определения, какое последовательное (ИЛИ) состояние должно стать активным, когда есть неоднозначность между двумя или более ИЛИ-подсостояниями. Безусловные переходы имеют объект-адресат, но у них нет объекта-источника. Безусловный переход определяет, какое из подсостояний надсостояния с последовательной (ИЛИ) декомпозицией должно стать активным в отсутствие любой другой информации, такой, как соединения с памятью. Безусловные переходы также используются, чтобы определить, что переход должен быть безусловно выполнен.
Чтобы нарисовать безусловный переход, щелкните по кнопке безусловного перехода на панели инструментов, а затем - по свободной зоне в рабочей области рядом с состоянием или соединением, которое будет адресатом безусловного перехода. Перемещайте мышь к объекту-адресату до присоединения к нему безусловного перехода. В некоторых случаях полезно создать метку безусловного перехода. Одна из наиболее частых ошибок программирования Stateflow-диаграмм - это создание многочисленных последовательных (ИЛИ) состояний без использования безусловных переходов. В отсутствии безусловного перехода не известно состояние, которое становится активным по умолчанию. Заметим, что эта ошибка выявляется, когда модель запускается с использованием Отладчика (Debugger) с включенной опцией State Inconsistencies (Непротиворечивость Состояний).
В таблице показывается кнопка значка и кратко описывает безусловный переход.
Имя |
Кнопка значка |
Описание |
Безусловный переход |
Используется для указания, при достижении этого уровня иерархии, какой из объектов становится активным по умолчанию. |
Метки безусловных переходов
В некоторых случаях есть необходимость в метке безусловного перехода. Можно пометить безусловный переход аналогично тому, как помечаются другие переходы. Когда Вы помечаете безусловные переходы, позаботьтесь о том, чтобы всегда минимум один безусловный переход был действителен. Иначе диаграмма Stateflow может перейти в неопределенное состояние
Примеры безусловных переходов
Следующие примеры показывают использование безусловных переходов в Stateflow-диаграммах.
Примеры безусловных переходов для состояний
Этот пример показывает, как использовать безусловные переходы.
Когда Stateflow-диаграмма первый раз обновляется, должен решиться вопрос, какое из состояний - S или B активировать, т. к. они являются последовательными (ИЛИ) состояниями. Ответ дается безусловным переходом к надсостоянию S. Так как у этого безусловного перехода нет условий, он происходит. Состояние S, которое теперь активно, имеет два подсостояния, A и D. Какое подсостояние становится активным? Только одно из них, может быть активным, потому что они - последовательные (ИЛИ) состояния. Это определяется безусловным переходом к подсостоянию D. Так как у безусловного перехода нет условий, он происходит.
Пусть теперь Stateflow-диаграмма обновляется событием d при активном состоянии B. Переход от состояния В к состоянию S осуществляется. Когда система входит в состояние S, она входит в подсостояние D, потому что определен безусловным переходом.
Безусловные переходы требуются для выполнения Stateflow-диаграмм. Без безусловного перехода к состоянию S при обновлении Stateflow-диаграммы, ни одно из состояний не становится активным. Вы можете зафиксировать эту ситуацию в процессе отладки.
Примеры безусловных переходов для соединений
Этот пример показывает безусловный переход к подключаемому соединению.
В этом примере безусловный переход к подключаемому соединению показывает, что после входа в состояние Counting, подсостояние-адресат определено условиями на сегментах перехода.
Пример безусловного перехода с меткой
Следующий пример показывает, как пометить безусловный переход.
Если состояние А изначально активно и произошло какое-то из двух событий е1 или е2, переход от состояния А к надсостоянию В действителен. Надсостояние В1 и В2 имеют безусловные переходы. Безусловные переходы помечаются определением событий, которые переключают переход. Если событие е1 произошло, переход от А к В1 действителен. Если событие е2 произошло, то переход от А к В2 действителен.
Подключаемые соединения
Подключаемые соединения представляют точки, в которых принимаются решения относительно выбора между альтернативными путями одного перехода.
Подключаемые соединения позволяют представить различные возможные пути для одного перехода. Подключаемее соединения используются в следующих случаях:
Однако есть и ограничения. Так, событие не может инициировать переход из подключаемого соединения в состояние-адресат.
Блок-схемы с подключаемыми соединениями
Подключаемые соединения могут использоваться также для представления структуры алгоритмов (например, конструкций for или if-then-else) в виде блок-схем, т.е. без использования состояний. За счет снижения в Stateflow-диаграмме числа состояний вырабатывается более эффективный код, который оптимизирует использование памяти. При этом применяются следующие комбинации средств:
Диаграммы в виде состояний и переходов между ними и диаграммы в виде блок-схем могут сосуществовать в пределах одной Stateflow-диаграммы. Ключ к успешному представлению диаграмм - в использовании меток переходов, как показано в следующих примерах.
Пример подключаемого соединения с заданием условий перехода
На примере слева состояние А активно, когда произошло событие е, и переход от состояния А к одному из состояний D, E или F имеет место, если выполнено одно из условий [c1], [c2] или [c3]. В эквивалентном представлении справа переход от состояния-источника к подключаемому соединению помечен событием. Переходы от подключаемого соединения к состояням-адресатам помечены условиями. Если состояние А активно, когда происходит событие е, то вначале осуществляется переход от состояния А к подключаемому соединению. Переход от подключаемого соединения к состоянию-адресату происходит, базируясь на истинности условий [c1], [c2], или [c3]. Если ни одно из них не истинно, переход не происходит и состояние А остается активным.
Пример подключаемого соединения с одним переходом, не ограниченным условиями
Переход от А к В действителен, когда состояние А активно, событие E_one произошло, и [C_one] истинно. Переход от А к С действителен, когда А активно, событие E_one произошло, и [C_two] истинно. Иначе, если A активно и событие E_one произошло, то действителен переход от A к D. Если вы не определили четко условие [C_three], то подразумевается, что условие перехода от A к D - ложность [C_one] и [C_two].
Подключаемое соединение - пример цикла
Пусть событие перехода произошло, но условие перехода ложно. Переход в новое состояние не может произойти, но какое-то действие должно быть произведено. Вы можете представить эту ситуацию с использованием подключаемого соединения или циклического перехода (перехода от состояния к нему же).
На левом рисунке, если состояние А активно, событие е произошло и условие [с1] истинно, происходит переход от А к В и выполняется действие а1. Переход от состояния А к состоянию А действителен, если произошло событие е и условие [с1] ложно. В этом цикличном переходе осуществляется выход и повторяется вход в А, а также выполняется действие а2. В эквивалентном представлении справа, в силу использования подключаемых соединений отпадает необходимость в явном задании условия [~c1].
Пример подключаемого соединения и цикла for
Этот пример показывает комбинацию нотации в виде блок-схемы и нотации в форме состояний и переходов. Цикличные переходы могут быть использованы в подключаемых соединениях для представления циклов. Пусть в состоянии А произошло событие Е. Переход от состояния к А к состоянию В действителен, если условие на пути перехода истинны. Первый сегмент перехода не имеет условия, но имеет действие условия. Действие условия {i=0} выполняется. Условие циклического перехода [i<10] становится истинным и действия условия {i++;func1()} выполняются. Действия условия выполняются, пока условие [i<10] не станет ложным (такая диаграмма эффективно выполняет цикл for для значений i от 0 до 9, вызывая каждый раз функцию func1()). Затем выполняется выход из цикла и переход в состояние В.
Пример диаграммы в виде блок-схемы
Это - пример реального использования комбинации нотации в виде блок-схемы и нотации в форме состояний и переходов. На рисунке показана Stateflow-диаграмма модели 8-битного аналого-цифрового преобразователя (АЦП). Рассмотрим случай, когда состояние Sensor.Low активно и событие UPDATE произошло. Внутренний переход от Sensor к подключаемому соединению действителен. Следующий сегмент перехода имеет действие условия {start_adc()}, которое инициирует чтение с АЦП. Цикл на втором подключаемом соединении повторяется, пока истинно условие [adc_busy()]. Этот циклический переход используется для представления задержки, нужной для чтения с АЦП. Задержка может быть представлена и в виде отдельного состояния, но при этом был бы получен менее эффективный код. Действие условия следующего сегмента перехода {sensorValue=read_adc()} устанавливает новое значение, считываемое с АЦП в переменной sensorValue. Заключительный сегмент перехода определяется значением переменной sensorValue. Если [sensorValue <100] истинно, то адресат - это состояние Sensor.Low. Если [sensorValue >200] истинно, то адресат - это состояние Sensor.High. Иначе адресат - это состояние Sensor.Normal.
Пример подключаемого соединения при одном источнике и нескольких адресатах
В переходах от A к B и от A к C участвует общее состояние-источник A. Альтернативное представление использует одну стрелку от А к подключаемому соединению и множество стрелок, помеченных событиями, от соединения к состояниям назначения В и С.
Пример подключаемого соединения с общим событием
Предположим, что когда происходит событие е1, система, в независимости от того, в каком из двух состояний (А или В) она находится, переходит в состояние С. Другими словами, переходы от А к С и от В к С инициируются одним и тем же событием е1. И состояние-адресат и событие являются общими для двух переходов. Есть три способа, чтобы представить это:
На диаграмме показаны первый и третий варианты.
Соединение с памятью
Соединение с памятью запоминает предыдущее активное состояние.
Что такое соединения с памятью?
Соединения с памятью используются, чтобы отметить в Stateflow-диаграмме объекты, где решения принимаются не на основе текущей информации, а опираясь на предысторию. Эта предыстория связана с активностью состояния. Размещение соединения с памятью в надсостоянии показывает, что информация об активности состояния в прошлом используется при определении состояния, которое станет активным в настоящий момент. Соединения с памятью применяются только к тому уровню иерархии, на котором находятся.
Пример использования соединения с памятью
В следующем примере используется соединение с памятью:
Надсостояние Power_on имеет соединение с памятью и два подсостояния. Если состояние Power_off активно и событие switch_on произошло, система может попасть либо в состояние Power_on.Low, либо в состояние Power_on.High. Во время первого входа в надсостояние Power_on осуществляется вход в состояние Power_on.Low, потому что к нему ведет безусловный переход. В некоторый следующий момент, когда состояние Power_on.High активно и происходит событие switch_off, система покидает надсостояние Power_on и состояние Power_off становится активным. Пусть затем происходит событие switch_on. Так как состояние Power_on.High было активным последним, оно снова становится активным. За исключением первого раза, при активности состояния Power_on выбор между Power_on.Low или Power_on.High определяется предысторией.
Соединения с памятью и внутренние переходы
Создавая внутренний переход для объекта с памятью, вы показываете, что при наступлении события и/или условия должен быть выполнен выход из активного состояния, а затем повторен вход в него.
Блоки
Блоки используются для улучшения графического представления диаграммы. Помимо этого, блоки участвуют в выполнении диаграммы Stateflow. Это пример использования Stateflow объекта "блок":
В этом примере блок, помеченный как Motor, группирует все объекты, которые необходимы для управления простым мотором. На диаграмме наряду с этим блоком могут быть и другие объекты, но теперь все элементы управления мотором выделены в отдельный объект.
Графические функции
Графические функции - это функции, которые определены графом переходов. Наличие графических функций обеспечивает удобство и повышает выразительность языка действий Stateflow. На рисунке приведен пример графической функции и Stateflow-диаграммы с переходом, который ее вызывает.
Здесь функция z = f(x,y) вызывается действием условия при переходе от состояния А к состоянию В. Функция определена с использованием символов, которые действительны только в ней самой (формальных параметров x, y и z). Функция вызывается с использованием объектов (фактических параметров c, a и b), доступных состояниям А и В и их родительским состояниям (если таковые имеются). Графические функции подобны текстовым функциям MATLAB и С-функциям. Подобно функциям C и MATLAB, графические функции могут иметь аргумент и возвращать результат. Вызываются функции в действиях переходов и состояний. В отличии от функций C и MATLAB, графические функции - это полноправные графические объекты Stateflow. Вы используете редактор Stateflow, чтобы создать их, и они изменяются в вашей модели Stateflow вместе с диаграммами, которые их вызывают. Это делает графические функции более простыми в создании и управлении, чем текстовые функции, создание которых требует внешних инструментов и которые изменяются отдельно от модели.
Язык действий
Этот раздел знакомит с языком действий, используемым в метках переходов и состояний
Что такое язык действий?
Язык действий определяет действия, которые можно задать, если использовать нотации меток состояний и переходов. Stateflow сопоставляет действия состояниям или переходам при наличии соответствующих меток. Действия состояний и переходов делятся на несколько типов. Переходы имеют события переключения, условия, действия условий и действий переходов. Состояния могут иметь действия при входе в состояние, во время активности состояния, действия при выходе из состояния и при наступлении события с именем event_name.
Пример использования языка действий
Следующая диаграмма показывает примеры различных категорий действий для состояний и переходов:
Действия в языке действий могут приводить к наступлению событий, установлению условий, вызову функций, установлению значений переменных и операндов и т. д. Большинство из них аналогично действиям в C или MATLAB.
Нотации языка действий
Язык действий включает метки состояний и переходов, к которым применятся язык действий..
Семантика языка действий
Правила взаимодействия между различными нотациями Stateflow относятся к семантике Stateflow. Этому вопросу будет посвящена глава "Семантика Stateflow"