Можно задать пользовательские структуры в коде С, который можно интегрировать с графиком Stateflow® в модели Simulink® для симуляции и генерации кода. Например, модель sf_bus_demo
использует пользовательскую функцию C, чтобы записать в выходную структуру outbus
. Путем обмена данными с пользовательским кодом можно увеличить возможности, поддержанные Stateflow, и использовать в своих интересах существующий ранее код. Для получения дополнительной информации см. Пользовательский код Повторного использования в диаграммах Stateflow и доступе к Сигналам Шины Через Структуры Stateflow.
В вашем коде С задайте структуру путем создания пользовательского заголовочного файла. Заголовочный файл содержит объявления typedef
, совпадающие со свойствами объекта Simulink.Bus
, который задает структуру Stateflow. Например, в модели sfbus_demo
, заголовочный файл 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; ...
В Редакторе Шины задайте объект Simulink.Bus
, который совпадает с каждой пользовательской структурой объявление typedef
. В поле Header file каждого объекта Simulink.Bus
введите имя заголовочного файла, который содержит соответствующее объявление typedef
.
Сконфигурируйте свой график языка действия C, чтобы включать пользовательский код С.
Чтобы включать пользовательский код для симуляции, смотрите доступ к Пользовательскому коду С в Графиках Небиблиотеки.
Чтобы включать пользовательский код для генерации кода, смотрите, Интегрируют Внешний Код при помощи Образцовых Параметров конфигурации (Simulink Coder).
Создайте и запустите свою модель.
Когда вы пишете функции пользовательского кода, которые берут указатели структуры в качестве аргументов, передают структуры Stateflow адресом. Чтобы передать адрес структуры Stateflow или одно из ее полей к пользовательской функции, используйте оператор &
и запись через точку:
&outbus
обеспечивает адрес структуры Stateflow outbus
.
&outbus.inputsignal
обеспечивает адрес подструктуры inputsignal
структуры outbus
.
&outbus.inputsignal.input
обеспечивает адрес поля input
подструктуры outbus.inputsignal
.
Для получения дополнительной информации смотрите Индексные Подструктуры и Поля.
Например, модель sfbus_demo
содержит пользовательскую функцию C counterbusFcn
, который берет указатели структуры в качестве аргументов. Пользовательский заголовочный файл содержит это объявление функции:
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
.