Можно создать S-функции C MEX, используя любой из следующих подходов:
Рукописная S-функция - с нуля можно написать C MEX S-функцию. (Создание базовой S-функции C MEX представляет собой пошаговый пример.) См. раздел Шаблоны для C S-функций для полной каркасной реализации C MEX S-функции, которую можно использовать в качестве отправной точки для создания собственных S-функций.
S-Function Builder - этот блок интегрирует код C/C + + и строит S-функцию C MEX из спецификаций и фрагментов кода, поставляемых с помощью графического интерфейса пользователя. Это устраняет необходимость записи S-функций с нуля. Дополнительные сведения о построителе S-функций см. в разделе Использование сигнала шины с построителем S-функций для создания S-функции.
Legacy Code Tool - эта утилита создает S-функцию C MEX из существующего кода C и спецификаций, поставляемых с использованием кода MATLAB ®. Дополнительные сведения об интеграции устаревшего кода C в модели Simulink ® см. в разделе Интеграция функций C с помощью устаревшего инструмента кода.
Каждый из этих подходов включает в себя компромисс между простотой записи S-функции и признаками, поддерживаемыми S-функцией. Хотя написанные от руки S-функции поддерживают самый широкий спектр функций, их трудно записать. Блок S-Function Builder упрощает задачу записи C MEX S-функций, но поддерживает меньшее количество функций. Legacy Code Tool обеспечивает самый простой подход к созданию S-функций C MEX из существующего кода C, но поддерживает меньшее количество функций. Дополнительные сведения о функциях и ограничениях каждого из этих подходов к написанию S-функции C MEX см. в разделе Доступные реализации S-функций.
Если у вас есть Simulink Coder™, в дополнение к предыдущим трем подходам, продукт Simulink Coder предоставляет метод генерации C MEX S-функции из графической подсистемы. Если вы новичок в написании C MEX S-функций, вы можете построить части своего приложения в подсистеме Simulink и использовать S-функцию target для преобразования его в S-функцию. Сгенерированные файлы дают представление о том, как конкретные блоки могут быть реализованы в S-функции. Дополнительные сведения и ограничения по использованию цели S-функции см. в разделах Ускорение моделирования, повторное использование кода или Защита интеллектуальной собственности с помощью цели S-функции (Simulink Coder). Можно разработать S-функцию для представления внешнего кода с помощью API, который взаимодействует с механизмом Simulink. Используйте эту S-функцию с генератором кода для создания кода. Для получения подробной информации о различных типах S-функций при генерации кода см. S-Функции и генерация кода (Simulink Coder).
S-функция C MEX должна предоставлять информацию о функции механизму Simulink во время моделирования. По мере моделирования механизм, решатель ОДУ и S-функция C MEX взаимодействуют для выполнения конкретных задач. Эти задачи включают определение начальных условий и характеристик блоков, а также вычисления производных, дискретных состояний и выходных данных.
Как и в случае с S-функциями MATLAB, механизм Simulink взаимодействует с S-функцией C MEX путем вызова методов обратного вызова, реализуемых С-функцией. Каждый способ выполняет предопределенную задачу, такую как вычисление выходных сигналов блока, необходимую для моделирования блока, функциональность которого определяет S-функция. Однако S-функция может свободно выполнять задачу в каждом способе в соответствии с функциональными возможностями, которые реализует S-функция. Например, mdlOutputs метод должен вычислять выходные данные блока в текущее время моделирования. Однако S-функция может вычислять эти выходы любым способом, который подходит для функции. Этот API на основе обратного вызова позволяет создавать S-функции и, следовательно, пользовательские блоки любой требуемой функциональности.
Набор методов обратного вызова, который могут реализовать S-функции C MEX, больше, чем доступный для S-функций MATLAB. S-функции C MEX необходимы для реализации только небольшого подмножества методов обратного вызова в API S-функции. Если блок не реализует определенную функцию, например, матричные сигналы, вы можете опустить методы обратного вызова, необходимые для реализации функции. Это позволяет очень быстро создавать простые блоки.
Общий формат S-функции C MEX показан ниже:
#define S_FUNCTION_NAME your_sfunction_name_here
#define S_FUNCTION_LEVEL 2
#include "simstruc.h"
static void mdlInitializeSizes(SimStruct *S)
{
}
<additional S-function routines/code>
static void mdlTerminate(SimStruct *S)
{
}
#ifdef MATLAB_MEX_FILE /* Is this file being compiled as a
MEX-file? */
#include "simulink.c" /* MEX-file interface mechanism */
#else
#include "cg_sfun.h" /* Code generation registration
function */
#endif
mdlInitializeSizes является первой подпрограммой, вызываемой механизмом Simulink при взаимодействии с S-функцией. Движок впоследствии вызывает другие методы S-функций (все начиная с mdl). В конце моделирования механизм вызывает mdlTerminate.
В этом разделе представлен пример C MEX S-функции, которую можно использовать в качестве модели для создания простых C S-функций. Пример S-функции timestwo.c выводит в два раза его вход.
В следующей модели используется timestwo S-функция для удвоения амплитуды синусоидальной волны и построения её графика в пределах.
![]()
Диалоговое окно блока для S-функции определяет timestwo в качестве имени S-функции; поле параметров пустое.
timestwo S-функция содержит методы обратного вызова S-функции, показанные на этом рисунке. В конце S-функции включите фрагмент кода, как описано в разделе Интерфейсы кодера Simulink/Simulink.

