Навигация:
<< >> Оглавление Указатель

Описание пользователя

Глава 3. Использование стандартных модулей автокомпиляции

§3.5. Окно редактора модели

§3.5.5. Функции блока

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

Одним из способов взаимодействия блоков схемы друг с другом является непосредственный вызов модели одного блока моделью другого – в RDS это называется вызовом функции блока. Блок может выполнять несколько функций, каждая такая функция должна иметь уникальное текстовое имя, по которому ее можно отличить от других. Обычно, если разработчик модели решает, что его блок может выполнять какие-либо полезные действия по запросам от других блоков, он придумывает для этих действий имя функции – достаточно длинное, и сложное, чтобы избежать возможного пересечения с функциями, придуманными другими разработчиками – и встраивает в свою модель реакцию на выполнение этой функции. Имя функции блока в RDS не ограничено по длине, поэтому чаще всего в него включают имя разработчика, название выполняемой задачи, библиотеку, в модели из которой эта функция впервые появилась, и т.п. Общие рекомендации по выбору имен для новых функций даются в §2.13.1 руководства программиста.

Технически механизм вызова функций блоков устроен в RDS следующим образом. Чтобы модель блока могла вызывать функции других блоков и реагировать на вызов своих функций, эти функции должны быть зарегистрированы в RDS. Для этого модель должна передать в RDS имя функции и получить присвоенный этой функции целый идентификатор (для этого используется вызов rdsRegisterFunction), и вся дальнейшая работа с функцией ведется с использованием этого идентификатора. Для вызова функции другого блока необходимо передать RDS его идентификатор (или идентификатор подсистемы, если нужно вызвать функцию у всех ее блоков), идентификатор вызываемой функции и указатель на область данных параметров функции (как правило, это какая-либо структура). Вызванная модель блока получает идентификатор функции и указатель на область ее параметров, она должна сравнить этот идентификатор с идентификаторами поддерживаемых ей функций и выполнить необходимые действия, если он совпал с одним из них.

Стандартный модуль автокомпиляции автоматизирует регистрацию функций и распознавание вызванной функции: пользователю необходимо только добавить необходимые описания на вкладке «функции» дополнительной панели окна редактора модели (рис. 341, на рисунке дополнительная панель растянута по горизонтали, чтобы уместились длинные имена функций). Для каждой из функций в списке на этой вкладке в модель будет автоматически добавлен регистрирующий ее вызов и соответствующее ей событие в список событий (см. также рис. 343).

Список функций блока

Рис. 341. Список функций блока

Список функций на вкладке состоит из четырех колонок:

Под списком располагаются кнопки, позволяющие добавлять, удалять и изменять функции, а также переходить к вводу текста реакции на их вызов:

Кнопка Действие
Кнопка: текст Открыть вкладку для ввода текста реакции на вызов выбранной функции.
Кнопка: добавить Добавить новую функцию (открывает отдельное окно, см. рис. 342).
Кнопка: свойства Изменить выбранную функцию (открывает отдельное окно).
Кнопка: удалить Удалить выбранную функцию.

При добавлении новой функции блока или изменении уже существующей ее параметры отображаются в отдельном окне (рис. 342). В верхней части окна можно либо установить флажок «стандартная функция» и выбрать в выпадающем списке одну из функций, поддерживаемых стандартными блоками, входящими в состав RDS, либо установить флажок «произвольная функция» и ввести все параметры функции вручную.

Окно параметров функции блока

Рис. 342. Окно параметров функции блока

Для произвольной функции в нижней части окна заполняются следующие поля:

Реакции на вызов функций в списке событий модели

Рис. 343. Реакции на вызов функций
в списке событий модели

Нажатие кнопки «OK» занесет новые параметры функции в список. При добавлении новой функции блока ее имя автоматически появляется в группе «функции блока» в списке событий на панели «события», где можно будет ввести реакцию на ее вызов у блока с данной моделью. Реакции на вызовы функций из списка на рис. 341 в списке событий изображены на рис. 343. Если модель должна не только вызывать эту функцию, но и реагировать на ее вызов, открыть вкладку для ввода текста реакции можно как из списка событий, дважды щелкнув на имени функции, так и из самого списка функций, выбрав в нем нужную функцию и нажав кнопку с желтым листком слева снизу под списком.

Для реакции на вызов функции без параметров автоматически формируется функция-член класса блока следующего вида:

  void rdsbcppBlockClass::имя_функции(
     FData,
    int &Result)
  {
    текст пользователя
  }

где rdsbcppBlockClass – жестко заданное модулем автокомпиляции имя класса блока, имя_функции – автоматически сформированное имя функции реакции из поля «имя функции реакции в классе блока» окна параметров функции, FData – указатель на структуру RDS_FUNCTIONCALLDATA (см. §3.7.5), описывающую вызов функции (какой блок ее вызвал, в каком режиме и т.п.), Result – ссылка на целую переменную, через которую функция возвращает результат, текст пользователя – введенный пользователем на вкладке редактора модели фрагмент текста программы. Для функции с параметрами в описание добавляется еще и параметр указанного при добавлении функции типа:

  void rdsbcppBlockClass::имя_функции(тип_параметра Param,
     FData,
    int &Result)
  {
    текст пользователя
  }

где тип_параметра – указанный при создании функции тип указателя на область ее параметров, Param – приведенный к этому типу указатель.

Примеры моделей, вызывающих функции других блоков и реагирующих на такие вызовы, приведены в §3.6.13.


<< >> Оглавление Указатель