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

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.
Сведения о включении пользовательского кода для моделирования см. в разделе Доступ к пользовательскому коду C в небиблиотечных диаграммах.
Сведения о включении пользовательского кода для создания кода см. в разделе Интеграция внешнего кода с использованием параметров конфигурации модели (Simulink Coder).
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.

Simulink.Bus (Симулинк)