Создайте основную S-функцию MEX C

О S-функциях MEX C

Можно создать 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-функции 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 содержит реализации необходимых методов коллбэка.

mdlInitializeSizes

Механизм Simulink вызывает mdlInitializeSizes, чтобы справиться о количестве портов ввода и вывода, размерах портов и любой другой информации (таких как количество состояний) необходимый S-функции.

Реализация timestwo mdlInitializeSizes указывает следующую информацию размера:

  • Нулевые параметры

    Поэтому поле S-function parameters диалогового окна S-Function Block Parameters должно быть пустым. Если это содержит какие-либо параметры, механизм сообщает о несоответствии параметра.

  • Один входной порт и один выходной порт

    Ширины портов ввода и вывода динамически измерены. Это говорит механизму, что S-функция может принять входной сигнал любой ширины. По умолчанию ширины динамически размерного порта ввода и вывода равны, когда S-функция имеет только один порт ввода и вывода.

  • Один шаг расчета

    Метод коллбэка mdlInitializeSampleTimes задает фактическое значение шага расчета.

  • Исключение свободный код

    Определение кода без исключений ускоряет выполнение вашей S-функции. Необходимо заботиться при определении этой опции. В целом, если ваша S-функция не взаимодействует со средой MATLAB, можно безопасно задать эту опцию. Для получения дополнительной информации смотрите Взаимодействие Engine Simulink с S-функциями C.

mdlInitializeSampleTimes

Механизм Simulink вызывает mdlInitializeSampleTimes, чтобы установить шаги расчета S-функции. Блок timestwo выполняется каждый раз, когда ведущий блок выполняется. Поэтому это имеет один наследованный шаг расчета, INHERITED_SAMPLE_TIME.

mdlOutputs

Механизм вызывает 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

Механизм вызывает mdlTerminate, чтобы предоставить S-функции возможность выполнить задачи в конце симуляции. Это - обязательная стандартная программа S-функции. S-функция timestwo не выполняет действий завершения, и эта стандартная программа пуста.

Интерфейсы Simulink/Simulink Coder

В конце 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.

Создание примера Timestwo

Чтобы скомпилировать эту S-функцию, войти

mex timestwo.c

в командной строке. Команда mex компилирует и соединяет файл timestwo.c с помощью компилятора по умолчанию. Команда mex создает динамически загружаемый исполняемый файл для программного обеспечения Simulink, чтобы использовать. Если у вас есть несколько поддерживаемых MATLAB компиляторов, можно изменить значение по умолчанию с помощью команды mex -setup. См. Компилятор Значения по умолчанию Изменения (MATLAB) и список Поддерживаемых Компиляторов.

Получившийся исполняемый файл упоминается как S-функция MEX, где MEX обозначает “Исполняемый файл MATLAB”. Расширение файла MEX отличается от платформы до платформы. Например, в 32-битной системе Microsoft® Windows®, расширением файла MEX является .mexw32.