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

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

Язык 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самый близкий, и 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 для лучшей ясности.

Похожие темы