В этом примере показано, как получить доступ и изменить содержимое структуры Stateflow ®. Структуры Stateflow позволяют вам объединять данные разных размеров и типов в одну
объект. Используя запись через точку и числовые индексы, можно получить доступ и изменить содержимое структуры Stateflow. Для получения дополнительной информации смотрите Сигналы шины доступа через структуры StateflowSimulink.Bus
(Simulink)
Для индекса подструктур и полей структур Stateflow используйте запись через точку. Первая часть имени идентифицирует родительский объект. Последующие части идентифицируют дочерние элементы по иерархическому пути. Когда родительский элемент является структурой, его дочерние элементы являются отдельными полями или полями, которые содержат другие структуры (также называемые подструктурами). Имена полей структуры Stateflow совпадают с именами элементов Simulink.Bus
объект, определяющий структуру.
Для примера график в этой модели содержит структуру входа (in
), структура output (out
), и двух локальных структур (localbus
и subbus
).
График определяет структуру входа in
, а структура output out
и локальную структуру localbus
при помощи Simulink.Bus
BusObject объекта
. Эти структуры имеют четыре поля: sb
, a
, b
, и c
. Полевые sb
является подструктурой, заданной из Simulink.Bus
SubBus объекта
.
График определяет локальную структуру subbus
при помощи Simulink.Bus
SubBus объекта
. Эта структура имеет одно поле, называемое ele
.
Этот список иллюстрирует, как диаграмма Stateflow разрешает символы в записи через точку для индексации полей этих структур:
in.c
- Полевые c
структуры входа in
.
out.sb
- Подсистема sb
от структуры output out
.
in.a(1)
- Первое значение векторного поля a
структуры входа in
.
subbus.ele(2,2)
- Значение во второй строке, второй столбец поля ele
локальной структуры subbus
.
in.sb.ele(3,4)
- Значение в третьей строке, четвертом столбце поля ele
подструктуры in.sb
.
Можно присвоить значения любой структуре Stateflow, подструктуре или полю структуры с возможностями, отличной от Input
.
Чтобы назначить одну структуру другой структуре, задайте обе структуры из одного и того же Simulink.Bus
объект в базовом рабочем пространстве.
Чтобы назначить одну структуру подструктуре отличной структуры (или наоборот), определите структуру и подструктуру из того же Simulink.Bus
объект.
Для присвоения поля одной структуры полю другой структуры поля должны иметь одинаковый тип и размер. Структуры Stateflow можно задать из различных Simulink.Bus
объекты.
В этом списке представлены допустимые и недопустимые назначения структур на основе спецификаций структур для этого примера:
in = localbus;
- Недопустимый. Вы не можете записать во входные структуры.
out = localbus;
- Действительно. Оба out
и localbus
определяются из тех же Simulink.Bus
BusObject объекта
.
subbus = in;
- Недопустимый. Структуры subbus
и in
определяются из различных Simulink.Bus
объекты.
subbus = in.sb;
- Действительно. Структура subbus
и подструктуры in.sb
определяются из тех же Simulink.Bus
SubBus объекта
.
in.sb = subbus;
- Недопустимый. Вы не можете записать в подструктуры входа структур.
out.sb = subbus;
- Действительно. Структура графика out.sb
и структура subbus
определяются из тех же Simulink.Bus
SubBus объекта
.
in.c = out.c;
- Недопустимый. Вы не можете записывать в поля входа структур.
out.sb.ele = subbus.ele;
- Действительно. Полевые out.sb.ele
имеет тот же тип и размер, что и поле subbus.ele
(матрицы типа 3 на 3 int8
).
localbus.a(1) = in.c;
- Действительно. Значение localbus.a(1)
имеет тот же тип и размер, что и поле in.c
(скаляры типа double
).
Например, в действии входа для A
состоянийграфик вызывает функции
abc2sb
и sb2abc
и сохраняет результаты в локальных структурах localbus
и subbus
. Затем график записывает данные в структуру output out
путем объединения значений локальных структур localbus
и subbus
.
Графическая функция abc2sb
принимает структуру типа BusObject
и возвращает структуру типа SubBus
. Функция объединяет значения полей a
, b
, и c
из его входа и переставляет их в матрицу типа 3 на 3 int8
. Затем функция хранит эту матрицу как поле ele
от структуры output.
Функция MATLAB ® sb2abc
принимает структуру типа SubBus
и возвращает структуру типа BusObject
. Функция разлагает значение поля ele
из его входов в три компонента: вектор, матрица 3 на 2 и скаляр. Функция сохраняет эти компоненты в локальном MATLAB struct
Y
который имеет ту же структуру что и Simulink.Bus
BusObject объекта
. Затем функция присваивает значение MATLAB struct
Y
в структуру output y
.
function y = sb2abc(u)
% extract data from input structure
E = int8(magic(3)); A = double(u.ele(1:2,1)); B = uint8(u.ele(:,2:3)); C = double(u.ele(3,1));
% create local structure
X = struct('ele',E); Y = struct('sb',X,'a',A,'b',B,'c',C);
% assign value to output structure
y = Y;
end
Когда вы моделируете пример, график использует значения поля sb
шины входа для заполнения полей a
, b
, c
шины выхода. На графике также используются значения полей a
, b
, c
шины входа для заполнения поля sb
шины выхода.
struct
| Simulink.Bus
(Simulink)