exponenta event banner

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

В этом примере показано, как использовать структуры из пользовательского кода в диаграмме Stateflow ®. Можно определить типизированные данные структуры в коде C и интегрировать их со структурами Stateflow и сигналами шины Simulink ®. Совместное использование данных с пользовательским кодом позволяет расширить возможности, поддерживаемые Stateflow, и воспользоваться преимуществами существующего кода. Дополнительные сведения см. в разделе Повторное использование пользовательского кода в диаграммах Stateflow.

В этом примере диаграмма Stateflow обрабатывает данные из одного сигнала шины Simulink и выводит результат в другой сигнал шины Simulink. Входной и выходной сигналы шины определяются Simulink.Bus (Simulink) объект COUNTERBUS. На диаграмме сигналы шины Simulink взаимодействуют со структурами Stateflow inbus и outbus. Диаграмма вызывает пользовательскую функцию C для записи в структуру вывода outbus.

Определение пользовательских структур в коде C

1. В коде C определите структуру путем создания пользовательского файла заголовка. Файл заголовка содержит typedef объявления, определяющие свойства пользовательской структуры. Например, в этой модели файл заголовка counterbus.h объявляет три пользовательские структуры:

...
typedef struct {
    int input;
} SIGNALBUS;
typedef struct {
    int upper_saturation_limit;
    int lower_saturation_limit;
} LIMITBUS;
typedef struct {
    SIGNALBUS inputsignal;
    LIMITBUS limits;
} COUNTERBUS;
...

2. В редакторе шины определите Simulink.Bus объект, соответствующий каждой пользовательской структуре typedef объявление. В поле Header file каждого Simulink.Bus введите имя файла заголовка, содержащего соответствующий typedef объявление.

3. Настройте диаграмму Stateflow для включения пользовательского кода C.

4. Создайте и запустите модель.

Передача структур потока состояний пользовательскому коду

При вызове пользовательских функций кода, которые принимают указатели структуры в качестве аргументов, передавайте структуры Stateflow по адресу. Чтобы передать адрес структуры Stateflow или одного из ее полей пользовательской функции, используйте & оператор и точечная нотация:

  • &outbus предоставляет адрес структуры потока состояний outbus.

  • &outbus.inputsignal предоставляет адрес подструктуры inputsignal структуры outbus.

  • &outbus.inputsignal.input предоставляет адрес поля input подструктуры outbus.inputsignal.

Дополнительные сведения см. в разделах Индексирование и назначение значений структурам потока состояний.

Например, этот пример содержит пользовательскую функцию C counterbusFcn который принимает указатели структуры в качестве аргументов. Пользовательский файл заголовка counterbus.h содержит следующее объявление функции:

extern void counterbusFcn(COUNTERBUS *u1, int u2, COUNTERBUS *y1, int *y2);

Диаграмма передает адреса структурам Stateflow counterbus_struct и outbus с помощью этого вызова функции:

counterbusFcn(&counterbus_struct, u2, &outbus, &y2);

Функция считывает значение входного значения диаграммы u2 и локальная структура counterbus_struct. Запись в выходные данные диаграммы y2 и структура вывода outbus.

См. также

(Симулинк)

Связанные темы