Перечисления

Перечисления на языке Simscape

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.

Похожие темы

Для просмотра документации необходимо авторизоваться на сайте