Можно создать 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-функцию для получения дополнительной информации о Разработчике 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-функцию, чтобы представлять внешний код с помощью API, который взаимодействует с механизмом Simulink. Используйте эту 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. S-функция в качестве примера timestwo.c
выходные параметры дважды его вход.
Следующая модель использует timestwo
S-функция, чтобы удвоить амплитуду синусоиды и построить его в осциллографе.
Диалоговое окно блока для S-функции задает timestwo
как S-имя-функции; поле параметров пусто.
timestwo
S-функция содержит методы коллбэка 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).
Следующая часть timestwo
S-функция содержит реализации необходимых методов коллбэка.
Механизм 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-функции. 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
команда. См. Компилятор Значения по умолчанию Изменения и список Поддерживаемых Компиляторов.
Получившийся исполняемый файл упоминается как S-функция MEX, где MEX обозначает “Исполняемый файл MATLAB”. Расширение файла MEX варьируется от платформы до платформы. Например, на 32-битной Microsoft® Windows® система, расширением файла MEX является .mexw32
.