Описание пользователя
Глава 3. Использование стандартных модулей автокомпиляции
§3.5. Окно редактора модели
§3.5.3. Динамические переменные блока
Описывается добавление в модель блока динамических переменных, с помощью которых блоки могут обмениваться информацией без явного проведения связей между ними.
Рис. 337. Список динамических переменных
В нижней части вкладки «» дополнительной панели окна редактора модели, непосредственно под списком статических переменных, задается список динамических переменных (рис. 337). Динамические переменные создаются моделями блоков скрыто от пользователя для обмена информацией друг с другом. Чаще всего такие переменные применяются в тех случаях, когда множеству блоков схемы необходимо одно и то же значение – передача его по связям ко всем блокам во всех подсистемах загромоздила бы схему. Типичный пример – текущее значение времени, которое нужно для работы всем динамическим блокам. Один из стандартных блоков RDS – планировщик расчета – создает вещественную динамическую переменную с именем «DynTime» и постоянно записывает в нее значение времени, изменяющееся с заданной скоростью и шагом, а все остальные блоки находят эту переменную и считывают ее значение. В RDS встроен специальный механизм подписки на динамическую переменную, который позволяет блоку найти переменную с заданным именем и типом – кратко он описан в §1.5 описания пользователя, подробнее – в §2.6 руководства программиста. Примеры моделей блоков, создающих динамические переменные и подписывающихся на них, приведены в §3.6.3, здесь же описан только интерфейс, позволяющий добавлять в модель такие переменные.
Список динамических переменных состоит из четырех колонок:
- Безымянная колонка – содержит знак «+», если модель блока создает эту переменную, изображение лупы, если модель будет обращаться к переменной, созданной другим блоком, или пустой белый квадрат, если вся работа с динамической переменной будет выполняться программистом вручную, путем вызова функций-членов создаваемого для нее объекта.
- «» – имя объекта, создаваемого в модели для доступа к данной динамической переменной. Именно это имя будет использоваться в текстах фрагментов программы, вводимых в редакторе модели, внутри операторов присваивания или получения значения переменной. Оно может отличаться от имени переменной в RDS, указываемого отдельно.
- «» – описание типа переменной. Динамические переменные в RDS имеют те же самые типы, что и статические.
- «» – имя динамической переменной, используемое в RDS. Под этим именем переменная будет известна в RDS, оно будет использоваться для поиска и создания переменной. Имя либо жестко задается в модели («фиксированное имя»), либо считывается из настроечного параметра блока. При жестком задании имени все блоки с данной моделью будут связаны с одной и той же динамической переменной, имена таких фиксированных переменных в списке отображаются в кавычках. Если же имя переменной хранится в параметре блока, его можно сделать разным в разных блоках с одной и той же моделью. Для динамических переменных, вся работа с которыми выполняется программистами вручную, имя не указывается.
Чаще всего, чтобы избежать путаницы, имя переменной в С++ делают таким же, как и имя в RDS, если оно фиксировано. Однако, это не всегда возможно: требования к синтаксису динамических переменных в RDS мягче требований к идентификаторам C++, и некоторые имена не могут быть использованы в программе без изменений. Формально имя переменной в С++ может быть никак не связано с ее именем в RDS – например, объект для доступа к стандартной динамической переменной времени «DynTime» можно назвать просто «t», и, в этом случае, во всех фрагментах программы, вводимых в редакторе модели, для обращения к значению времени можно будет использовать объект t.
Непосредственно под списком находятся кнопки, позволяющие добавлять, удалять и изменять переменные:
| Кнопка | Действие |
|---|---|
| Переместить выбранную переменную на одну позицию вверх по списку. | |
| Переместить выбранную переменную на одну позицию вниз по списку. | |
| Добавить новую переменную (открывает отдельное окно, см. рис. 338). | |
| Изменить выбранную переменную (открывает отдельное окно). | |
| Удалить выбранную переменную. |
Порядок переменных в списке нужен только для их визуального упорядочения на панели редактора модели. Он никак отражается на работе модели, все динамические переменные равноправны.
При добавлении новой переменной или изменении уже существующей ее параметры отображаются в отдельном окне (рис. 338). В верхней части окна можно установить либо флажок «» и выбрать одну из стандартных динамических переменных в выпадающем списке (параметры стандартных переменных жестко заданы), либо флажок «», если все параметры переменной указываются вручную.
Рис. 338. Окно параметров динамической переменной
На данный момент в модуле автокомпиляции предусмотрена единственная стандартная переменная: текущее время динамического расчета «DynTime» типа double. При ее выборе все поля окна автоматически заполнятся запомненными для этой переменной параметрами – достаточно нажать кнопку «», чтобы связь с этой стандартной динамической переменной была добавлена в модель блока. Изменить при этом можно будет только имя переменной в программе, все остальные поля ввода будут заблокированы. Список стандартных динамических переменных во внутреннем формате RDS хранится в файле «dynvars.lst» в папке «Common» внутри стандартной папки настроек RDS (путь к стандартной папке настроек можно узнать, вызвав пункт главного меню «»), формат этого файла здесь не рассматривается.
Если в верхней части окна установлен флажок «», все параметры динамической переменной следует ввести вручную. Должны быть заполнены следующие поля:
- «» – имя динамической переменной. Все остальные блоки будут получать к ней доступ по этому имени. Если блок подключается к переменной, созданной другим блоком, имя этой переменной необходимо узнать у создателя модели последнего. Если же блок сам создает переменную, для нее желательно выбрать уникальное имя, чтобы переменная с таким же именем не использовалась другими разработчиками моделей. Имена динамических переменных чувствительны к регистру («Var», «VAR» и «var» будут считаться разными переменными) и не должны содержать знака доллара, точек, запятых и скобок. Для большей совместимости моделей лучше всего использовать в них только латинские буквы, цифры и знак подчеркивания. Имя переменной в RDS вводится только в том случае, если в поле «» (см. ниже) будет указано одно из стандартных действий. В окне можно выбрать один из двух вариантов указания имени динамической переменной:
- «» – имя жестко задается в программе модели, все блоки с этой моделью будут связаны с одной и той же переменной. Само имя вводится в поле ввода справа от названия этого варианта.
- «» – указывается имя настроечного параметра блока, из которого будет считываться имя динамической переменной. Имя параметра либо вводится вручную в поле справа от названия варианта, либо выбирается в этом поле из списка уже имеющихся у блока параметров. Параметр для хранения имени динамической переменной обязательно должен иметь тип «rdsbcppString», используемый в автокомпилируемых моделях для работы со строками. Если введенный в поле параметр отсутствует в блоке, при закрытии окна кнопкой «» будет предложено создать его вместе с полем для его ввода в окне настроек (см. §3.5.6 и §3.6.7).
- «» – имя, которое будет использоваться в тексте программы для обращения к данной переменной. Это имя должно удовлетворять стандартным требованиям к идентификаторам в языке C, то есть состоять только из букв, цифр и знака подчеркивания и не начинаться с цифры. По умолчанию в качестве имени переменной в программе подставляется копия имени переменной в RDS, в которой все недопустимые для языка C символы заменены на подчеркивания. Пользователь может изменить это имя так, как ему удобно, оно используется только внутри модели и недоступно RDS и другим блокам.
- «» – тип переменной, которую нужно создать или найти. Тип выбирается из выпадающего списка. Если выбрать в списке «массив» или «матрица», под ним появится дополнительный список для выбора типа элемента массива или матрицы (на рис. 338, например, переменная имеет тип «матрица double»).
- «» – блок, внутри которого будет искаться или создаваться динамическая переменная. Можно выбрать один из трех вариантов: «этот блок», «подсистема» и «система» (в выпадающем списке после названия каждого варианта в скобках приведена стандартная константа, которой этот вариант обозначается в сервисных функциях RDS). Если выбрать вариант «этот блок», при подключении к переменной или ее создании модель будет обращаться к своему собственному блоку (этот вариант практически не применяется, поскольку при этом другие блоки, вероятнее всего, не будут иметь доступа к переменной). Вариант «подсистема» указывает модели обращаться для создания или поиска переменной к родительской подсистеме данного блока (к переменной будут иметь доступ все блоки этой подсистемы и подсистем, вложенных в нее). Наконец, вариант «» указывает модели обращаться для создания или поиска переменной к корневой подсистеме схемы (к переменной будут иметь доступ все блоки схемы). Если в поле «», описанном ниже, выбирается вариант «вручную», блок-владелец не указывается: он будет задан программистом вручную при работе с объектом переменной внутри программы.
- «» – что именно модель должна сделать с переменной. Можно выбрать один из четырех вариантов: «создать», «подписаться», «найти и подписаться» и «все действия – вручную». Если выбран вариант «создать», переменная будет создана в блоке, указанном в поле «», если, конечно, в нем еще нет переменной с этим же именем. Если выбран вариант «подписаться», модель попытается получить доступ к переменной с заданными именем и типом в блоке из поля «». При этом, если такой переменной в этом блоке нет, дальнейший поиск производиться не будет. Если выбран вариант «найти и подписаться», модель, как и в предыдущем варианте, сначала попытается получить доступ к заданной переменной в блоке из поля «». Если в нем переменная не будет найдена, модель будет искать ее в родительской подсистеме этого блока. Если ее нет и там, поиск будет осуществляться в ее родительской подсистеме, и т.д. до корневой подсистемы схемы. Наконец, если выбран вариант «все действия – вручную», модель не будет создавать переменную или подписываться на нее (поля ввода «» и «» при этом будут заблокированы). Все действия с переменной в этом случае должны выполняться программистом в реакциях на различные события. Чаще всего этот вариант используется в тех случаях, когда имя динамической переменной формируется программно и его нельзя жестко указать в редакторе модели (пример модели с программным заданием имени переменной приведен в §3.6.8).
Фактически, действия, выполняемые моделью для динамической переменной, определяются сочетанием полей «» и «». Их можно проиллюстрировать следующей таблицей:
| Блок-владелец | ||||
|---|---|---|---|---|
| Этот блок | Подсистема | Система | ||
| Действие | Создать | Переменная будет создана в этом блоке, другие блоки не будут иметь к ней доступа | Переменная будет создана в родительской подсистеме этого блока, ее смогут найти блоки этой же подсистемы и всех вложенных | Переменная будет создана в корневой подсистеме схемы, ее смогут найти все блоки |
| Подписаться | Модель получит доступ к переменной в своем собственном блоке, только если она там есть | Модель получит доступ к переменной в родительской подсистеме своего блока, только если она там есть | Модель получит доступ к переменной в корневой подсистеме схемы, только если она там есть | |
| Найти и подписаться | Модель будет искать переменную начиная с собственного блока вверх по иерархии подсистем | Модель будет искать переменную начиная с родительской подсистемы собственного блока вверх по иерархии подсистем | ||
| Все действия – вручную | Модель не выполняет никаких действий для доступа к переменной или ее создания, в программе для переменной просто создается объект, с которым должен работать сам программист | |||
Следует помнить, что, в отличие от статических переменных, которые создаются вместе с блоком и, с точки зрения модели, существуют всегда, динамические переменные могут появляться и исчезать в процессе работы. Добавление динамической переменной в редакторе модели блока не гарантирует ее существование – блок может не найти переменную с указанными именем и типом в заданной подсистеме. Даже если модели указано создать переменную, RDS может не дать ей сделать это, если переменная с таким именем уже существует в указанной в параметрах подсистеме. Обращение к отсутствующей переменной в программе модели вызовет критическую ошибку, поэтому по умолчанию модуль автокомпиляции автоматически блокирует все вызовы модели, если хотя бы одна из внесенных в список динамических переменных отсутствует. Эту блокировку можно отключить в параметрах модели, но при этом, перед обращением к переменной, необходимо проверять ее существование – пример этого приведен в §3.6.3.1. Переменные, для которых не задано никаких действий, из автоматической проверки существования исключаются, независимо от включения блокировки в параметрах модели.
Нажатие кнопки «» занесет новые параметры переменной в список. Нажатием Ctrl + C выделенную в списке переменную можно скопировать в буфер обмена для последующей вставки в текст программы.