Описание пользователя
Глава 1. Необходимые сведения об устройстве RDS
§1.5. Динамические переменные
Описываются динамические переменные, которые создаются блоками в процессе работы и автоматически становятся доступными для других блоков. Использование динамических переменных для передачи данных не загромождает схему лишними связями, что иногда может оказаться удобным.
Динамическая переменная программно создается моделью какого-либо блока, после чего другие блоки получают возможность считывать и записывать ее значение – таким образом, блоки могут обмениваться данными без явного проведения связей между ними. В отличие от статических переменных блоков, динамические переменные скрыты от пользователя – просмотреть или ввести их значения и даже просто узнать об их существовании он может только в том случае, если какой-либо блок предоставит ему такую возможность. В некоторых случаях блок позволяет пользователю указать имена динамических переменных, с которыми он работает – например, в окне настроек блока-графика можно указать имя переменной, из которой блок считывает текущее значение времени. Динамические переменные используются разработчиками моделей в тех случаях, когда необходимо организовать передачу одинаковых данных большому количеству блоков, поскольку связи в этом случае загромоздили бы всю схему. Типичный пример таких, необходимых всем, данных – текущее значение системного времени, которое формируется блоком-планировщиком расчета в динамической переменной с именем «DynTime» и считывается оттуда всеми остальными блоками.
Несмотря на то, что пользователю не приходится иметь дело с динамическими переменными напрямую, рассмотрим основные принципы доступа к ним, которые помогут лучше понять работу некоторых блоков.
Любая динамическая переменная связана одновременно с двумя блоками: блоком, в котором она расположена, и блоком, который ее создал, причем чаще всего эти два блока не совпадают. Блок может разместить создаваемую им динамическую переменную в одном из трех следующих блоков:
- в самом себе;
- в своей родительской подсистеме;
- в корневой подсистеме схемы.
Если динамическая переменная расположена в подсистеме, доступ к ней могут получить только блоки, находящиеся в этой же подсистеме, или в подсистемах, вложенных в нее. Если переменная расположена в блоке любого другого типа, доступ к ней сможет получить только этот блок. По этой причине размещение блоком динамической переменной в самом себе используется крайне редко – ее нельзя будет использовать для связи с другими блоками, а для хранения своих личных данных у модели блока есть множество других, более простых, способов. Гораздо чаще используется размещение динамической переменной в родительской подсистеме – в этом случае считывать и записывать ее значение смогут все «соседи» блока по подсистеме, а также блоки на более глубоких уровнях вложенности. При этом блоки в подсистемах выше по иерархии не увидят эту переменную. Такая иерархическая организация области видимости динамических переменных позволяет использовать одинаковые переменные в разных частях схемы: например, можно имитировать разное течение времени во всей схеме и в отдельной ее подсистеме, создав динамические переменные «DynTime» в корневой и в этой отдельной подсистеме и изменять их значения с разной скоростью.
Размещение переменной в корневой подсистеме позволяет дать к ней доступ всем блокам без исключения, поскольку в корневую подсистему вложены все остальные подсистемы и блоки схемы. Чаще всего такие переменные используются для записи каких-либо глобальных значений, общих для всей схемы.
Доступ к динамической переменной организуется программно из модели блока при помощи механизма подписки, который подробно рассматривается в §3.6.3 описания пользователя и §2.6 руководства программиста. Этот механизм, как и создание динамических переменных, скрыт от пользователя, однако некоторые блоки позволяют указать режим подписки: подписка с поиском по иерархии и без такового. При подписке без поиска RDS ищет переменную с заданным именем и типом в указанной (родительской или корневой) подсистеме. Если переменная найдена, блоку предоставляется доступ к ней, если нет, RDS ждет, когда она появится, и сообщает об этом блоку.
Механизм подписки с поиском несколько сложнее – блок получает доступ к первой встреченной динамической переменной с заданным именем и типом на пути от его родительской подсистемы вверх по иерархии: если такая переменная есть в родительской подсистеме, RDS предоставит блоку доступ к ней, если ее нет в родительской, но она присутствует в подсистеме более высокого уровня, RDS найдет ее и сообщит об этом блоку. Если заданной переменной не оказалось ни в одной подсистеме от родительской до корневой, блок получит информацию об отсутствии переменной в схеме. RDS при этом будет ждать появления такой переменной и, как только она будет создана, даст подписавшемуся блоку доступ к ней. Если при поиске с подпиской блок уже получил доступ к какой-то переменной, но после этого переменная с этим же именем и типом была создана в подсистеме ближе по иерархии к запросившему блоку, RDS автоматически переключит этот блок на использование этой, более близкой, переменной. Если после этого близкая переменная будет удалена, RDS снова переключит блок на дальнюю.
Рассмотрим в качестве примера схему, иерархия блоков которой представлена на рис. 12. Корневая подсистема содержит в себе блок «Block1» и подсистемы «Sys1» и «Sys2», подсистема «Sys1» содержит блок «Block2» и подсистемы «Sys3» и «Sys4» и т.д. согласно рисунку. В корневой подсистеме и в подсистеме «Sys2» созданы динамические переменные одинакового типа с одинаковым именем «DynVar1». Каков тип этих переменных и что именно за блоки находятся в подсистемах для данного примера не существенно.
Рис. 12. Области видимости динамических переменных
Среди стандартных блоков RDS также есть блок, основная задача которого – работа с динамической переменной, имя и тип которой задается пользователем. Такие блоки можно использовать для передачи данных между блоками без создания связей (рис. 13).
Рис. 13. Стандартные блоки для работы с динамическими переменными
На рисунке изображен фрагмент схемы, в которой рукоятка и поле ввода подключены к таким блокам, записывающим данные в вещественную переменную «DynVar1» и целую переменную «DynVar2» соответственно. Первая из них может, например, содержать реальное значений какой-либо величины, а вторая – установленное на это значение ограничение. В подсистеме «Sys1» значения этих переменных снимаются с таких же блоков и подаются на два разных входа блока с индикаторной шкалой – реальное значение со входа «Main» изображается стрелкой в центре прибора, а ограничение со входа «Ref» – дополнительной красной линией на шкале.