Язык Simscape™ поддерживает перечисления MATLAB® в:
Параметры компонента
Переменные события и пункты when
Предикаты уравнения
Условные предикаты объявления
Аргументы функции (такие как метод интерполяции в tablelookup
)
Графики режима
Вы задаете перечисления с помощью класса перечисления MATLAB. Для получения дополнительной информации смотрите Перечисления (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
. Поэтому, когда используется в математических выражениях, участники перечисления преобразовывают в целые числа согласно заданному значению. Например, Переключатель с Гистерезисным компонентом использует это перечисление:
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
графика режима использует значение параметров Initial Mode в выражении предиката:
initial OPEN : InitMode <= 0; end
Когда значением параметров Initial Mode является Switch is open
, соответствующий участник перечисления, open (0)
, оценивает к 0, и предикат верен. Поэтому в начале симуляции переключатель открыт.
С другой стороны, когда значением параметров является Switch is closed
, соответствующий участник перечисления, closed (1)
, оценивает к 1, и предикат является ложным. Для получения дополнительной информации смотрите Переключатель с Гистерезисом.
when
Предыдущие разделы, обсужденные с помощью перечислений, чтобы объявить параметры компонента с дискретным набором приемлемых значений. Однако можно также использовать перечисления, чтобы объявить переменные события, потому что у них также есть дискретное множество значений.
Переменные события являются кусочной константой, то есть, они изменяют значения только в моменты события (при помощи пункта when
) и сохраняют их значения постоянными между событиями.
Например:
variables (Event = true) x = myEnum.a; end events when edge(time > {1.0, 's'}) x = myEnum.b; end end
Переключатель с Гистерезисным компонентом показывает пример использования перечислимого параметра в предикате графика режима.
Другая хорошая практика использует перечисленные параметры в условных предикатах объявления к вариантам блока define. Например, у вас может быть два варианта канала, тот, который составляет резистивные свойства только и второе что также сжимаемость жидкости моделей:
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
Первый идентификатор в блоке перечисления с данным целочисленным значением является фактическим идентификатором, и последующие идентификаторы являются псевдонимами.
Несмотря на то, что несколько идентификаторов с тем же целочисленным значением позволены, MathWorks рекомендует использовать уникальные целочисленные значения в наборе перечисления языка Simscape для лучшей ясности.