Описание пользователя
Глава 2. Интерфейс пользователя
§2.11. Использование подсистем
§2.11.2. Создание подсистемы и размещение в ней блоков
Рассматривается пример создания в схеме вложенной подсистемы и перемещения в нее части блоков.
Чтобы создать подсистему внутри какой-либо другой подсистемы (корневой или вложенной), нужно, чтобы окно будущей родительской подсистемы было открыто. На свободном месте рабочего поля этого окна следует вызвать контекстное меню нажатием правой кнопки мыши и выбрать в нем пункт «» (см. рис. 194 а), после чего в точке нажатия правой кнопки появится блок новой пустой подсистемы. Теперь можно открыть ее окно и добавлять в нее блоки и связи обычным образом. В интерфейсе RDS не предусмотрена функция, позволяющая автоматически переместить выделенные в какой-либо подсистеме блоки внутрь вложенной подсистемы – чтобы сделать это, необходимо вырезать выделенные блоки в буфер обмена нажатием Ctrl + X, затем создать новую пустую подсистему, открыть ее окно и вставить туда блоки из буфера обмена нажатием Ctrl + V или через контекстное меню. Добавлять внешние входы и выходы, необходимые для связи подсистемы с внешним миром, тоже необходимо вручную.
Чтобы добавить в подсистему внешний вход или выход, необходимо выполнить следующие действия:
- вызвать в выбранной точке рабочего поля подсистемы контекстное меню;
- выбрать в меню пункт «» или «» (см. рис. 199 а);
- открыть окно параметров появившегося блока и указать в нем имя и тип входа или выхода, который будет создан в подсистеме.
После этого можно будет внутри подсистемы присоединять связи к внешнему входу или выходу (они будут иметь единственную переменную с указанными именем и типом), а снаружи – к соответствующим этим блокам переменным блока подсистемы.
Рассмотрим создание подсистемы на примере преобразования схемы «Dynamic.rds», входящей в набор стандартных примеров RDS (см. §2.2), в схему, подобную изображенной на рис. 191. Нам необходимо будет переместить несколько блоков, находящихся в корневой подсистеме схемы, внутрь вложенной подсистемы.
Сначала необходимо загрузить схему «Dynamic.rds», которую мы будем редактировать – все необходимые для этого действия описаны в §2.2. После загрузки схемы на экране откроется окно ее корневой (и единственной) подсистемы, изображенное на рис. 193. Рамкой на рисунке выделены три блока, которые мы будем перемещать внутрь новой подсистемы.
Рис. 193. Окно корневой подсистемы схемы
Сначала создадим в корневой подсистеме новую пустую подсистему. Для этого где-нибудь на свободном месте рабочего поля окна (не важно, где – потом мы сможем переместить созданную подсистему) нажмем правую кнопку мыши и выберем в контекстном меню пункт «» (рис. 194 а). На рабочем поле появится выделенный блок созданной пустой подсистемы. Он автоматически получит имя «Sys1», поскольку в корневой подсистеме схемы еще не было подсистемы с таким именем (если бы она была, число после «Sys» в названии блока было бы выбрано так, чтобы имя созданной подсистемы было уникальным). Пока мы видим только блок подсистемы на рабочем поле, ее окно еще не открыто.

(а)

(б)
Рис. 194. Создание новой пустой подсистемы: выбор пункта контекстного меню (а)
и созданная подсистема (б)
Выделим в корневой подсистеме три блока, которые мы будем перемещать во вложенную. Проще всего выделить их рамкой вместе с частью связей, которые тоже понадобятся нам внутри вложенной подсистемы – для этого нажмем левую кнопку мыши в левом верхнем углу выделяемой прямоугольной области, не отпуская кнопку, переместим курсор в правый нижний угол области и отпустим кнопку (рис. 195 а). Постараемся, чтобы в выделяемую область кроме блоков попали также связи, подключенные к входам «x» и «K» интегратора «Int1» и блока умножения «K» – так нам не нужно будет рисовать их заново внутри вложенной подсистемы. После отпускания кнопки мыши на рабочем поле должны оказаться выделенными блоки и связи, которые мы переместим в подсистему (рис. 195 б). Поля ввода сверху и снизу и блок вычитания слева не должны быть выделены – они остаются в корневой подсистеме.

(а)

