Пользовательский код повторного использования в диаграммах Stateflow

Можно интегрировать пользовательский код, написанный в C или C++ с помощью Stateflow® графики в Simulink® модели. Путем обмена данными и функции между пользовательским кодом и диаграммой Stateflow, можно увеличить поддержку Stateflow и использовать в своих интересах существующий ранее код.

Интегрируйте пользовательский код С в диаграммах Stateflow

В этом примере показано, как использовать пользовательский код С, чтобы задать константы, переменные и функции, к которым можно получить доступ во всех графиках в модели. Для получения дополнительной информации об интеграции пользовательского Кода С++ в ваших графиках, смотрите доступ к Пользовательскому Коду С++ в диаграммах Stateflow и Генерации Кода С++ и Интегрировании в Stateflow.

В этом примере диаграмма Stateflow вызывает функцию с именем пользовательского кода custom_function. Эта функция читает вход signal графика и локальные данные threshold, сравнивает их значения и возвращает одну из трех пользовательских глобальных констант под названием HIGHСредняя, и LOW. График использует возвращаемое значение, чтобы определить, ли к переходу к новому состоянию после того, как это постепенно увеличит или постепенно уменьшит значение пользовательской переменной под названием custom_var.

Чтобы видеть пользовательский код что этот график доступы, откройте диалоговое окно Model Configuration Parameters и выберите Целевую панель Симуляции.

  • Параметр Заголовочного файла содержит #include оператор, который задает заголовочный файл sf_custom_code_constants_vars_fcns_hdr.h.

  • Параметр Исходного файла задает исходный файл sf_custom_code_constants_vars_fcns_src.c.

Оба из этих файлов расположены в той же папке, которая содержит модель. К файлам пользовательского кода доступа, которые находятся в другой папке, используйте относительные пути. Для получения дополнительной информации смотрите, Задают Относительные пути к Вашему Пользовательскому коду.

Заголовочный файл содержит определения трех глобальных констант и объявлений для глобальной переменной custom_var и функциональный custom_function.

#ifndef SF_CUSTOM_CODE_CONSTANTS_VARS_FCNS_HDR_H
#define SF_CUSTOM_CODE_CONSTANTS_VARS_FCNS_HDR_H
/* Include guard makes ensures that the header file is included 
   only once in the generated code. */

/* Constant definitions shared by the Stateflow chart and custom code*/

#define LOW -1
#define MEDIUM 0
#define HIGH 1

/* extern declaration of the global variable defined in the source file 
   sf_custom_code_constants_vars_fcns_src.c */

extern int custom_var;

/* extern declaration of the custom function defined in the source file 
   sf_custom_code_constants_vars_fcns_src.c */

extern int custom_function(double var1, int var2); 

#endif /* SF_CUSTOM_CODE_CONSTANTS_VARS_FCNS_HDR_H */

Исходный файл устанавливает начальное значение custom_var обнулять и задает функциональный custom_function.

#include "sf_custom_code_constants_vars_fcns_hdr.h"

/* Definition of the global variable */

int custom_var = 0;

/* Definition of the custom function */

int custom_function(double var1, int var2)
{
    if(var1 > var2 + custom_var) {
        return(HIGH);
    }else if(var1 < var2 - custom_var) {
        return(LOW);
    }
    return(MEDIUM);
}

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

Задайте пользовательский код для своей модели

Задайте пользовательский код для симуляции

Чтобы сконфигурировать вашу модель, чтобы получить доступ к пользовательскому коду в процессе моделирования, используйте панель Simulation Target диалогового окна Model Configuration Parameters.

  1. Откройте диалоговое окно Model Configuration Parameters.

  2. Выберите панель Simulation Target.

  3. Задайте свой пользовательский код в подпанелях Additional build information и Insert custom C code in generated.

    • Source file — Введите код, чтобы включать наверху сгенерированного файла исходного кода. Этот код появляется наверху сгенерированного modelC исходный файл, за пределами любой функции. Например, используйте этот параметр, чтобы включать extern int объявления для глобальных переменных. Для получения дополнительной информации смотрите Исходный файл (Simulink).

    • Заголовочный файл Введите код, чтобы включать наверху сгенерированного modelH заголовочный файл, который объявляет пользовательские функции и данные в сгенерированном коде. Код появляется наверху всех сгенерированных файлов исходного кода и отображается ко всему сгенерированному коду. Например, используйте этот параметр, чтобы ввести #define и #include операторы. Когда вы включаете пользовательский заголовочный файл, необходимо заключить имя файла в двойные кавычки. Для получения дополнительной информации смотрите Заголовочный файл (Simulink).

      Примечание

      Поскольку код, который вы задаете в параметре Header file, появляется в нескольких исходных файлах, которые соединяются в один двоичный файл, вы не можете включать определение глобальной переменной, такое как int x или функция с подписью void myfun(void). Эти ошибки соединения причины операторов, потому что их определения символа появляются многократно в исходных файлах сгенерированного кода. Можно, однако, включать extern объявления переменных или функций, таких как extern int x или extern void myfun(void).

    • Initialize function — Введите код, который выполняется однажды в начале симуляции. Используйте этот код, чтобы вызвать функции, которые выделяют память или инициализируют ваш пользовательский код. Для получения дополнительной информации смотрите, Инициализируют функцию (Simulink).

    • Terminate function — Введите код, который выполняется в конце симуляции. Используйте этот код, чтобы вызвать функции, которые освобождают память выделенный пользовательским кодом или выполняют другие задачи очистки. Для получения дополнительной информации смотрите Оконечную функцию (Simulink).

    • Include directories — Введите разделенный пробелом список путей к папкам, которые содержат пользовательские заголовочные файлы, которые вы включаете или непосредственно в параметр Header file или косвенно в скомпилированную цель. Для получения дополнительной информации см. директории Include (Simulink).

    • Source files — Введите список исходных файлов, чтобы скомпилировать и соединиться в цель. Можно разделить исходные файлы запятой, пробелом или новой строкой. Для получения дополнительной информации смотрите Исходные файлы (Simulink).

    • Libraries — Введите разделенный пробелом список статических библиотек, которые содержат код пользовательского объекта, чтобы соединиться в цель. Для получения дополнительной информации смотрите Библиотеки (Simulink).

    • Defines — Введите разделенный пробелом список макроопределений препроцессора, чтобы добавить к сгенерированному коду. Для получения дополнительной информации смотрите, Задает (Simulink).

  4. Если ваша модель содержит графики библиотеки, сконфигурируйте настройки пользовательского кода для каждой модели библиотеки, которая вносит график в вашу модель. Для получения дополнительной информации смотрите, Конфигурируют Пользовательский код в Моделях Библиотеки.

