Создайте основную 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.

Содержимое 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-параметров-функции диалогового окна 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

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

Была ли эта тема полезной?