(б)
Рис. 195. Выделение блоков и связей рамкой (а), выделенные объекты (б)
Вырежем выделенные объекты в буфер обмена, нажав Ctrl + X – они исчезнут из схемы (рис. 196). Если блоки и связи были выделены так, как изображено на рис. 195, то поля ввода над и под ними окажутся ни с чем не соединенными, а связь, ведущая ко входу «x» колебательного звена «w13dyn1», повиснет в воздухе. Позже мы восстановим соединения, подключив поля ввода, блок вычитания и колебательное звено к созданной подсистеме, но пока это невозможно – у подсистемы еще нет внешних входов и выходов.
Рис. 196. Схема с вырезанными блоками
Для того, чтобы вставить вырезанные блоки в новую подсистему, нужно сначала открыть ее окно. Для этого дважды щелкнем левой кнопкой мыши на блоке «Sys1», и окно созданной ранее подсистемы откроется поверх окна корневой (рис. 197). Для наших целей это окно слишком большое, и его размер можно, при желании, уменьшить.
Рис. 197. Открытое окно созданной подсистемы «Sys1»
Вырезанные нам из корневой подсистемы блоки все еще находятся в буфере обмена – вставим их в окно новой подсистемы. Для этого сначала необходимо сделать так, чтобы окно подсистемы, в которое мы будем вставлять блоки, оказалось на переднем плане. Если мы только что его открыли, оно и так уже на переднем плане, то есть перекрывает все остальные окна RDS. Если же после открытия на передний план вызывалось другое окно, вызвать нужное можно выбрав в пункте «» главного меню RDS пункт «», нажав одноименную кнопку на панели списка открытых окон, или просто щелкнув левой кнопкой мыши по любой видимой части нужного нам окна. Теперь, чтобы вставить блоки из буфера обмена, можно просто нажать Ctrl + V – в этом случае блоки появятся на рабочем поле новой подсистемы по тем же координатам, по которым они находились в момент копирования в буфер обмена. Если же мы хотим точно указать место вставки, можно щелкнуть правой кнопкой мыши в точке, в которой должен размещаться левый верхний угол вставляемого набора блоков, а затем выбрать в контекстном меню пункт «» (рис. 198 а).

(а)

(б)
Рис. 198. Вставка блоков из буфера обмена в выбранной точке (а),
выделенные вставленные блоки (б)
Независимо от того, каким именно способом блоки и связи из буфера обмена были вставлены в окно новой подсистемы, они появятся на ее рабочем поле и станут выделенными (рис. 198 б). Концы связей, соединявших блоки, помещенные нами в буфер, с блоками, оставшимися в корневой подсистеме, повисли в воздухе – нам нужно будет соединить их с внешними входами, которые мы сейчас добавим в подсистему.
Создадим сначала внешний вход для разветвленной связи, подключенной к входам «x» блоков «Int1» и «K». Для этого щелкнем правой кнопкой мыши где-нибудь недалеко от висящего в воздухе конца этой связи и выберем в контекстном меню пункт «» (рис. 199 а). На рабочем поле появится созданный блок-вход с именем «Input1» (рис. 199 б). Имя его переменной и ее тип будут установлены по умолчанию: переменная, как и блок, называется «Input1», а ее тип – вещественный с двойной точностью («double»). Тип переменной нам подходит – по связи, к которой мы будем подключать вход, передается вещественное значение (по смыслу данной схемы – сигнал ошибки следящей системы). Нам нужно только дать переменной внешнего входа имя, более соответствующее назначению связи, чем абстрактное «Input1»: например, «e» – принятое в теории управления обозначение сигнала ошибки.

(а)

