Вызовите и интегрируйте внешние алгоритмы C в Simulink

Можно вызвать и интегрировать внешний код С в модели Simulink® с помощью блоков C Function. блоки C Function позволяют вам вызывать внешний код С и настраивать интегрирование вашего кода с помощью Output Code, Start Code и панелей Terminate Code в диалоговом окне параметров блоков. Используйте блок C Function для:

  • Вызовите функции от внешнего кода С и настройте код для своих моделей Simulink.

  • Предварительно обработайте данные, чтобы вызвать функцию C и постобработать данные после вызывания функции.

  • Задайте различный код для симуляции и генерации кода.

  • Вызовите несколько функций.

  • Инициализируйте и работайте с персистентными данными, кэшируемыми в блоке.

  • Выделите и освободите память.

Используйте блок C Function, чтобы вызвать внешние алгоритмы C в Simulink, который вы хотите изменить. Чтобы вызвать одну функцию C из модели Simulink, используйте блок C Caller. Чтобы интегрировать динамические системы, которые имеют непрерывные состояния или изменения состояния, используйте блок S-Function.

Следующие примеры используют блоки C Function, чтобы вычислить сумму и среднее значение входных параметров.

Запишите внешние исходные файлы

Начните путем создания внешних исходных файлов.

  1. Создайте заголовочный файл под названием data_array.h.

    /* Define a struct called DataArray */
    typedef struct DataArray_tag {
        /* Define a pointer called pData */
        double* pData;
        /* Define the variable length */
        int length;
    } DataArray;
    
    /* Function declaration */
    double data_sum(DataArray data);

  2. В той же папке создайте новый файл, data_array.c. В этом файле запишите функцию C, которая вычисляет сумму входных чисел.

    #include "data_array.h"
    
    /* Define a function that takes in a struct */
    double data_sum(DataArray data)
    {
        /* Define 2 local variables to use in the function */
        double sum = 0.0;
        int i;
        /* Calculate the sum of values */
        for (i = 0; i < data.length; i++) {
            sum = sum + data.pData[i];
        }
        /* Return the result to the block */
        return sum;
    }

Введите внешний код в Simulink

  1. В новой, пустой модели добавьте блок C Function. Блок C Function находится в библиотеке User-Defined Functions Браузера Библиотеки.

  2. Дважды кликните блок C Function, чтобы открыть диалоговое окно блока. Щелкните, чтобы открыть диалоговое окно Configuration Parameters. В панели Simulation Target задайте свой заголовочный файл под Insert custom C code in generated:> Header file.

  3. Задайте исходный файл под Additional build information> Source files.

    Нажмите OK, чтобы закрыть Параметры конфигурации.

  4. В панели Output Code диалогового окна параметров блоков C Function запишите код, который блок выполняет в процессе моделирования. В этом примере внешняя функция C вычисляет сумму. В панели Output Code запишите код, который вызывает data_array.c функция, чтобы вычислить сумму, затем вычисляет среднее значение.

    /* declare the struct dataArr */
    DataArray dataArr;
    /* store the length and data coming in from the input port */
    dataArr.pData = &data;
    dataArr.length = length;
    
    /* call the function from the external code to calculate sum */
    sum = data_sum(dataArr);
    
    /* calculate the mean */
    mean = sum / length;

    Можно задать код, который запускается в начале симуляции и в конце симуляции в панелях Terminate Code и Start Code.

  5. Используйте таблицу Symbols, чтобы задать символы, используемые во внешнем коде С. Добавьте или удалите символ с помощью кнопок Add и Delete. Задайте все символы, используемые в Output Code, Start Code и панелях Terminate Code, чтобы гарантировать тот, порты отображаются правильно.

    В таблице Symbols задайте следующее.

    • Имя Имя символа в исходном коде.

    • Осциллограф Осциллограф символов и порядка, в котором они появляются. Можно изменить осциллограф символа в любое время.

      • Input — Вводимый символ с блоком C Function.

      • Output — Выведите символ с блоком C Function.

      • Persistent — Задайте символ как персистентные данные.

        Можно задать пустой указатель с помощью Persistent определите объем в блоке C Function. Пустой указатель является указателем, который может сохранить любой тип данных, которые вы создали или выделили.

      • Constant — Задайте символ как постоянный размер значения использования или числовые выражения.

      • Parameter — Задайте символ как параметр. Название параметра задано Label символа.

    • Метка Метка символа. Для символов с их набором осциллографа к Input или Output, эта метка появляется как имя порта на блоке. Для символов с их набором осциллографа к Parameter, эта метка является меткой, которая появляется на маске параметров блоков. Вы не можете задать метку для Persistent символы. Если осциллографом является Constant, метка является константным выражением.

    • Ввод Тип данных символа. Выберите тип данных из выпадающего списка или задайте Simulink.AliasType объект.

    • Размер Размер данных о символе. Блок C Function поддерживает только скаляры, и векторы поддерживаются. Матрицы и массивы более высокой размерности не поддержаны. Можно использовать выражение размера, чтобы задать размер выхода. Используйте -1 наследовать размер.

    • Порт Для символов ввода и вывода, Port указывает на индекс порта на блоке данных о символе. Для символов параметра, Port указывает на порядок, что символ появляется в маске параметров блоков.

    Закройте диалоговое окно параметров блоков. После заполнения данных в таблице блок C Function теперь имеет один входной порт и два выходных порта с метками, заданными в таблице.

  6. Добавьте блок Constant в холст Simulink, который будет входом с блоком C Function. В блоке Constant создайте случайный массив строк с 100 элементами. Чтобы отобразить результаты, присоедините блоки отображения к выходным параметрам блока C Function.

Задайте код симуляции или генерации кода

Можно задать различный выходной код для симуляции и генерацию кода для блока C Function путем определения MATLAB_MEX_FILE. Например, чтобы задать код, который только запускается во время симуляции модели, вы используете следующее.

#ifdef MATLAB_MEX_FILE
/* Enter Sim Code */
#else 
/* Enter code generation code */
#endif

Смотрите также

Функции

Объекты

Блоки