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

Описания RDS

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

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

§3.6. Принципы создания автокомпилируемых моделей блоков

§3.6.7. Задание пользователем имен динамических переменных

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

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

### §3.6. Принципы создания автокомпилируемых моделей блоков

#### §3.6.7. Задание пользователем имен динамических переменных

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

В §3.6.3.2 приведены примеры моделей блоков, передающих друг другу вещественное значение через динамическую переменную: одна модель записывала в переменную данные, другая – считывала их. Такие блоки можно использовать для того, чтобы связать между собой далеко отстоящие друг от друга части схемы без явного проведения между ними связи: блок в одной части схемы будет записывать данные в переменную, а блок в другой части – считывать их. Модели в приведенном примере обладают одним существенным недостатком: имя переменной, через которую блоки передают данные, жестко встроено в сами модели. Если потребуется организовать передачу другого вещественного значения, придется создавать пару точно таких же моделей, в которых будет задано другое имя переменной.

Гораздо удобнее сделать имя переменной, через которую идет обмен данными, параметром блока, и дать пользователю возможность вводить ее имя в окне настроек этого блока. В модуле автокомпиляции есть такая возможность: при создании динамической переменной можно вместо указания для переменной фиксированного имени связать это имя с настроечным параметром типа rdsbcppString (специальный тип для работы со строками, поддерживаемый модулем автокомпиляции). Если создать для этого параметра поле ввода, пользователь сможет изменять имя динамической переменной в настройках блока.

Создадим две модели для обмена вещественным значением через динамическую переменную: как и в §3.6.3.2, первая модель будет записывать в эту переменную значение своего входа, а вторая – выдавать это значение на свой выход. Однако, в этом примере мы сделаем имя динамической переменной настраиваемым.

Начнем с блока-передатчика, на вход которого будет подаваться значение для записи в динамическую переменную. Структура статических переменных этого блока будет такой:

Имя | Тип | Вход/выход | Пуск | Начальное значение
--- | --- | --- | --- | ---
Start | Сигнал | Вход | ✓ | 1
Ready | Сигнал | Выход |  | 0
x | double | Вход | ✓ | 0

Его модель будет запускаться при самом первом запуске расчета (поэтому у сигнала «Start» единичное начальное значение), а также при срабатывании связи, подключенной к входу «x» (поэтому у этого входа установлен флажок «пуск»). Создадим новый блок с автокомпилируемой моделью, зададим для него запуск по сигналу, нажмем в верхней части вкладки «переменные» редактора модели кнопку «изменить» и введем указанную выше структуру переменных.

Теперь добавим в модель объект для работы с динамической переменной, имя которой будет считываться из настроечного параметра. Для этого выполним следующие действия:

- на вкладке “переменные” левой панели редактора модели в нижней ее части нажмем кнопку со знаком «+»;
- в открывшемся окне добавления динамической переменной (рис. 435) установим флажок «произвольная переменная»;
- поле «имя переменной в RDS» выберем вариант «из настроечного параметра» и введем в поле справа от этого варианта имя «VarName» – параметр с таким именем будет хранить имя нашей динамической переменной;
- в поле «имя переменной в программе» введем «DynVar» – это будет именем нашего объекта, которое мы будем использовать в программе;
- в выпадающем списке «блок-владелец» выберем вариант «подсистема (RDS_DVPARENT)» – переменная будет создаваться в родительской подсистеме блока;
- в выпадающем списке «действие» выберем «создать»;
- в выпадающем списке «тип» оставим проставленный там по умолчанию вариант «double» – наша переменная будет вещественной;
- закроем окно добавления переменной кнопкой «OK».

Рис. 435. Добавление объекта для динамической переменной
с привязкой имени к настроечному параметру

После нажатия кнопки «OK» появится предупреждение об отсутствии в модели настроечного параметра с именем «VarName» с предложением создать его, на которое следует ответить «да». После этого откроется окно добавления настроечного параметра (см. рис. 422), в котором поля «имя» и «тип» заблокированы: в поле «имя» уже проставлено «VarName», а в поле «тип» – «rdsbcppString» (типом параметра для хранения имени переменной обязательно должна быть строка). В этом окне следует установить флажок «добавить для этой переменной поле ввода» и, под этим флажком, ввести в поле «заголовок» текст «имя переменной», а в поле «ширина» – «100» (остальные поля ввода окна, включая пустое значение параметра по умолчанию, оставим без изменения), а затем закрыть окно кнопкой «OK».

Класс rdsbcppString, используемый в автокомпилируемых моделях для хранения текстовых строк, подробно рассматривается в §3.6.2.5, поэтому здесь мы не будем на нем останавливаться.

