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

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

Глава 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. Добавление объекта для динамической переменной
с привязкой имени к настроечному параметру

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

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

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

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

(а)

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

(б)

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

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

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

  DynVar=x;
  DynVar.();

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

Имя Тип Вход/выход Пуск Начальное значение
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.


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