Описание пользователя
Глава 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) установим флажок «»;
- поле «» выберем вариант «» и введем в поле справа от этого варианта имя «VarName» – параметр с таким именем будет хранить имя нашей динамической переменной;
- в поле «» введем «DynVar» – это будет именем нашего объекта, которое мы будем использовать в программе;
- в выпадающем списке «» выберем вариант «подсистема (RDS_DVPARENT)» – переменная будет создаваться в родительской подсистеме блока;
- в выпадающем списке «» выберем «создать»;
- в выпадающем списке «» оставим проставленный там по умолчанию вариант «double» – наша переменная будет вещественной;
- закроем окно добавления переменной кнопкой «».
Рис. 435. Добавление объекта для динамической переменной
с привязкой имени к настроечному параметру
После нажатия кнопки «» появится предупреждение об отсутствии в модели настроечного параметра с именем «VarName» с предложением создать его, на которое следует ответить «». После этого откроется окно добавления настроечного параметра (см. рис. 422), в котором поля «» и «» заблокированы: в поле «» уже проставлено «VarName», а в поле «» – «rdsbcppString» (типом параметра для хранения имени переменной обязательно должна быть строка). В этом окне следует установить флажок «» и, под этим флажком, ввести в поле «» текст «имя переменной», а в поле «» – «100» (остальные поля ввода окна, включая пустое значение параметра по умолчанию, оставим без изменения), а затем закрыть окно кнопкой «».
Класс 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.