Запись 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;