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
В диалоговом окне результирующего блока параметр параметризации демпфирования ротора имеет выпадающий список значений:
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Перечисление используется в объявлении параметра начального режима:
parameters
...
InitMode = switching.open; % Initial Mode
end
Затем, initial в разделе диаграммы режимов используется значение параметра Initial Mode в выражении предиката:
initial OPEN : InitMode <= 0; end
Если параметр Initial Mode имеет значение Switch is open, соответствующий элемент перечисления, open (0), имеет значение 0, и предикат имеет значение true. Поэтому в начале моделирования переключатель открыт.
И наоборот, если значение параметра равно Switch is closed, соответствующий элемент перечисления, closed (1), возвращает значение 1, а предикат имеет значение false. Дополнительные сведения см. в разделе Переключение с гистерезисом.
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
В этом примере параметр block 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 для большей ясности.