Встроенные S-функции

Запись S-функций, которые будут включены в сгенерированный код, включает требования, которые идут вне записи S-функций, используемых только для симуляции. Прежде чем вы продолжите встраивать S-функцию, убеждаются, что она удовлетворяет требования и функции, как вы ожидаете. Для получения дополнительной информации смотрите S-функции и Генерацию кода (Simulink Coder). Если ваша S-функция является многоскоростной, смотрите Основанное на времени Планирование и Генерацию кода (Simulink Coder) и Моделирование для Многозадачного Выполнения (Simulink Coder) и Уровень, Группирующий Проблемы соответствия и Проблемы совместимости.

Встроенные S-функции с конечными файлами блока

Когда встроить S-функции

С S-функциями MEX C non-ERT предназначается для поддержки, вызывая исходный C код MEX, если исходный код (файл .c) будет доступен при вводе фазы разработки. Для S-функций, которые находятся на Фортране или языке MATLAB®, необходимо встроить их, чтобы иметь полную генерацию кода для моделей Simulink®, которые содержат их. Кроме того, если вы решили, что встроите S-функцию, необходимо решить сделать ее или полностью встроенной или перенесенной.

Полностью встроенные S-функции

Конечный файл блока для полностью встроенной S-функции является автономным определением того, как встроить функциональность блока непосредственно в различные фрагменты сгенерированного кода — запускают код, выводят код, и т.д. Этот подход является самым выгодным, когда существует много режимов и типов данных, поддержанных для алгоритмов, которые являются относительно маленькими или когда размер кода не является значительным.

Функциональная или перенесенная генерация кода

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

Если вы принимаете решение пойти с функциональной генерацией кода, для еще двух опций нужен фактор:

  • Запишите функции однажды, поместите их в файлы .c и имейте метод BlockTypeSetup кода TLC, задают внешние ссылки на ваши функции поддержки. Используйте LibAddToModelSources для имен модулей, содержащих функции поддержки. Этот подход обычно делается с помощью одной функции на файл, чтобы получить самый маленький возможный исполняемый файл.

  • Запишите более сложный файл TLC. В дополнение к методам, таким как Start и Outputs, условно сгенерируйте настроенные версии функций (типы данных, ширины, алгоритмы, и так далее), в отдельных буферах генерации кода, чтобы быть записанными в отдельный файл .c. Файл должен содержать только функции, используемые этой моделью вместо всех возможных функций.

Любой подход может произвести оптимальный код. Право преимущественной покупки может привести к сотням файлов, если ваша S-функция поддерживает много типов данных, ширин сигнала и выбора алгоритма. Второй подход более трудно записать, но результаты в более удобной в сопровождении библиотеке генерации кода и код могут быть столь же трудными как первый подход.

Для получения дополнительной информации о переносе смотрите Обертку Встроенный Пример S-функции.

Встроенные S-функции файла MATLAB

Можно встроить функциональность S-функций файла MATLAB в сгенерированном коде. Процесс для записи конечного файла блока для S-функции файла MATLAB чрезвычайно идентичен процессу для записи S-функции MEX C.

Примечание

В то время как вы можете полностью встроенный S-функция файла MATLAB, чтобы улучшать производительность, Simulink, Accelerator™ или генератор кода не включают C или API C++ для Математической Библиотеки MATLAB. Вы поэтому не можете вызвать Математические Библиотечные функции MATLAB из файла TLC.

Следующий пример иллюстрирует эквивалентность MEX C и S-функций файла MATLAB для генерации кода. Файл MATLAB S-функции timestwo.m эквивалентен S-функции MEX C timestwo. Файл TLC для S-функции MEX C timestwo работает на файл MATLAB S-функции timestwo.m. TLC независим от типа S-функции, потому что TLC требует только корневого имени S-функции и не ее типа. В случае timestwo одна строка определяет, как генератор кода реализует файл TLC:

%implements "timestwo" "C"

Попробовать это самостоятельно:

  1. Создайте следующую демонстрационную модель:

  2. Скопируйте файл timestwo.m с папки matlabroot/toolbox/simulink/simdemos/simfeatures (открытой) для временной папки.

  3. Скопируйте файл timestwo.tlc с папки matlabroot/toolbox/simulink/simdemos/simfeatures/tlc_c (открытой) для той же временной папки.

  4. В MATLAB, папка изменения (cd) к временной папке и делают модель Simulink с Блоком s-function, который вызывает timestwo.

  5. На вкладке Signal Attributes диалогового окна Inport Block Parameters, установленного параметр Port dimensions на 5.

Simulink использует S-функцию файла MATLAB для симуляции, потому что путь поиска файлов MATLAB находит timestwo.m в текущей папке прежде, чем найти S-функцию MEX C timestwo в matlabpath. Проверьте, какую S-функцию генератор кода использует путем ввода команды MATLAB:

which timestwo

Ответ является S-функцией файла MATLAB timestwo.m во временной папке.

В сгенерированном коде файл timestwo.tlc встраивает S-функцию файла MATLAB.

/* S-Function (timestwo): '<Root>/MATLAB S-Function' */
  /* Multiply input by two */
  {
    int_T i1;
    const real_T *u0 = &times2_B.Gain[0];
    real_T *y0 = &times2_Y.Out1[0];
    for (i1=0; i1 < 5; i1++) {
      y0[i1] = u0[i1] * 2.0;
    }
  }

Вывод является продуктом каждого входа, времена u0[i1] 2.0. Генератор кода использует этот метод Outputs от конечного файла блока, чтобы сгенерировать код:

