Создайте основную 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-функцию, чтобы представлять внешний код с помощью 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-функции 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-функция содержит реализации необходимых методов коллбэка.

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-функции. timestwo S-функция не выполняет действий завершения, и эта стандартная программа пуста.

Интерфейсы 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.