(б)
Рис. 199. Создание внешнего входа: выбор пункта контекстного меню (а) и созданный вход (б)
Откроем окно параметров созданного внешнего входа, дважды щелкнув на нем левой кнопкой мыши. Это окно (рис. 200) напоминает окно параметров простого блока – вкладки «», «» и «» у него такие же, но вкладки «» и «» отсутствуют, а вкладка «» существенно отличается.
Рис. 200. Окно параметров внешнего входа
(окно параметров внешнего выхода выглядит точно так же)
Рис. 201. Переименование
переменной
Как и для простого блока, для внешнего входа в окне параметров можно задать имя, комментарий и действия, выполняемые по двойному щелчку в режиме редактирования (при отсутствии у блока модели, а у внешних входов модели встречаются редко, по двойному щелчку можно только открывать окно параметров). Список переменных для внешнего входа задать нельзя – у него всегда есть только одна переменная, тип которой задается на вкладке «» (именно поэтому вкладка «» у него отсутствует). Для переменной на панели «» вводится имя и из выпадающего списка выбирается тип – нам необходимо ввести имя «e», а нужный нам тип «double» уже установлен (рис. 201). После ввода имени переменной имя блока тоже автоматически заменится на «e» – нас это устраивает, поскольку в схеме сразу будет видно, какой переменной подсистемы соответствует этот блок. При желании, имя блока можно изменить на другое, это не приведет к автоматическому переименованию переменной. Можно также ввести произвольный комментарий, поясняющий назначение этого внешнего входа, отделив его от имени переменной пробелом – этот комментарий будет показан в меню подключения связи вместе с именем переменной.
Можно заметить, что под выпадающим списком типа на панели «» много свободного места. Дело в том, что при выборе в списке типов пункта «массив» или «матрица», под ним появится еще один выпадающий список, в котором нужно выбрать тип элемента массива или матрицы. Если в этом списке тоже выбрать пункт «матрица», под ним появится еще один список (получится матрица матриц заданных типов) и т.д. – точно так же задается тип канала в шине.
Прежде чем закрывать окно параметров внешнего входа, скажем несколько слов про его вкладки «», «» и «», которые у внешних входов, выходов и вводов шин (о них идет речь в §2.11.3) используются достаточно редко. Эти вкладки полностью аналогичны одноименным вкладкам окна параметров простого блока (см. §2.9.1). На вкладке «» можно задать способ отображения блока-входа в подсистеме при помощи векторной картинки, прямоугольника с текстом или программного рисования, если у блока есть модель. Чаще всего вид внешних входов и выходов не меняют, оставляя включенное по умолчанию задание векторной картинкой без задания самой картинки – блок при этом изображается стандартной иконкой RDS, которая сама по себе достаточно информативна. Функцию модели (не важно – автокомпилируемую или нет) с внешними входами и выходами тоже чаще всего не связывают: – эта модель не сможет вмешаться в передачу данных через блок, поэтому она может применяться только для каких-либо редко используемых действий, например, при анализе графа схемы программными средствами. Нам ничего этого не нужно, поэтому мы не будем ничего менять на вкладках «», «» и «», и просто закроем окно параметров кнопкой «».
Теперь с внешним входом связана переменная правильного типа с правильными именем. В самом блоке-входе эта переменная будет выходом – вход вводит данные в подсистему, и для всех внутренних блоков переменная будет источником данных, то есть выходом. В блоке подсистемы при этом автоматически создан вход с тем же именем – для всех внешних блоков эта переменная будет получателем данных. Внутри подсистемы мы должны присоединить к созданному входу уже имеющуюся там разветвленную связь, соединив входы блоков «Int1» и «K» с этим входом. Проще всего это сделать, перетащив висящий в воздухе конечный узел связи на изображение блока-входа (рис. 202 а).

(а)

(б)

(в)
Рис. 202. Присоединение связи к внешнему входу: перетаскивание конечного узла связи
на блок (а), указание переменной (б), готовая связь (в)
Для перетаскивания узла нужно нажать на нем левую кнопку мыши и, не отпуская ее, переместить этот узел внутрь внешнего входа (см. §2.7.1). После отпускания кнопки мыши появится меню (рис. 202 б), в котором для обычного блока можно было бы выбрать соединяемую переменную. У внешнего входа переменная всегда единственная, поэтому в этом меню будет единственный пункт: «e». Фактически, у внешнего входа в этом меню нечего выбирать, оно служит только для подтверждения соединения (если закрыть меню, щелкнув мимо него, соединение выполнено не будет) и для показа имени переменной (оно может не соответствовать имени блока). После выбора имени переменной в меню связь подключится к внешнему входу (рис. 202 в).
Теперь нужно создать еще два внешних входа для ввода в подсистему значений с полей ввода, которые были подключены к входам с одинаковыми именами «K» блоков «Int1» и «K» (см. рис. 193). Назовем эти входы «Ki» для блока «Int1» и «Kp» для блока «K». Можно повторить все описанные выше действия (создать внешний вход, открыть окно его параметров, задать нужное имя переменной и оставить установленный по умолчанию тип «double»), а можно просто размножить уже созданный внешний вход, скопировав его в буфер обмена нажатием Ctrl + C и два раза вставив нажатием Ctrl + V, и изменить в окнах параметров блоков-копий имена переменных. Затем необходимо подключить к созданным внешним входам связи, присоединенные ко входам «K» блоков «Int1» и «K»: можно, как и в первом случае, перетащить их конечные узлы на изображения внешних входов, а можно дорисовать их от точки обрыва, нажав на висящем в воздухе узле левую кнопку мыши при нажатой клавише Ctrl, а затем продолжив рисование связи до внешнего входа обычным образом (рис. 203).