%function Outputs(block, system) Output
/* %<Type> Block: %<Name> */
  %%
  /* Multiply input by two */
  %assign rollVars = ["U", "Y"]
  %roll idx = RollRegions, lcv = RollThreshold, block, "Roller", rollVars
    %<LibBlockOutputSignal(0, "", lcv, idx)> = \
    %<LibBlockInputSignal(0, "", lcv, idx)> * 2.0;
  %endroll
%endfunction

Измените эти временные копии S-функции файла MATLAB и файла TLC, чтобы видеть, как они взаимодействуют. Начните, только изменив комментарии в файле TLC и смотрите изменения, которые появляются в сгенерированном коде. Затем работайте до алгоритмических изменений.

Для получения дополнительной информации о встраивании C S-функции MEX, смотрите Встроенные S-функции MEX C.

Встройте Фортран (F-MEX) S-функции

Возможности S-функций Фортрана MEX могут быть полностью встроены с помощью конечного файла блока TLC. Этот интерфейс может быть проиллюстрирован с S-функцией Фортрана MEX, которая реализует функцию timestwo. Вот демонстрационный код S-функции Фортрана:

C
C     FTIMESTWO.FOR
C     
C
C     A sample FORTRAN representation of a 
C     timestwo S-function.
C     Copyright 1990-2000 The MathWorks, Inc.
C
C=====================================================
C     Function:  SIZES
C       
C     Abstract:
C       Set the size vector.
C
C       SIZES returns a vector which determines model 
C       characteristics.  This vector contains the 
C       sizes of the state vector and other
C       parameters. More precisely,
C       SIZE(1)  number of continuous states
C       SIZE(2)  number of discrete states
C       SIZE(3)  number of outputs
C       SIZE(4)  number of inputs
C       SIZE(5)  number of discontinuous roots in 
C                the system
C       SIZE(6)  set to 1 if the system has direct 
C                feedthrough of its inputs, 
C                otherwise 0
C
C=====================================================
      SUBROUTINE SIZES(SIZE)
C     .. Array arguments ..
      INTEGER*4        SIZE(*)
C     .. Parameters ..
      INTEGER*4       NSIZES
      PARAMETER       (NSIZES=6)

      SIZE(1) = 0
      SIZE(2) = 0
      SIZE(3) = 1
      SIZE(4) = 1
      SIZE(5) = 0
      SIZE(6) = 1

      RETURN
      END

C
C=====================================================
C     Function:  OUTPUT
C
C     Abstract:  
C       Perform output calculations for continuous 
C       signals.
C=====================================================
C     .. Parameters ..
      SUBROUTINE OUTPUT(T, X, U, Y)
      REAL*8           T
      REAL*8           X(*), U(*), Y(*)

      Y(1) = U(1) * 2.0

      RETURN
      END

C
C=====================================================
C     Stubs for unused functions.
C=====================================================

      SUBROUTINE INITCOND(X0)
      REAL*8           X0(*)
C --- Nothing to do.
      RETURN
      END

      SUBROUTINE DERIVS(T, X, U, DX)
      REAL*8           T, X(*), U(*), DX(*)
C --- Nothing to do.
      RETURN
      END

      SUBROUTINE DSTATES(T, X, U, XNEW)
      REAL*8           T, X(*), U(*), XNEW(*)
C --- Nothing to do.
      RETURN
      END

      SUBROUTINE DOUTPUT(T, X, U, Y)
      REAL*8           T, X(*), U(*), Y(*)
C --- Nothing to do.
      RETURN
      END
      
      SUBROUTINE TSAMPL(T, X, U, TS, OFFSET)
      REAL*8           T,TS,OFFSET,X(*),U(*)
C --- Nothing to do.
      RETURN
      END
      
      SUBROUTINE SINGUL(T, X, U, SING)
      REAL*8           T, X(*), U(*), SING(*)
C --- Nothing to do.
      RETURN
      END

Скопируйте предыдущий код в файл ftimestwo.for в удобной рабочей папке.

Помещение этого в Блок s-function в простой модели проиллюстрирует интерфейс для встраивания S-функции. Если ваша среда Фортрана MEX настраивается, подготовьте код к использованию путем компиляции S-функции в рабочей папке наряду с файлом simulink.for от (открытой) папки matlabroot/simulink/src. Для получения дополнительной информации о подготовке вашей среды Фортрана MEX, смотрите, Создают Уровень 2 S-функции Фортрана (Simulink).

Скомпилируйте код с командой mex в командной строке MATLAB:

mex ftimestwo.for simulink.for

Теперь сошлитесь на этот блок от простого образцового набора с решателем фиксированного шага и целью grt.

Код TLC для встраивания этого блока является измененной формой timestwo.tlc. В вашей рабочей папке создайте файл с именем ftimestwo.tlc и поместите этот код в него.

%implements "ftimestwo" "C"

%function Outputs(block, system) Output
  /* %<Type> Block: %<Name> */
  %%
  /* Multiply input by two */
  %assign rollVars = ["U", "Y"]
  %roll idx = RollRegions, lcv = RollThreshold, block, ... 
"Roller", rollVars
    %<LibBlockOutputSignal(0, "", lcv, idx)> = \
    %<LibBlockInputSignal(0, "", lcv, idx)> * 2.0;
  %endroll
%endfunction

Теперь можно сгенерировать код для S-функции Фортрана ftimestwo MEX. Получившийся фрагмент кода, характерный для ftimestwo,

/* S-Function Block: <Root>/F-MEX S-Function */
  /* Multiply input by two */
  rtB.F_MEX_S_Function = rtB.Gain * 2.0;

Похожие темы