Simscape™ язык поддерживает MATLAB® перечисления в:
Параметры компонента
Переменные и when
события пункты
Предикаты уравнения
Условные предикаты объявления
Аргументы функции (такие как метод интерполяции в tablelookup
)
Режимные графики
Перечисления задаются с помощью класса перечисления MATLAB. Для получения дополнительной информации см. «Перечисления».
Класс перечисления должен быть выведен из int32
тип, например:
classdef offon < int32 enumeration off (0) on (1) end end
Сохраните определение класса перечисления в файле .m с таким же именем, как и класс. Для получения дополнительной информации см. раздел «Правила и ограничения».
Затем можно использовать этот перечисление в параметре компонента:
parameters fl_c = offon.off; % Fluid compressibility end
В получившемся блоке диалоговом окне параметр Fluid compressibility будет иметь выпадающий список значений, off
и on
, с off
как значение по умолчанию.
При использовании перечислений в параметрах компонента можно задать удобные для пользователя строки, которые будут отображаться в диалоговом окне блока, вместо идентификаторов представителей:
classdef damping < int32 enumeration direct (0) derived (1) end methods(Static) function map = displayText() map = containers.Map; map('direct') = 'By damping value'; map('derived') = 'By no-load current'; end end end
Затем можно использовать этот перечисление в параметре компонента, например:
parameters r_damp = damping.direct; % Rotor damping parameterization end
В получившемся блоке диалоговом окне параметр Rotor damping parameterization имеет раскрывающийся список значений:
By damping value
By no-load current
By damping value
является значением по умолчанию.
Подробный пример использования перечисления с отображаемыми строками в параметре компонента см. в разделе Использование расширенных методов для настройки отображения блоков.
Если класс перечисления происходит от встроенного числового класса, подкласс наследует упорядоченное расположение и арифметические операции, которые можно применить к перечисленным именам. Классы перечисления, используемые в языке Simscape, должны происходить из int32
тип. Поэтому при использовании в математических выражениях представители перечисления преобразуются в целые числа согласно заданному значению. Для примера компонент Switch with Hysteresis использует это перечисление:
classdef switching < int32 enumeration open (0) closed (1) end methods(Static) function map = displayText() map = containers.Map; map('open') = 'Switch is open'; map('closed') = 'Switch is closed'; end end end
Перечисление используется в объявлении параметра Initial Mode:
parameters ... InitMode = switching.open; % Initial Mode end
Затем, initial
раздел mode графика использует Initial Mode значения параметров в предикатном выражении:
initial OPEN : InitMode <= 0; end
Когда Initial Mode значения параметров Switch is open
, соответствующий представитель перечисления, open (0)
, вычисляет значение 0, и предикат равен true. Поэтому в начале симуляции переключатель открыт.
Наоборот, когда значение параметров Switch is closed
, соответствующий представитель перечисления, closed (1)
, вычисляет значение 1, и предикат ложен. Для получения дополнительной информации смотрите Switch with Hysteresis.
when
ПунктыВ предыдущих разделах обсуждалось использование перечислений для объявления параметров компонента с множеством приемлемых значений. Однако можно также использовать перечисления для объявления переменных события, потому что они также имеют множество значений.
Переменные события являются кусочно-постоянными, то есть они изменяют значения только в моменты событий (при помощи when
пункт) и сохранить их значения постоянными между событиями.
Для примера:
variables (Event = true) x = myEnum.a; end events when edge(time > {1.0, 's'}) x = myEnum.b; end end
Компонент Switch with Hysteresis показывает пример использования перечисленного параметра в режиме графика предиката.
Другой хорошей практикой является использование перечисленных параметров в предикатах условного объявления, чтобы задать варианты блоков. Для примера можно иметь два варианта трубопровода, один, который учитывает только гидравлические сопротивления, и второй, который также модели сжимаемость жидкости:
component MyPipe parameters fl_c = offon.off; % Fluid compressibility end [...] % other parameters, variables, branches if fl_c == offon.off equations % first set of equations, resistive properties only end else variables % additional variable declarations, needed to account for fluid compressibility end equations % second set of equations, including fluid compressibility end end end
В этом примере параметров блоков Fluid compressibility использует offon
перечисление:
classdef offon < int32 enumeration off (0) on (1) end end
В получившемся блоке диалоговом окне параметр Fluid compressibility имеет раскрывающийся список значений, off
и on
, с off
как значение по умолчанию. Если для параметра задано значение off
первый набор уравнений активируется, и блок моделей только гидравлические сопротивления трубопровода. Если пользователь блока изменяет значение параметра, то else
ветвь активируется, и скомпилированная модель включает дополнительные переменные и уравнения, которые учитывают сжимаемость жидкости. Для получения дополнительной информации об определении вариантов блока см. Раздел «Определение вариантов компонента».
Точно так же можно использовать перечисленные параметры и переменные события в уравнениях:
parameters p = myEnum.a; end variables x = 0; y = 0; end equations if p == myEnum.a y == x * 100; elseif p == myEnum.b y == x * 0.01; else % (p == myEnum.c) y == x; end end
Другой способ использования перечислений - в аргументах функции. Для примера, tablelookup
функция имеет два метода интерполяции, linear
и smooth
и три метода экстраполяции, linear
, nearest
, и error
.
Библиотека Foundation включает встроенные перечисления, interpolation.m
и extrapolation.m
:
classdef interpolation < int32 enumeration linear (1) smooth (2) end methods(Static) function map = displayText() map = containers.Map; map('linear') = 'Linear'; map('smooth') = 'Smooth'; end end end
classdef extrapolation < int32 enumeration linear (1) nearest (2) error (3) end methods(Static) function map = displayText() map = containers.Map; map('linear') = 'Linear'; map('nearest') = 'Nearest'; map('error') = 'Error'; end end end
Эти перечисления находятся в директории matlabroot
\toolbox\physmod\simscape\library\m\+simscape\+enum
.
Можно использовать эти перечисления, чтобы объявить параметры компонента, а затем использовать эти параметры в качестве аргументов функции:
parameters interp = simscape.enum.interpolation.linear; % Interpolation method extrap = simscape.enum.extrapolation.linear; % Extrapolation method end equations o == tablelookup(xd, yd, x, interpolation = interp_method, extrapolation = extrap_method); end
Вместо предоставления полных имен можно использовать import
оператор для уменьшения объема набора текста:
import simscape.enum.* ... parameters interp = interpolation.linear; % Interpolation method extrap = extrapolation.linear; % Extrapolation method end equations o == tablelookup(xd, yd, x, interpolation = interp, extrapolation = extrap); end
Определения перечислений являются глобальными. Вы задаете перечисление один раз, в отдельном файле, и можете затем использовать одно и то же перечисление в нескольких компонентах.
Файл, содержащий определение класса перечисления, должен находиться в пути MATLAB или в директории пакета. Для получения дополнительной информации о директориях пакета см. Раздел «Организация файлов Simscape».
Параметры, которые имеют перечисленные значения, помечены как Compile-time
только в диалоговых окнах блоков.
Подобно перечислениям MATLAB, можно задать более одного идентификатора для одного и того же целого значения, например:
classdef myColor < int32 enumeration red (0) blue (1) yellow (2) green (0) end end
Первый идентификатор в блоке перечисления с заданным целым значением является фактическим идентификатором, а последующие идентификаторы являются псевдонимами.
Примечание
Несмотря на то, что допускается использование нескольких идентификаторов с одним и тем же целым значением, для большей ясности рекомендуется использовать уникальные целочисленные значения в наборе перечисления языка Simscape.