(а)

(б)

(в)

(г)
Рис. 203. Продолжение связи до соединения с внешним входом: Ctrl+щелчок на конечном узле (а), щелчок на внешнем входе (б), указание переменной (в), готовая связь (г)
Рис. 204. Все входы
соединены
Теперь все три внешних входа присоединены к блокам внутри подсистемы (рис. 204). Нужно создать внешний выход и соединить его связью с выходом «y» сумматора (круглого перечеркнутого блока в правой части схемы). Внешний выход создается практически так же, как и внешний вход. Следует щелкнуть правой кнопкой мыши где-нибудь правее сумматора (рис. 205 а) и выбрать в контекстном меню пункт «» – на рабочем поле появится новый блок-выход с именем «Output1» (рис. 205 б). Как и у создаваемых внешних входов, переменная у созданного выхода по умолчанию имеет тип «double» – нам это подходит. Нам необходимо дать переменной более подходящее имя: назовем ее «u» (стандартное обозначение сигнала управления). Для этого следует двойным щелчком левой кнопки мыши на изображении созданного внешнего выхода открыть его окно параметров (оно точно такое же, как и у внешнего входа) и ввести на вкладке «» имя переменной «u» (имя блока при этом тоже автоматически изменится на «u»), после чего закрыть окно кнопкой «».
Созданный таким образом блок-выход будет иметь единственную переменную «u», и она будет являться его входом – блок предназначен для передачи данных из подсистемы наружу, поэтому внутри подсистемы его переменная будет получателем данных. В блоке самой подсистемы переменная «u» будет, наоборот, выходом – к ней будут подключаться внешние блоки, получающие данные из подсистемы. Мы создали внешний выход, чтобы вывести наружу данные с сумматора, поэтому выход сумматора «y» необходимо соединить связью с переменной внешнего выхода «u».

(а)

(б)
Рис. 205. Создание внешнего выхода: выбор пункта меню (а)
и созданный блок-выход (б)
Рис. 206. Создание подсистемы завершено
На этом редактирование вложенной подсистемы завершено – если все было сделано правильно, ее окно должно быть похожим на рис. 206. Теперь можно вернуться к редактированию корневой подсистемы, в которой необходимо присоединить созданную подсистему к остальным блокам. Окно вложенной подсистемы при этом можно закрыть, а можно не закрывать, а просто вызвать на передний план окно корневой подсистемы щелчком по любой его точке.
Чтобы восстановить соединения, которые были в схеме до того, как мы выделили три ее блока в отдельную подсистему (см. рис. 193), необходимо присоединить выход «y» блока вычитания (круглый блок с закрашенным нижним сектором) ко входу «e» созданной подсистемы, выходы верхнего и нижнего полей ввода – к ее входам «Ki» и «Kp» соответственно, а выход подсистемы «u» соединить с входом «x» колебательного звена «w13dyn1». Но сначала, чтобы было удобнее проводить соединения, следует перетащить блок созданной нами подсистемы «Sys1» в центр пустого места, оставшегося от вырезанных блоков. Подключение подсистемы к блокам схемы производится точно так же, как и подключение любого другого блока: все процедуры создания связей подробно описываются в §2.7.1. После проведения всех необходимых связей окно корневой подсистемы будет выглядеть так, как на рис. 207. Можно заметить, что имя подсистемы «Sys1», отображаемое под ее квадратной иконкой, перекрывает имя переменной «Kp» рядом со стрелкой подходящей снизу связи. При желании, это можно исправить, либо отключив отображение имени подсистемы (для этого нужно вызвать ее контекстное меню и убрать флажок рядом с пунктом «»), либо перетащив имя переменной «Kp» чуть дальше от стрелки.
Рис. 207. Корневая подсистема после проведения всех связей
Если теперь запустить расчет в этой схеме, то можно будет увидеть, что график выхода следящей системы в точности совпадает с графиком на рис. 21: помещение части блоков в подсистему никак не повлияло на работу схемы.