Можно создать S-функции MEX C с помощью любого из следующих подходов:
Рукописная S-функция — можно записать S-функцию MEX C с нуля. (Создайте Основную S-функцию MEX C, обеспечивает постепенный пример.) Видят Шаблоны для S-функций C для полной скелетной реализации S-функции MEX C, которую можно использовать в качестве отправной точки для создания собственных S-функций.
Разработчик S-функции — Этот блок интегрирует код C/C++ и создает S-функцию MEX C из спецификаций и фрагментов кода, что вы предоставляете использование графического интерфейса пользователя. Это избавляет от необходимости вас писать S-функции с нуля. Смотрите S-функции Сборки Автоматически для получения дополнительной информации о Разработчике S-функции.
Legacy Code Tool — Эта утилита создает S-функцию MEX C из существующего кода С и спецификаций, что вы предоставляете использование код MATLAB®. Смотрите Интегрируют Функции C Используя Legacy Code Tool для получения дополнительной информации об интеграции устаревшего кода С в модели Simulink®.
Каждый из этих подходов включает компромисс между простотой записи S-функции и функциями, поддерживавшими S-функцией. Несмотря на то, что рукописные S-функции поддерживают самую широкую область значений функций, их может быть трудно записать. Блок S-Function Builder упрощает задачу записи C S-функции MEX, но поддерживает меньше функций. Legacy Code Tool обеспечивает самый легкий подход к созданию C S-функции MEX от существующего кода С, но поддерживает наименьшее количество функций. Смотрите Доступные S-реализации-функции для получения дополнительной информации о функциях и ограничения каждого из этих подходов к записи S-функции MEX C.
Если у вас есть Simulink Coder™, в дополнение к предыдущим трем подходам, продукт Simulink Coder предоставляет метод для генерации S-функции MEX C от графической подсистемы. Если вы плохо знакомы с записью C S-функции MEX, можно создать фрагменты приложения в Подсистеме Simulink и использовать цель S-функции, чтобы преобразовать ее в S-функцию. Сгенерированные файлы обеспечивают понимание о том, как конкретные блоки могут быть реализованы в S-функции. Для получения дополнительной информации и ограничения на использование цели S-функции, смотрите, Ускоряют Симуляцию, Код Повторного использования, или Защищают Интеллектуальную собственность при помощи Цели S-функции (Simulink Coder).
S-функция MEX C должна предоставить информацию о функции к механизму Simulink во время симуляции. В то время как симуляция продолжает, механизм, решатель ОДУ, и S-функция MEX C взаимодействует, чтобы выполнить определенные задачи. Эти задачи включают начальные условия определения и характеристики блока, и вычислительные производные, дискретные состояния и выходные параметры.
Как с S-функциями MATLAB, механизм Simulink взаимодействует с S-функцией MEX C путем вызова методов коллбэка, которые реализует S-функция. Каждый метод выполняет предопределенную задачу, такую как вычислительный блок выходные параметры, требуемые моделировать блок, функциональность которого S-функция задает. Однако S-функция свободна выполнить задачу в каждом методе согласно функциональности реализации S-функции. Например, метод mdlOutputs
должен вычислить блок выходные параметры в текущем времени симуляции. Однако S-функция может вычислить эти выходные параметры в любом случае, который подходит для функции. Этот основанный на коллбэке API позволяет вам создавать S-функции, и следовательно авторские блоки, любой желаемой функциональности.
Набор методов коллбэка, которые могут реализовать S-функции MEX C, больше, чем это доступное для S-функций MATLAB. C S-функции MEX требуются, чтобы реализовывать только небольшое подмножество методов коллбэка в API S-функции. Если ваш блок не реализует конкретную опцию, такую как матричные сигналы, вы свободны не использовать методы коллбэка, должен был реализовать опцию. Это позволяет вам создавать простые блоки очень быстро.
Общий формат S-функции MEX C показывают ниже:
#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
.
Этот раздел представляет пример S-функции MEX C, которую можно использовать в качестве модели для создания простых S-функций C. timestwo.c
S-функции в качестве примера выходные параметры дважды его вход.
Следующая модель использует S-функцию timestwo
, чтобы удвоить амплитуду синусоиды и построить его в осциллографе.
Диалоговое окно блока для S-функции задает timestwo
как S-имя-функции; поле параметров пусто.
S-функция timestwo
содержит методы коллбэка S-функции, показанные в этой фигуре. В конце S-функции включайте фрагмент кода, как описано в Интерфейсы Simulink/Simulink Coder.
Содержимое 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-функция находится в формате Уровня 2 (для получения дополнительной информации о S-функциях Уровня 1 и Уровня 2, смотрите, Преобразовывают S-функции Уровня 1 C MEX).
После определения этих двух элементов пример включает simstruc.h
, который является заголовочным файлом, который предоставляет доступ к структуре данных SimStruct
и Программному интерфейсу приложения MATLAB (API) функции.
#define S_FUNCTION_NAME timestwo #define S_FUNCTION_LEVEL 2 #include "simstruc.h"
Файл simstruc.h
задает структуру данных, названную SimStruct
, что использование механизма Simulink, чтобы поддержать информацию о S-функции. Файл simstruc.h
также задает макросы, которые позволяют вашему файлу MEX установить значения в и добраться, значения (такие как сигнал ввода и вывода к блоку) от SimStruct
(займитесь Функциями SimStruct).
Следующая часть S-функции timestwo
содержит реализации необходимых методов коллбэка.
Механизм Simulink вызывает mdlInitializeSizes
, чтобы справиться о количестве портов ввода и вывода, размерах портов и любой другой информации (таких как количество состояний) необходимый S-функции.
Реализация timestwo
mdlInitializeSizes
указывает следующую информацию размера:
Нулевые параметры
Поэтому поле S-function parameters диалогового окна S-Function Block Parameters должно быть пустым. Если это содержит какие-либо параметры, механизм сообщает о несоответствии параметра.
Один входной порт и один выходной порт
Ширины портов ввода и вывода динамически измерены. Это говорит механизму, что S-функция может принять входной сигнал любой ширины. По умолчанию ширины динамически размерного порта ввода и вывода равны, когда S-функция имеет только один порт ввода и вывода.
Один шаг расчета
Метод коллбэка mdlInitializeSampleTimes
задает фактическое значение шага расчета.
Исключение свободный код
Определение кода без исключений ускоряет выполнение вашей S-функции. Необходимо заботиться при определении этой опции. В целом, если ваша S-функция не взаимодействует со средой MATLAB, можно безопасно задать эту опцию. Для получения дополнительной информации смотрите Взаимодействие Engine Simulink с S-функциями C.
Механизм Simulink вызывает mdlInitializeSampleTimes
, чтобы установить шаги расчета S-функции. Блок 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-функции. S-функция timestwo
не выполняет действий завершения, и эта стандартная программа пуста.
В конце 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
. См. Компилятор Значения по умолчанию Изменения (MATLAB) и список Поддерживаемых Компиляторов.
Получившийся исполняемый файл упоминается как S-функция MEX, где MEX обозначает “Исполняемый файл MATLAB”. Расширение файла MEX отличается от платформы до платформы. Например, в 32-битной системе Microsoft® Windows®, расширением файла MEX является .mexw32
.