В этом примере показано, как использовать структуры из пользовательского кода в графике Stateflow®. Можно задать введенные данные структуры в коде С и объединяться, это со структурами Stateflow и Simulink® соединяет шиной сигналы. Путем обмена данными с пользовательским кодом можно увеличить возможности, поддержанные Stateflow, и использовать в своих интересах существующий ранее код. Для получения дополнительной информации см. Пользовательский код Повторного использования в диаграммах Stateflow.
В этом примере диаграмма Stateflow обрабатывает данные от одного сигнала шины Simulink и выводит результат к другому сигналу шины Simulink. Оба сигналы шины ввода и вывода заданы
объект Simulink.Bus
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
объявление. В поле Заголовочного файла каждого Simulink.Bus
возразите, введите имя заголовочного файла, который содержит соответствующий typedef
объявление.
3. Сконфигурируйте диаграмму Stateflow, чтобы включать пользовательский код С.
Чтобы включать пользовательский код для симуляции, смотрите доступ к Пользовательскому коду С в Графиках Небиблиотеки.
Чтобы включать пользовательский код для генерации кода, смотрите, Интегрируют Внешний Код при помощи Параметров конфигурации Модели (Simulink Coder).
4. Создайте и запустите свою модель.
Когда вы вызываете функции пользовательского кода, которые берут указатели структуры в качестве аргументов, передают структуры 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
.