После закрытия окна добавления параметра в списке динамических переменных редактора модели появится созданный нами объект с именем «DynVar» (рис. рис. 436 а), а на вкладке «настройки» – параметр «VarName» и поле ввода для него (рис. рис. 436 б). В списке динамических переменных имя «VarName» отображается без кавычек, поскольку это не имя переменной в RDS, а имя настроечного параметра, то есть имя переменной программы модели.

(а)

(б)

Рис. 436. Созданный объект в списке динамических переменных модели (а)
и вкладка “настройки” после добавления параметра (б)

На вкладке «настройки» следует нажать кнопку с размерными стрелками справа от текста «окно настройки» и ввести в поле ввода «заголовок» текст «передатчик» – это будет заголовком нашего окна настройки. Так пользователю будет понятнее, с каким именно блоком он работает.

Все действия по слежению за тем, чтобы имя создаваемой переменной совпадало с текстом, который пользователь ввел в окне настроек, будут добавлены в модель автоматически. При изменении имени в настройках модель сама будет удалять переменную с прежним именем и создавать переменную с новым. Переменная также будет создаваться сразу после загрузки параметров блока из файла или буфера обмена. Осталось только ввести в модель реакцию на такт расчета, в которой значение входа блока будет копироваться в динамическую переменную. Раскроем раздел «моделирование и режимы» вкладки «события» и дважды щелкнем на его подразделе «модель». На открывшейся одноименной вкладке введем текст, аналогичный тексту модели из §3.6.3.2:

      DynVar=x;
      DynVar.NotifySubscribers();

Займемся теперь моделью приемника, который будет читать вещественное число из динамической переменной, имя которой задается пользователем, и выдавать его на свой выход. Структура переменных приемника будет такой:

Имя | Тип | Вход/выход | Пуск | Начальное значение
--- | --- | --- | --- | ---
Start | Сигнал | Вход | ✓ | 0
Ready | Сигнал | Выход |  | 0
y | double | Выход |  | 0

Создадим новый блок с автокомпилируемой моделью, зададим для него запуск по сигналу и введем в его редакторе эту структуру переменных. В эту модель необходимо добавить объект «DynVar» с таким же настроечным параметром «VarName», как и в предыдущей модели. Повторим все действия по добавлению этих объектов и созданию окна настройки, описанные выше, с двумя исключениями: при добавлении динамической переменной (см. рис. 435) вместо действия «создать» выберем действие «найти и подписаться», а в качестве заголовка окна настройки укажем не «передатчик», а «приемник».

Введем в модель реакцию на изменение динамической переменной (раздел «моделирование и режимы», подраздел «изменение динамической переменной»), в которой мы будем считывать число из этой переменной и выдавать его на выход. Текст реакции тоже будет аналогичен реакции модели из §3.6.3.2:

      y=DynVar;
      Ready=1; // Выходные связи должны сработать

Обе модели готовы. Блок-передатчик будет записывать значение своего входа в динамическую переменную, а блок-приемник будет читать ее и передавать на свой выход. Поскольку передатчик создает переменную в своей родительской подсистеме, приемник должен размещаться либо в одной подсистеме с передатчиком, либо в подсистеме любого уровня вложенности внутри этой подсистемы. Можно сделать так, чтобы передатчик создавал переменную в корневой подсистеме схемы, тогда она будет видна отовсюду, и приемник можно будет размещать в любом месте. Для этого достаточно будет заменить в параметрах динамических переменных обеих моделей блок-владелец с «подсистема (RDS_DVPARENT)» на «система (RDS_DVROOT)».

Рис. 437. Схема для проверки приемника и
передатчика и окно настройки передатчика

Проверим работу созданных блоков. Соберем схему, изображенную на рис. 437: разместим приемник и передатчик в одной подсистеме, к входу передатчика (на рисунке он слева) присоединим поле ввода, а к выходу приемника – индикатор. Вызовем окно настройки передатчика (пункт «настройка» в контекстном меню) и введем там какое-нибудь имя переменной. В настройках приемника введем то же самое имя. Теперь, если запустить расчет, значение на выходе приемника будет повторять значение на входе передатчика. Имена переменных в настройках блоков можно менять как угодно – пока имя в приемнике будет совпадать с именем в передатчике, блоки будут связаны. Можно, при желании, добавить в схему еще несколько передатчиков, задав им другие имена переменных, и еще несколько приемников. Каждый приемник будут получать значение от передатчика, в настройках которого введено то же самое имя переменной.

Следует отметить, что сейчас по двойному щелчку на блоке-приемнике и блоке-передатчике открывается не окно настройки, а окно редактора модели – это удобно для отладки, но неудобно для пользователя. Как сделать так, чтобы по двойному щелчку открывалось окно настройки, описано в §3.6.6.