Содержание timestwo.c показаны ниже. Описание кода приводится после примера.
#define S_FUNCTION_NAME timestwo /* Defines and Includes */ #define S_FUNCTION_LEVEL 2 #include "simstruc.h"
static void mdlInitializeSizes(SimStruct *S) { ssSetNumSFcnParams(S, 0); if (ssGetNumSFcnParams(S) != ssGetSFcnParamsCount(S)) { return; /* Parameter mismatch reported by the Simulink engine*/ } if (!ssSetNumInputPorts(S, 1)) return; ssSetInputPortWidth(S, 0, DYNAMICALLY_SIZED); ssSetInputPortDirectFeedThrough(S, 0, 1); if (!ssSetNumOutputPorts(S,1)) return; ssSetOutputPortWidth(S, 0, DYNAMICALLY_SIZED); ssSetNumSampleTimes(S, 1); /* Take care when specifying exception free code - see sfuntmpl.doc */ ssSetOptions(S, SS_OPTION_EXCEPTION_FREE_CODE); }
static void mdlInitializeSampleTimes(SimStruct *S) { ssSetSampleTime(S, 0, INHERITED_SAMPLE_TIME); ssSetOffsetTime(S, 0, 0.0); }
static void mdlOutputs(SimStruct *S, int_T tid) { int_T i; InputRealPtrsType uPtrs = ssGetInputPortRealSignalPtrs(S,0); real_T *y = ssGetOutputPortRealSignal(S,0); int_T width = ssGetOutputPortWidth(S,0); for (i=0; i<width; i++) { *y++ = 2.0 *(*uPtrs[i]); } }
static void mdlTerminate(SimStruct *S){}
#ifdef MATLAB_MEX_FILE /* Is this file being compiled as a MEX-file? */ #include "simulink.c" /* MEX-file interface mechanism */ #else #include "cg_sfun.h" /* Code generation registration function */ #endif
Этот пример состоит из трех частей:
Определяет и включает
Реализация метода обратного вызова
Интерфейсы продуктов Simulink (или Simulink Coder)
Пример начинается со следующего: define заявления.
#define S_FUNCTION_NAME timestwo #define S_FUNCTION_LEVEL 2
Первое define оператор задает имя S-функции (timestwo). Второе define оператор указывает, что S-функция находится в формате Level 2 (дополнительные сведения о Level 1 и Level 2 S-функциях см. в разделе Преобразование Level-1 C MEX S-функций).
После определения этих двух элементов пример включает simstruc.h, который является заголовочным файлом, предоставляющим доступ к SimStruct структура данных и функции прикладного программного интерфейса (API) MATLAB.
#define S_FUNCTION_NAME timestwo #define S_FUNCTION_LEVEL 2 #include "simstruc.h"
simstruc.h файл определяет структуру данных, называемую SimStruct, который механизм Simulink использует для поддержания информации о S-функции. simstruc.h файл также определяет макросы, которые позволяют файлу MEX устанавливать значения в и получать значения (например, входной и выходной сигнал в блоке) из SimStruct (см. раздел О функциях SimStruct).
Следующая часть timestwo S-функция содержит реализации требуемых методов обратного вызова.
Вызов модуля Simulink mdlInitializeSizes для получения информации о количестве входных и выходных портов, размерах портов и любой другой информации (например, о количестве состояний), необходимой для S-функции.
timestwo осуществление mdlInitializeSizes указывает следующую информацию о размере:
Нулевые параметры
Поэтому поле S-function parameters диалогового окна S-Function Block Parameters должно быть пустым. Если он содержит какие-либо параметры, подсистема сообщает о несоответствии параметров.
Один входной порт и один выходной порт
Ширина входного и выходного портов динамически изменяется. Это сообщает механизму, что S-функция может принимать входной сигнал любой ширины. По умолчанию ширина входного и выходного порта динамического размера равна, если S-функция имеет только один входной и выходной порт.
Один образец времени
mdlInitializeSampleTimes метод обратного вызова определяет фактическое значение времени выборки.
Код без исключений
Указание кода без исключений ускоряет выполнение S-функции. При указании этого параметра необходимо соблюдать осторожность. Как правило, если функция S не взаимодействует с средой MATLAB, можно безопасно указать эту опцию. Дополнительные сведения см. в разделе Взаимодействие Simulink Engine с C S-функциями.
Вызов модуля Simulink mdlInitializeSampleTimes для установки времени выборки S-функции. A timestwo блок выполняется всякий раз, когда выполняется управляющий блок. Следовательно, он имеет единственное унаследованное время выборки, INHERITED_SAMPLE_TIME.
Механизм вызывает mdlOutputs на каждом временном шаге для вычисления выходных сигналов блока. timestwo осуществление mdlOutputs умножает входной сигнал на 2 и записывает ответ на выход.
Строка:
InputRealPtrsType uPtrs = ssGetInputPortRealSignalPtrs(S,0);
осуществляет доступ к входному сигналу. ssGetInputPortRealSignalPtrs макрос возвращает вектор указателей, к которому необходимо получить доступ с помощью
*uPtrs[i]
Дополнительные сведения о доступе к входным сигналам см. в разделе Доступ к сигналам с помощью указателей.
Строка:
real_T *y = ssGetOutputPortRealSignal(S,0);
осуществляет доступ к выходному сигналу. ssGetOutputPortRealSignal возвращает указатель на массив, содержащий выходные данные блока.
Строка:
int_T width = ssGetOutputPortWidth(S,0);
получает ширину сигнала, проходящего через блок. S-функция петляет по входам для вычисления выходов.
Механизм вызывает mdlTerminate предоставление S-функции возможности выполнения задач в конце моделирования. Это обязательная процедура S-функции. timestwo S-функция не выполняет каких-либо действий завершения, и эта подпрограмма пуста.
В конце S-функции включите следующий код для присоединения S-функции к продуктам Simulink или Simulink Coder.
#ifdef MATLAB_MEX_FILE #include "simulink.c" #else #include "cg_sfun.h" #endif
Этот трейлер требуется в конце каждой S-функции. Если он опущен, любая попытка компиляции S-функции будет прервана с помощью failure during build of exports file сообщение об ошибке.
Для компиляции этой S-функции введите
mex timestwo.c
в командной строке. mex команда компилирует и связывает timestwo.c с использованием компилятора по умолчанию. mex создает динамически загружаемый исполняемый файл для использования программой Simulink. При наличии нескольких компиляторов, поддерживаемых MATLAB, можно изменить значение по умолчанию с помощью mex -setup команда. См. раздел Изменение компилятора по умолчанию и список поддерживаемых компиляторов.
Результирующий исполняемый файл называется MEX S-функцией, где MEX обозначает «MATLAB Executable». "Расширение файла MEX зависит от платформы. Например, в 32-разрядной системе Microsoft ® Windows ® расширение файла MEX имеет значение .mexw32.