Для получения информации об установке опций симуляции при помощи API командной строки смотрите Установленные Параметры Симуляции Программно.

Задайте пользовательский код для генерации кода

Чтобы сконфигурировать вашу модель, чтобы получить доступ к пользовательскому коду для генерации кода, используйте Code Generation> панель Custom Code диалогового окна Model Configuration Parameters. При генерации кода модель может использовать те же настройки пользовательского кода, которые это использует для симуляции, или используйте уникальные настройки пользовательского кода.

  • Чтобы использовать те же настройки пользовательского кода, используемые для симуляции, выберите Use the same custom code settings as Simulation Target. Укажите, что настройки пользовательского кода в панели Simulation Custom Code как описано в Задают Пользовательский код для Симуляции.

  • Чтобы использовать уникальные настройки пользовательского кода, очистите Use the same custom code settings as Simulation Target. Задайте настройки пользовательского кода для генерации кода в подпанелях Additional build information и Insert custom C code in generated. Для описаний параметров в этих подпанелях смотрите, Задают Пользовательский код для Симуляции.

Для получения дополнительной информации смотрите Использование те же настройки пользовательского кода как Цель Симуляции (Simulink Coder) и Интегрируйте Внешний Код при помощи Параметров конфигурации Модели (Simulink Coder).

The Code Generation Custom Code pane of the Model Configuration Parameters dialog box, showing the same custom code settings specified in the Simulation Target pane.

Вызовите функции пользовательского кода в состояниях и переходах

Можно вызвать функции пользовательского кода от действий любого состояния или перехода или от других функций.

Чтобы вызвать функцию пользовательского кода, используйте подпись, заданную объявлением функции в вашем заголовочном файле. Включайте значение действительного аргумента для каждого формального аргумента в функциональной подписи:

return_val = function_name(arg1,arg2,...)

Примечание

Не совместно используйте данные фиксированной точки между своим пользовательским кодом и своей диаграммой Stateflow.

Задайте относительные пути к своему пользовательскому коду

Когда вы обновляете свою модель или запускаете симуляцию, модель ищет файлы пользовательского кода в этих папках:

  • Текущая папка

  • Папка модели (если эта папка отличается от текущей папки),

  • Пользовательский список папок, которые вы задаете

  • Все папки на MATLAB® путь поиска файлов, исключая папки тулбокса

Можно задать местоположение пользовательского кода при помощи путей относительно одной из этих папок. Например, предположите, что в предыдущем примере вы храните исходные и заголовочные файлы для своего пользовательского кода в подпапках CustomCode/SourceFiles и CustomCode/HeaderFiles из папки модели. Чтобы получить доступ к этим файлам, введите относительные пути подпапок в подпанели Include directories.

The Simulation Target pane of the Model Configuration Parameters dialog box, showing the relative paths to two subfolders.

В качестве альтернативы можно использовать относительные пути, чтобы задать заголовок и исходные файлы индивидуально:

  • В Header file подразделяют на области, введите:

    #include "./CustomCode/HeaderFiles/sf_custom_code_constants_vars_fcns_hdr.h"
  • В Source file подразделяют на области, введите:

    ./CustomCode/HeaderFiles/sf_custom_code_constants_vars_fcns_src.c

Инструкции для синтаксиса относительного пути

Когда вы создаете относительные пути для пользовательского кода, следуете этим инструкциям по синтаксису:

  • Используйте один период (.) указать на начальную точку для относительного пути.

  • Используйте наклонные черты вправо (/) или наклонные черты влево (\) как разделители файлов, независимо от текущей платформы вы используете.

  • Заключите пути в двойные кавычки ("...") если они содержат нестандартные символы пути, такие как пробелы или дефисы (-).

  • Заключите выражения со знаками доллара ($...$) оценивать их в рабочем пространстве MATLAB. Например, предположите тот CustomCodeFolder переменная, которую вы задаете в рабочем пространстве MATLAB как "module1". Если вы задаете свои файлы пользовательского кода с помощью пути .\work\source\$CustomCodeFolder$, затем модель ищет файлы пользовательского кода в папке .\work\source\module1.

Похожие темы

Для просмотра документации необходимо авторизоваться на сайте