Запись S-функций, которые будут включены в сгенерированный код, включает требования, которые выходят за рамки записи S-функций, используемых только для симуляции. Прежде чем вы перейдете к встроенной функции S, убедитесь, что она соответствует требованиям и функциям, как вы ожидаете. Для получения дополнительной информации смотрите S-Функции и Генерация кода. Если ваша S-функция является многоразовой, см. «Составление расписаний на основе времени и генерация кода и моделирование для выполнения многозадачности» и «Проблемы податливости и совместимости группировок скоростей» (Embedded Coder).
С функциями C MEX S, не-ERT цели поддерживают вызов исходного кода C MEX, если исходный код (.c файл) доступен при входе в фазу сборки. Для S-функций, которые находятся в ФОРТРАН или MATLAB® язык, вы должны встроить их, чтобы иметь полную генерацию кода для Simulink® модели, которые их содержат. Кроме того, как только вы определили, что вы введете S-функцию в строку, вы должны принять решение сделать ее полностью встроенной или обернутой.
Блочный целевой файл для полностью встроенной S-функции является автономным определением того, как встраивать функциональность блока непосредственно в различные фрагменты сгенерированного кода - стартовый код, выходной код и т.д. Этот подход наиболее выгоден, когда существует много режимов и типов данных, поддерживаемых для алгоритмов, которые относительно малы, или когда размер кода не является значительным.
Когда физический размер кода для блока становится слишком большим для вставки, целевой файл блока записывается, чтобы собрать входы, выходы и сделать вызов функции, которую вы записываете, чтобы выполнить функциональность блока. Это имеет преимущество в размере сгенерированного кода, когда код в функции велик или существует много образцов этого блока в модели. Конечно, следует учитывать накладные расходы на вызов функции при взвешивании опции полного встраивания алгоритма блока или генерации вызовов функции.
Если вы принимаете решение пойти с генерацией кода на основе функций, необходимо рассмотреть еще две опции:
Запишите функции один раз, поместите их в .c Файлы и иметь коды TLC BlockTypeSetup метод задает внешние ссылки на ваши функции поддержки. Использовать LibAddToModelSources для имен модулей, содержащих вспомогательные функции. Этот подход обычно выполняется с использованием одной функции на файл, чтобы получить наименьший исполняемый файл.
Запись более сложного файла TLC. В дополнение к таким методам, как Start и Outputs, условно сгенерируйте настраиваемые версии функций (типы данных, ширины, алгоритмы и так далее), в отдельных буферах генерации кода, для записи в отдельный .c файл. Файл должен содержать только функции, используемые этой моделью, вместо всех возможных функций.
Любой из подходов может создать оптимальный код. Первая опция может привести к сотням файлов, если ваша S-функция поддерживает много типов данных, ширины сигнала и вариантов алгоритма. Второй подход написать сложнее, но результаты в более ремонтируемой библиотеке генерации кода, и код могут быть каждый бит таким же плотным, как и первый подход.
Для получения дополнительной информации о переносе смотрите Wrapper Inlined S-Function Примера.
Вы можете встроить функциональность файла 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"
Чтобы попробовать это самостоятельно:
Создайте следующую выборку модели:

Скопируйте файл timestwo.m из папки (open) во временную папку.matlabroot/ toolbox/simulink/simdemos/simfeatures
Скопируйте файл timestwo.tlc из папки (откройте) в ту же временную папку.matlabroot/ toolbox/simulink/simdemos/simfeatures/tlc_c
В MATLAB измените папку (cd) во временную папку и сделать модель Simulink с блоком s-function, который вызывает timestwo.
На вкладке 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 = ×2_B.Gain[0];
real_T *y0 = ×2_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.
Возможности 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 из папки (откройте). Дополнительные сведения о настройке окружения MEX на языке Фортран см. Level-2 разделе Создание S-функций на языке Фортран.matlabroot/ simulink/src
Скомпилируйте код с помощью 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;