Текущий раздел:

Описания RDS

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

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

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

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

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

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

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

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

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

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

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

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

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

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

- Безымянная колонка – отображает одну или две иконки. В левой части колонки белая иконка пустого листа означает, что текст реакции на вызов этой функции не введен в модель, а желтая иконка – что этот текст введен. На рисунке текст реакции введен только для третьей сверху функции. В правой части колонки изображается иконка дополнительных действий с функцией. Иконка с лупой (на рисунке – вторая сверху функция) указывает на то, что в модель данного блока будет добавлен автоматический поиск блока, зарегистрировавшегося в RDS в качестве исполнителя этой функции. Иконка со знаком «+» (третья сверху функция на рисунке) – на то, что модель зарегистрирует данный блок как исполнителя функции. Наконец, отсутствие иконки в правой части колонки означает, что никаких дополнительных действий с функцией модель производить не будет.
- «Имя в C++» – имя объекта, созданного для хранения идентификатора этой функции и работы с ней. Вызов функции у других блоков производится с использованием этого объекта – примеры различных способов вызова приводятся в §3.6.13. Особенности использования объектов, создаваемых для работы с функциями, рассматриваются в §3.6.13.5.
- «Имя в RDS» – имя функции блока, под которым она регистрируется в RDS. Другие модели для вызова этой функции или реакции на ее вызов должны зарегистрировать ее под этим же именем.
- «Параметр» – тип указателя на область данных параметров функции, или пустая строка, если у функции нет параметров. На рисунке первая функция не имеет параметров, вторая использует в качестве параметра вещественное число (поэтому в колонке отображается «double*», то есть «указатель на double»), параметром третей является некторая структура или класс с именем «TUMParams2».

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

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

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

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

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

- «Имя функции в RDS» – имя, под которым модель регистрирует функцию блока в RDS. Это же имя необходимо использовать для регистрации этой функции во всех остальных моделях, которые будут ее использовать.
- «Идентификатор функции в программе» – имя объекта, который будет создан в программе модели для хранения идентификатора этой функции. Его имя должно удовлетворять требованиям языка C (содержать только латинские буквы, цифры и знак подчеркивания и не начинаться с цифры) и не должно совпадать с именами статических и динамических переменных блока. Запоминание в этом объекте идентификатора, полученного от RDS при регистрации функции, будет добавлено в программу автоматически. При первом вводе имени функции в окне параметров это поле заполняется само – по умолчанию имя объекта формируется добавлением к введенному имени функции приставки «rdsfunc» и заменой всех символов, недопустимых для имен переменных в языке C, на подчеркивания (на рисунке для функции «UserManual.MyFunction2» было автоматически сформировано имя переменной rdsfuncUserManual_MyFunction2). При желании, автоматически сформированное имя можно заменить на любое другое, не совпадающее с именами других глобальных объектов в программе.
- «Имя функции реакции в классе блока» – имя функции-члена класса блока, которая будет автоматически вызываться в том случае, если какой-нибудь другой блок вызовет блок с этой моделью для выполнения данной функции. Текст в этом поле формируется автоматически и не может быть изменен: он получается добавлением к имени переменной из предыдущего поля слова «Event».
- «Тип параметра функции (указатель)» – тип указателя C++, к которому необходимо привести указатель на область параметров функции. Например, если параметром функции является вещественное число типа double, в это поле необходимо ввести «double*». На рисунке в поле введено «TUMParams2*» – это означает, что параметром функции будет являться некоторая структура типа TUMParams2.
- «Дополнительные действия» – одно из двух возможных действий, которые модель может выполнить для этой функции: либо зарегистрировать блок с этой моделью в RDS как исполнителя данной функции, чтобы все остальные блоки схемы могли его легко найти (на рисунке выбран именно такой вариант), либо, наоборот, заставить модель найти блок, зарегистрированный как исполнитель функции, чтобы можно было вызывать его. Можно не указывать никаких действий – в этом случае модель все равно сможет вызывать функцию и реагировать на ее вызов, но все действия в этой модели по определению вызываемого блока и в других моделях по поиску этого должны будут выполняться вручную.

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

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

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

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

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

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

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

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