Описание пользователя
Глава 1. Необходимые сведения об устройстве RDS
§1.6. Коротко о других способах взаимодействия блоков
Описываются скрытые от пользователя механизмы, позволяющий блокам обращаться друг к другу минуя связи и динамические переменные, а также обмениваться данными с другими приложениями Windows. Подробно они рассматриваются в руководстве программиста, а здесь дается их краткий обзор.
Помимо передачи данных по связям и через динамические переменные, у блоков есть и другие возможности общаться друг с другом. В то время, как связи создаются пользователем и явно видны ему, динамические переменные и другие способы взаимодействия, как правило, скрыты от пользователя, если только разработчик блока не включит управление ими в пользовательский интерфейс блока. Например, окно настройки блоков работы с динамическими переменными, изображенных на рис. 13, позволяют задавать имя переменной и ее тип. Несмотря на то, что пользователь непосредственно не работает с большинством из альтернативных способов передачи данных между блоками, ему необходимо знать, что взаимодействие блоков в схеме может не ограничиваться связями, которые он видит, и в общих чертах представлять себе возможности этих блоков.
Самый распространенный, помимо использования связей и динамических переменных, способ передачи данных от одного блока к другому – это непосредственный вызов модели одного блока из модели другого. В RDS он называется вызовом функции блока, его механизм подробно рассматривается в §3.6.13 описания пользователя и §2.13 руководства программиста. Коротко его можно описать следующим образом: программист, создавший блок, который может выполнить какую-либо потенциально полезную для других блоков функцию, дает этой функции уникальное текстовое имя и вставляет в модель своего блока специальный вызов, заявляющий RDS о существовании и имени этой функции (в терминах RDS – регистрирующий эту функцию). После этого другие программисты, зная имя функции, могут вставлять в модели своих блоков запросы на ее выполнение как у какого-либо конкретного блока, так и у всех блоков, которые могут ее выполнять в данной подсистеме или во всей схеме. При желании, пользователь может увидеть все имена функций, зарегистрированных блоками загруженной в данный момент схемы, на вкладке «функции блоков» окна информации о системе, но он не может повлиять на вызов и выполнение этих функций – их имена и выполняемые ими действия жестко закладываются в программы блоков их создателями.
В качестве примера функции, поддерживаемой многими стандартными блоками, можно привести функцию с именем «Common.ControlValueChanged». Обычно ее поддержка реализуется разработчиками различных блоков пользовательского интерфейса – кнопок, полей ввода, рукояток и т.п. Вызов этой функции заставляет блок немедленно считать данные со своих входов, если они у него есть, изменить свое внутреннее состояние согласно полученным значениям (например, переместить рукоятку в новое положение), выдать эти же значения на выходы и вызвать у всех присоединенных блоков эту же функцию. Именно за счет этой функции блоки пользовательского интерфейса можно соединять в цепочки и кольца, работающие не только в режиме расчета, но и в режиме моделирования (см. рис. 5). В режиме моделирования передача данных по связям и автоматический запуск моделей блоков не производится, но, за счет принудительной активации выходных связей и вызова функции «Common.ControlValueChanged» у всех соединенных блоков, введенное пользователем значение распространяется по цепочке.
Рис. 14. Сообщение, выводимое
блоком обработки ошибок (слева)
при делении на ноль
Другим примером широко используемой функции может служить «Common.MathError» – эту функцию выполняют блоки, предназначенные для обработки ошибок математических вычислений. Такой блок помещается в схему (рис. 14, квадратный блок с красной буквой «Е» в левой части рисунка), после чего при возникновении математической ошибки где-либо в той же подсистеме или в одной из вложенных, блок, обнаруживший ошибку, находит блок-обработчик и вызывает его функцию, передавая ему свое имя и описание ошибки. Обработчик, в свою очередь, выполняет предусмотренные программистом действия – например, останавливает расчет и выводит пользователю сообщение, как на рис. 14. Без использования вызова функции блока пришлось бы либо предусматривать во всех блоках специальный выход ошибки и соединять его с блоком-обработчиком связями, что загромоздило бы схему, либо встраивать реакцию на математические ошибки в каждый блок, что сделало бы эту реакцию жесткой. Сейчас, заменив блок-обработчик на другой, можно изменить реакцию на ошибки во всей обслуживаемой им части схемы. Механизм, с помощью которого блоки находят обслуживающий их обработчик, подробно описан в §3.6.13.4 описания пользователя и §2.13.6 руководства программиста
Поскольку модель любого блока в RDS является функцией в динамически подключаемой библиотеке (DLL), которая обычно пишется на каком-либо языке высокого уровня, возможности блоков по взаимодействию с различными объектами за пределами RDS ограничены только знаниями программиста-разработчика: ему доступны все функции Windows API. Например, не так уж сложно создать блоки, которые будут передавать и принимать данные по сети, взаимодействовать с другими приложениями и т.п. Для облегчения жизни программисту в RDS встроены механизмы, стандартизующие некоторые действия по обмену с внешним миром – в частности, обмен данными между блоками по сети и работу схемы под управлением другого приложения Windows.
Встроенный в RDS механизм обмена данными по сети подробно описан в §2.15 руководства программиста. Пользователь имеет с ним дело, в основном, через стандартные сетевые блоки, использующие этот механизм. Эти блоки позволяют, назначив одну из машин в сети сервером RDS, передавать в этой сети данные между схемами, загруженными на разных машинах, просто подавая эти данные на входы блоков и снимая их с выходов (рис. 15).
Рис. 15. Передача по сети вещественного числа при помощи стандартных блоков
Поскольку передаваемых данных может быть много и они могут иметь разные типы, передача осуществляется через каналы сервера RDS, каждому из которых дается произвольное имя. Число каналов не ограничено. С точки зрения пользователя, он просто подключает связь к входу одного из сетевых блоков на одной из машин и указывает в его настройках имя канала. Затем на других машинах он добавляет в схему сетевой блок, вводит его настройках это же самое имя канала, и снимает значение с выхода блока. Передача данных между машинами не однонаправленная – одна и та же схема может служить и передатчиком, и приемником данных. Кроме ввода имени канала в настройках блока, пользователь не может повлиять на передачу данных по сети. Однако, при желании, в настройках RDS он может вообще запретить сетевую активность схем на какой-либо машине или ограничить список сетевых адресов, с которыми разрешено взаимодействие. Пользователь может также просмотреть список других машин, подключившихся к данной машине, и список каналов сервера в окне сетевых соединений.