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
endclassdef 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.