Когда вы генерируете пользовательский блок из файла компонента Simscape™, имя блока, а также имена параметров и переменных в диалоговом окне блока получают из элементов файла компонента. Значок блока по умолчанию является прямоугольником с именем блока. Порты основаны на узлах, входах и выходах, определенных в файле компонента.
В следующем примере показан файл компонента с именем spring.ssc
, и результирующие библиотечные блоки и диалоговое окно.
component spring nodes r = foundation.mechanical.rotational.rotational; c = foundation.mechanical.rotational.rotational; end parameters k = { 10, 'N*m/rad' }; end variables theta = { 0, 'rad' }; t = { 0, 'N*m' }; w = { 0, 'rad/s' }; end branches t : r.t -> c.t; end equations assert(k>0) w == r.w - c.w; t == k * theta; w == theta.der; end end
Если вы кликните Source code ссылку, spring.ssc
откроется файл в MATLAB® Окно редактора.
В следующих разделах показано, как аннотировать файл компонента для улучшения косметики блока. Вы можете предоставить значимые имена для самого блока и для его параметров и переменных в диалоговом окне, а также предоставить краткое описание его назначения. Можно также заменить значок пользовательского блока изображением по умолчанию и изменить имена и ориентацию портов по умолчанию.
Чтобы предоставить более описательное имя для блока, чем имя файла компонента, поместите его в отдельную строку с комментариями чуть ниже component
декларация. Начнем строку с комментариями с %
символ. Все содержимое этой линии, следуя %
символ, интерпретируется как имя блока и отображается точно так же в значке блока и в верхней части диалогового окна блока.
Для примера, если у вас есть следующий файл компонента:
component spring %Rotational Spring ... end
это результирующие значок блока и диалоговое окно:
В предыдущем разделе описывается, как строка с комментариями сразу после component
объявление интерпретируется как имя блока. Любые дополнительные комментарии ниже этой линии интерпретируются как описание блока. Вы можете иметь несколько линии с комментариями к описанию. Каждая линия должна содержать не более 80 символов и начинаться с %
символ. Все содержимое комментариев к описанию появится в диалоговом окне блока и в браузере библиотек.
Для примера, если у вас есть следующий файл компонента:
component spring %Rotational Spring % This block implements a simple rotational spring. ... end
это получившееся диалоговое окно блока:
Чтобы создать абзац, пропуск в описании блока, используйте пустую линию с комментариями:
% end of one paragraph % % beginning of the next paragraph
Вы можете задать имя параметров блоков, способ его отображения в диалоговом окне блока, как комментарий сразу после объявления параметра. Он может располагаться на той же линии или на отдельной линии. Комментарий должен начинаться со %
символ.
Для примера, если у вас есть следующий файл компонента:
component spring %Rotational Spring % This block implements a simple rotational spring. ... parameters k = { 10, 'N*m/rad' }; % Spring rate end ... end
это получившееся диалоговое окно блока:
Используйте тот же метод, чтобы задать значимые имена для общих переменных верхнего уровня компонента. Эти переменные появляются на вкладке Variables диалогового окна блока, и присвоение им описательных имен помогает с инициализацией переменной уровня блока перед симуляцией.
Для примера, если у вас есть следующий файл компонента:
component spring %Rotational Spring % This block implements a simple rotational spring. ... variables theta = { value = { 0 , 'rad' }, priority = priority.high }; % Deformation t = { 0, 'N*m' }; % Torque w = { 0, 'rad/s' }; % Angular velocity end ... end
получившаяся Variables вкладка диалогового окна блока выглядит следующим образом:
По умолчанию пользовательский блок, сгенерированный из компонента, имеет все параметры компонента с ExternalAccess=modify
в порядке объявления на одной вкладке, названной Parameters. Если есть переменные с ExternalAccess=modify
диалоговое окно блока также содержит отдельную вкладку Variables. Точно так же в Property Inspector параметры и переменные перечислены в порядке объявления в двух отдельных узлах дерева, Parameters и Variables.
Для сложных компонентов с большим количеством параметров можно улучшить удобство использования блоков, сгруппировав параметры на основе их функции или эффекта, который они моделируют. Например, можно разделить электрические и механические параметры для двигателя или поместить все зависящие от температуры параметры в отдельную группу. Вы делаете это с помощью аннотации размещения блока, UILayout
.
UILayout
аннотация позволяет вам задать заголовочные группы параметров компонента, порядок этих групп и порядок параметров в каждой группе. При развертывании компонента в качестве пользовательского блока Simscape эти группы переводятся на диалоговые вкладки (и в узлы дерева Property Inspector).
Синтаксис аннотации размещения блоков:
annotations UILayout = [UIGroup("Title 1",p1,p2) UIGroup("Title 2",p3)] end
Применяются следующие правила:
UILayout
является аннотацией уровня класса, что означает, что она может появляться только один раз для каждого файла компонента.
UILayout
аннотация должна содержать непустой массив UIGroup
конструкции. Порядок групп определяет порядок расположения диалоговых вкладок.
Каждый UIGroup
конструкция должна включать строку заголовка и непустого списка , разделенного запятыми параметров компонента. Титульная строка служит заголовком вкладки диалогового окна, и перечисленные параметры появляются на этой вкладке в порядке списка.
Параметры компонента с ExternalAccess=modify
не отображается ни в одной из групп в конце первой вкладки в порядке объявления.
Параметр не может принадлежать более чем одной группе. Включение одного и того же параметра в несколько групп приводит к ошибке.
Эта аннотация не влияет на переменные компонента. Независимо от того, используете ли вы аннотацию размещения блоков, переменные перечисляются на отдельной вкладке Variables в порядке объявления.
Используйте аннотацию размещения блоков для:
Создайте несколько вкладок в диалоговом окне блока. Для этого задайте несколько групп параметров. Каждая группа отображается на отдельной вкладке.
Измените порядок параметров в диалоговом окне блока по сравнению с порядком объявления. Для этого задайте одну группу параметров, названную "Parameters"
, и перечислите параметры компонента в желаемом порядке.
Эта функция делает создание источника компонента независимым от полученного размещения блоков. Можно расположить блоки объявления параметров таким образом, чтобы помочь читаемости кода, и позже переупорядочить параметры в интерфейсе блока, по мере необходимости. Подробный пример см. в разделе Использование расширенных методов для настройки отображения блоков.
Блочные порты, как сохраняющие, так и Физический сигнал, основаны на узлах, входах и выходах, определенных в файле компонента. Метка порта по умолчанию соответствует имени узла, входа или выхода, как указано в блоке объявления. Расположение по умолчанию всех портов находится в левой части значка блока. Порты расположены равноудаленно вдоль стороны блока.
Существует два способа управления меткой порта и расположением в значке блока:
Используйте отдельные элементы управления для меток портов и местоположений. Это рекомендуемый способ, поскольку он обеспечивает большую гибкость. Задайте метки портов с помощью комментариев, непосредственно следующих за узлом, входным или выходным объявлением, аналогично указанию значимых имен для параметров и переменных. Определите сторону порта отдельно, используя annotations
раздел в файле компонента. Дополнительные сведения см. в разделах Настройка меток портов на значке блока и Управление расположениями портов с помощью аннотаций.
Используйте комментарии сразу после объявления узла, входа или вывода, чтобы указать имя и местоположение порта блока. Это устаревший метод, который позволяет иметь порты только на двух противоположных сторонах значка блока (слева и справа, или сверху и снизу). Для получения дополнительной информации смотрите Использование комментариев для управления местоположениями портов.
Метка порта по умолчанию соответствует имени узла, входа или выхода, как указано в блоке объявления. Подобно указанию значимых имен для параметров блоков и переменных, можно настроить метку порта, предоставив комментарий сразу после объявления узла, входа или вывода. Для примера:
nodes p = foundation.electrical.electrical; % + n = foundation.electrical.electrical; % - end
Если вы задаете пустую строку комментария после объявления узла, ввода или вывода, соответствующий порт не будет отображать свое имя. Для примера следующий синтаксис подавляет метку порта для порта входа физического сигнала PS
:
inputs PS; % end
Используйте annotations
раздел в файле компонента для определения местоположения портов. Для примера:
nodes H = foundation.thermal.thermal; p = foundation.electrical.electrical; % + n = foundation.electrical.electrical; % - end annotations H : Side = top; p : Side = left; n : Side = right; end
Правила и ограничения:
Можно использовать Side
аннотации для узлов, входов и выходов.
Атрибуты представителей должны быть однозначно определены. Поэтому вы не можете использовать тот же идентификатор представителя в левой части Side
аннотации более одного раза.
nodes p = foundation.electrical.electrical; n = foundation.electrical.electrical; end annotations [p, n] : Side = left; n : Side = right; % error: multiple definitions for 'Side' of port 'n' end
Если вы задаете другие места для одного и того же порта с помощью как аннотаций, так и комментариев, расположение в annotations
раздел имеет приоритет.
outputs o = {0, 'V'}; %o:right end annotations o : Side = top; % annotation takes precedence, so port will be located on the top end
Можно использовать один и тот же идентификатор представителя несколько раз, чтобы объявить различные атрибуты аннотации.
nodes n1 = foundation.electrical.electrical; n2 = foundation.electrical.electrical; n3 = foundation.electrical.electrical; end annotations [n1, n2] : ExternalAccess = none; [n2, n3] : Side = right; end
Точно так же можно объявить различные атрибуты аннотации для того же идентификатора представителя в одном операторе.
nodes n1 = foundation.electrical.electrical; n2 = foundation.electrical.electrical; n3 = foundation.electrical.electrical; end annotations [n1, n2] : ExternalAccess = none, Side = top; n3 : Side = right; end
Вы не можете условно переключать стороны порта, то есть включать Side
аннотации в ветвях условного оператора.
parameters thermal_effects = false; % Model thermal effects? end nodes (ExternalAccess=none) H = foundation.thermal.thermal; end if thermal_effects % Expose thermal port annotations H : ExternalAccess = modify; H : Side = bottom; % error: cannot have 'Side' annotations inside conditional sections end end
Чтобы разместить условно видимый порт на определенной стороне блока (для примера, на нижней), используйте следующий синтаксис:
parameters thermal_effects = false; % Model thermal effects? end nodes (ExternalAccess=none) H = foundation.thermal.thermal; end annotations H : Side = bottom; end if thermal_effects % Expose thermal port annotations H : ExternalAccess = modify; end end
Примечание
Это устаревший метод, который имеет несколько ограничений. Поэтому рекомендуемый метод состоит в том, чтобы использовать annotations
раздел, как описано в разделе «Расположение портов управления с использованием аннотаций».
Можно также использовать комментарий, который сразу же следует за узлом, входным или выходным объявлением, чтобы задать и метку порта, и местоположение. Комментарий может быть в одной линии или в отдельной линии. Комментарий должен начинаться со %
символ и быть форматированным label:location
, где label
- строка, соответствующая имени входного порта в блоке, и location
является одной из следующих строк: left
, right
, top
, bottom
. Вы можете найти все порты либо на одной стороне блока, либо на двух противоположных сторонах, например, слева и справа, либо сверху и снизу. Если требуется сохранить местоположение порта по умолчанию (на левой оси), это местоположение можно исключить.
Можно также оставить поле метки порта пустым и указать только местоположение. В этом случае имя порта не отображается. Например, следующий синтаксис подавляет метку порта и находит ее в верхней части значка блока:
r = foundation.mechanical.rotational.rotational; % :top
Если вы задаете пустую строку комментария после объявления узла, ввода или вывода, соответствующий порт не будет помечен и будет расположен на левой стороне значка блока.
Ниже приведены примеры объявлений узлов и полученных значков блоков.
Синтаксис | Значок блока |
---|---|
nodes r = foundation.mechanical.rotational.rotational; c = foundation.mechanical.rotational.rotational; end |
|
nodes r = foundation.mechanical.rotational.rotational; % rod c = foundation.mechanical.rotational.rotational; % case end |
|
nodes r = foundation.mechanical.rotational.rotational; c = foundation.mechanical.rotational.rotational; % c:right end |
|
nodes r = foundation.mechanical.rotational.rotational; % rod c = foundation.mechanical.rotational.rotational; % case:right end |
|
nodes r = foundation.mechanical.rotational.rotational; % rod c = foundation.mechanical.rotational.rotational; % :right end |
|
nodes r = foundation.mechanical.rotational.rotational; % c = foundation.mechanical.rotational.rotational; % case:right end |
|
Значок блока по умолчанию является прямоугольником с именем блока. Можно заменить этот значок по умолчанию пользовательским файлом изображения. Дополнительные сведения о поддерживаемых форматах файлов и свойствах изображений см. в разделе Поддерживаемые форматы файлов.
Существует два способа задать значок пользовательского блока:
Явное использование annotations
раздел в файле компонента. Это рекомендуемый способ, поскольку он обеспечивает большую гибкость. Можно хранить файлы изображений в отдельной папке и задавать относительные пути для значков блоков. Можно также задать условные пользовательские значки для различных вариантов блока. Для получения дополнительной информации см. раздел «Использование аннотаций».
Неявно использование соглашений об именовании файлов. Этот метод удобен, если вы отправляете полные пакеты библиотеки клиентам. Дополнительные сведения см. в разделе Использование соглашений об именовании файлов.
Используйте annotations
раздел в файле компонента, чтобы задать имя значка пользовательского блока. Имя файла должно содержать расширение файла. Для примера:
annotations Icon = 'custom_spring.jpg'; end
Имя файла может включать относительный путь из папки, содержащей файл компонента, в папку, содержащую файл изображения, например:
annotations Icon = '../../block_icons/custom_spring.jpg'; end
The annotations
также позволяет задавать условные пользовательские значки. Это особенно полезно, если количество портов изменяется для различных вариантов. Для примера:
component MyPipe parameters thermal_variant = false; % Model thermal effects? end if thermal_variant % Use icon with additional thermal port annotations Icon = 'pipe_thermal.jpg'; end else % Use regular icon, with two fluid ports annotations Icon = 'pipe.jpg'; end end [...] % Other parameters, variables, nodes, branches, equations end
Вместо явного задания значка пользовательского блока с помощью annotations
раздел можно сделать неявно, поместив файл изображения с таким же именем, как и компонент, в папку, содержащую файл компонента.
Этот метод удобен, если вы отправляете полные пакеты библиотеки клиентам. Для примера, если подпакет, содержащий файл компонента spring.ssc
также содержит файл с именем spring.jpg
затем этот файл изображений автоматически используется для значка, представляющего этот блок в пользовательской библиотеке.
Неявные правила использования пользовательских значков блоков:
Если на annotations
раздел явным образом не задает пользовательское изображение значка, или если это изображение не найдено, программа просматривает в папке, содержащей файл компонента, файл изображения с таким же именем, как и компонент.
Если существует несколько файлов изображений с одним и тем же именем, форматы имеют приоритет в порядке, указанном в Поддерживаемые Форматы Файлов. Для примера, если подпакет содержит оба spring.jpg
и spring.bmp
, spring.jpg
- изображение, которое появится в пользовательской библиотеке.
Для пользовательских значков блоков поддерживаются следующие форматы файлов изображений:
svg
jpg
bmp
png
Внимание
Использование svg
формат вместе с доменными стилями линии может привести к неожиданным результатам, потому что области стилей линии и цвета могут распространяться на части значка пользовательского блока. Для получения дополнительной информации о включении и выключении стилей линии для конкретного домена, смотрите Стили линии для конкретного домена.
Тип изображения должен быть изображением RGB (truecolor), сохраненным как m
-by- n
-by-3 массив данных. Для получения дополнительной информации см. RGB (Truecolor) Изображения.
Когда вы используете файл изображения для представления компонента в библиотеке пользовательских блоков, следующий синтаксис файла компонента позволяет вам задать свойства масштабирования и поворота файла изображения:
component name % [ CustomName [ : scale [ : rotation ] ] ] ...
где
| Имя компонента |
| Настраиваемое имя блока, заданное как описано в разделе «Настройка имени блока». Удаляются начальные и конечные белые пространства. |
| Скалярное число, например Вы не можете задать выражения MATLAB для шкалы, просто числа. |
| Определяет, поворачивается ли значок блока вместе с блоком:
|
Для примера, следующий синтаксис
component spring % Rotational Spring : 0.5 : fixed
задает, что размер изображения пружины масштабируется до половины размера по умолчанию и всегда остается в ориентации по умолчанию, независимо от поворота блока.