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

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

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

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

1. В своем Коде С определите структуру путем создания пользовательского файла заголовка. Заголовочный файл содержит 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, чтобы включить пользовательский код С

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

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

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

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

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

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

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

Например, этот пример содержит пользовательскую функцию 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 и структура output outbus.

См. также

(Simulink)

Похожие темы