exponenta event banner

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

Перечисления на языке 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

В диалоговом окне результирующего блока параметр параметризации демпфирования ротора имеет выпадающий список значений:

  • 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
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 для большей ясности.

Связанные темы