Запись S-функций, которые будут включены в сгенерированный код, включает требования, которые идут вне записи S-функций, используемых только для симуляции. Прежде чем вы продолжите встраивать S-функцию, убеждаются, что она удовлетворяет требования и функции, как вы ожидаете. Для получения дополнительной информации смотрите S-функции и Генерацию кода. Если ваша S-функция является многоскоростной, смотрите Основанное на времени Планирование и Генерацию кода и Моделирование для Многозадачного Выполнения и Уровень, Группирующий Проблемы соответствия и Проблемы совместимости.
С S-функциями MEX C non-ERT предназначается для поддержки, вызывая исходный C код MEX если исходный код (.c
файл), доступно при вводе фазы разработки. Для S-функций, которые находятся на Фортране или языке MATLAB®, необходимо встроить их, чтобы иметь полную генерацию кода для моделей Simulink®, которые содержат их. Кроме того, если вы решили, что встроите S-функцию, необходимо решить сделать ее или полностью встроенной или перенесенной.
Конечный файл блока для полностью встроенной S-функции является автономным определением того, как встроить функциональность блока непосредственно в различные фрагменты сгенерированного кода — запускают код, выводят код, и т.д. Этот подход является самым выгодным, когда существует много режимов и типов данных, поддержанных для алгоритмов, которые относительно малы или когда размер кода не является значительным.
Когда физический размер кода для блока становится слишком большим для встраивания, конечный файл блока записан, чтобы собрать входные параметры, выходные параметры и параметры, и позвонить функции, которую вы пишете, чтобы выполнить функциональность блока. Это имеет преимущество в размере сгенерированного кода, когда код в функции является большим или существует много экземпляров этого блока в модели. Конечно, необходимо рассмотреть издержки вызова функции при взвешивании опции полностью встраивания алгоритма блока или вызовов производящей функции.
Если вы принимаете решение пойти с функциональной генерацией кода, для еще двух опций нужен фактор:
Запишите функции однажды, поместите их в .c
файлы, и имеют код TLC BlockTypeSetup
метод задает внешние ссылки на ваши функции поддержки. Использование LibAddToModelSources
для имен модулей, содержащих функции поддержки. Этот подход обычно делается с помощью одной функции на файл, чтобы получить самый маленький возможный исполняемый файл.
Запишите более сложный файл TLC. В дополнение к методам такой как Start
и Outputs
, условно сгенерируйте настроенные версии функций (типы данных, ширины, алгоритмы, и так далее), в отдельных буферах генерации кода, чтобы быть записанными в отдельный .c
файл. Файл должен содержать только функции, используемые этой моделью вместо всех возможных функций.
Любой подход может произвести оптимальный код. Право преимущественной покупки может привести к сотням файлов, если ваша S-функция поддерживает много типов данных, ширин сигнала и выбора алгоритма. Второй подход больше затрудняет запись, но приводит к более удобной в сопровождении библиотеке генерации кода, и код может быть столь же трудным как первый подход.
Для получения дополнительной информации о переносе смотрите Обертку Встроенный Пример S-функции.
Можно встроить функциональность 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"
Попробовать это самостоятельно:
Создайте следующую демонстрационную модель:
Скопируйте файл timestwo.m
от папки
(открытый) для временной папки.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-функцию 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 = ×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 S-функции MEX, смотрите Встроенные S-функции MEX C.
Возможности 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
от папки
открытый. Для получения дополнительной информации о подготовке вашей среды Фортрана MEX, смотрите, Создают Уровень 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
S-функция Фортрана MEX. Получившийся фрагмент кода, характерный для ftimestwo
/* S-Function Block: <Root>/F-MEX S-Function */ /* Multiply input by two */ rtB.F_MEX_S_Function = rtB.Gain * 2.0;