Функции объявления

Можно использовать функции объявления для вычисления производных значений параметров или инициализации переменных, вместо того, чтобы делать это внутри setup функция.

Примечание

Начиная с R2019a, используя setup не рекомендуется. Другие конструкции, доступные на Simscape™ языке, позволяют вам достичь тех же результатов без ущерба для возможностей выполнения. Дополнительные сведения см. в разделе настройке не рекомендуется.

Функция объявления является MATLAB® функция, используемая в разделе объявления представителей в файле Simscape. Функцией объявления может быть любая функция MATLAB (даже если она не поддерживается в языке Simscape equations section), включая пользовательские функции на пути MATLAB. Для примера:

component A
  parameters
    p1 = 1;
    p2 = 0;
  end
  parameters(Access = private)
    pDerived = gamma(p1) + p2;
  end
  variables(Access = private)
    vDerived = {value = {my_fcn(p1,p2) + 1, 'm'}, priority = priority.high };
  end
  equations
    ...
  end
end

Используйте Access=private атрибут для объявления представителя, если все аргументы функции объявления не являются постоянными.

Проявляйте осторожность при использовании стойких переменных внутри функции объявления, потому что это может привести к несогласованным результатам для нескольких запусков симуляции.

Множественные возвращаемые значения

Функции объявления могут возвращать несколько значений. Они следуют общим соглашениям о функциях MATLAB для нескольких возвращаемых значений. Для примера, если my_fcn() - функция объявления, которая возвращает три значения:

[id1, ~, id3] = my_fcn();  % omit the second return value
[id1] = my_fcn();  % rules of single assignment apply, nonrequested return values ignored

Действуют следующие ограничения:

  • Вы можете использовать несколько назначений значений в левой части только для параметров и переменных с Access=private атрибут.

  • При пропуске возвращаемых значений с помощью атрибута placeholder (~), по крайней мере, одно значение должно быть присвоено. Пустые объявления приводят к ошибке в языке Simscape.

Ограничение на значения с модулями

Входы и выходы функции объявления должны быть безединичными, то есть иметь модуль '1'. Поэтому вы не можете непосредственно передать значения параметров с модулями качестве входных параметров функции объявления.

Для примера параметра p имеет модули измерения 'm'. Использовать его как вход для myfcn function, использовать value функция, чтобы получить бесчисленное значение параметра.

parameters
      p = {1,'m'}
end
parameters(Access = private)
      pd = my_fcn(value(p,'m'));   % extract unitless value from p
end

В предыдущем примере pd является бесчисленным параметром. Чтобы объявить его как значение с модулем, используйте {value,'unit'} синтаксис, для примера:

      pd = {my_fcn(value(p,'m')),'m/s'};

Для нескольких входных и возвращаемых значений с модулями используйте следующий синтаксис:

      [y_value,z_value] = my_fcn(value(a,'V'),value(b,'V'));
      y = {y_value,'V'};
      z = {z_value,'V'};

Для получения дополнительной информации смотрите Объявление представителя как значения с модулем.

Совместимость во время выполнения

Объявления представителей для параметров и переменных могут включать вызовы функций MATLAB, которые генерируют код.

По умолчанию функция объявления будет оценена во время исполнения, если в ее входных параметрах появится параметр времени выполнения. В противном случае он будет оценен во время компиляции.

В этом примере my_fcn является функцией MATLAB, которая поддерживает генерацию кода:

component A
  parameters
    p1 = 1;
    p2 = 0;
  end
  parameters(Access = private)
    pDerived = my_fcn(p1,p2);
  end
  equations
    ...
  end
end

Если p1 или p2 обозначается как Run-time в диалоговом окне блока, затем my_fcn оценивается во время исполнения, и можно настроить эти значения параметров, не регенерируя код.

Если my_fcn не поддерживает генерацию кода, можно задать атрибут представителя MATLABEvaluation=compiletime, чтобы предотвратить случайное назначение пользователем блока любого из входных параметров функции следующим Run-time в диалоговом окне блока:

component A
  parameters
    p1 = 1;
    p2 = 0;
  end
  parameters(Access = private,MATLABEvaluation = compiletime)
    pDerived = my_fcn(p1,p2);
  end
  equations
    ...
  end
end

Если вы задаете этот атрибут, функция объявления будет оцениваться только во время компиляции, и параметры блоков p1 и p2 будет отмечен как Compile-time только.

Для работы с параметрами во время выполнения:

  • Функция объявления должна находиться в незащищенном файле MATLAB

  • Весь вызываемый код MATLAB должен быть MATLAB Coder™ совместимым

  • Подфункции могут быть в защищенных файлах MATLAB, но использовать их с параметрами времени выполнения:

    • Использование coder.allowpcode('plain')

    • Включите lint: %#codegen

Для получения дополнительной информации см. Раздел «Параметры во время выполнения».