exponenta event banner

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

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

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

Когда к встроенным S-функциям

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

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

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

Создание кода на основе функций или упакованного кода

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

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

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

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

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

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

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

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

Примечание

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

Следующий пример иллюстрирует эквивалентность S-функций файлов C MEX и MATLAB для генерации кода. Файл MATLAB S-функции timestwo.m эквивалентна S-функции C MEX timestwo. Файл TLC для S-функции C MEX 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-функциональным блоком, вызывающим 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-файле и просмотрите изменения, которые появляются в созданном коде. Затем работайте над алгоритмическими изменениями.

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

Встроенные S-функции Fortran (F-MEX)

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

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-функциональный блок в простой модели иллюстрирует интерфейс для встраивания S-функции. После настройки среды Fortran MEX подготовьте код для использования путем компиляции S-функции в рабочей папке вместе с файлом simulink.for из папки matlabroot/simulink/src (открыто). Для получения дополнительной информации о подготовке Вашей среды MEX Фортрана, посмотрите, Создают Уровень 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 S-функция Fortran MEX. Полученный фрагмент кода, специфичный для ftimestwo является

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

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