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

Запись S-функций, которые будут включены в сгенерированный код, включает требования, которые выходят за рамки записи S-функций, используемых только для симуляции. Прежде чем вы перейдете к встроенной функции S, убедитесь, что она соответствует требованиям и функциям, как вы ожидаете. Для получения дополнительной информации смотрите S-Функции и Генерация кода. Если ваша S-функция является многоразовой, см. «Составление расписаний на основе времени и генерация кода и моделирование для выполнения многозадачности» и «Проблемы податливости и совместимости группировок скоростей» (Embedded Coder).

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

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

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

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

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

Функциональная или обернутая генерация кода

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

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

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

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

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

Для получения дополнительной информации о переносе смотрите Wrapper Inlined S-Function Примера.

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

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

Примечание

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

Следующий пример иллюстрирует эквивалентность S-функций файлов C MEX и 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 (open) во временную папку.

  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-функции C MEX 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 MEX S-Functions, смотрите Inline C MEX S-Functions.

Встроенные функции ФОРТРАН (F-MEX)

Возможности Fortran MEX S-функций могут быть полностью встроены с помощью целевого файла блока 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 на языке Фортран см. Level-2 разделе Создание S-функций на языке Фортран.

Скомпилируйте код с помощью 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

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

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

Похожие темы