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