exponenta event banner

Индексирование и присвоение значений структурам потока состояний

В этом примере показано, как получить доступ и изменить содержимое структуры Stateflow ®. Структуры потока состояний позволяют объединять данные различных размеров и типов в единое целое.Simulink.Bus (Simulink) объект. Используя точечную нотацию и числовые индексы, можно получить доступ к содержимому структуры Stateflow и изменить его. Дополнительные сведения см. в разделе Сигналы шины доступа через структуры потока состояний

Индексные подструктуры и поля

Чтобы проиндексировать подструктуры и поля структур Stateflow, используйте точечную нотацию. Первая часть имени идентифицирует родительский объект. Последующие части идентифицируют нижестоящие элементы по иерархическому пути. Если родительский элемент является структурой, его дочерними элементами являются отдельные поля или поля, содержащие другие структуры (также называемые подструктурами). Имена полей структуры Stateflow совпадают с именами элементов Simulink.Bus объект, определяющий структуру.

Например, диаграмма в этой модели содержит структуру ввода (in), структура вывода (out) и две локальные структуры (localbus и subbus).

  • Диаграмма определяет структуру ввода in, структура вывода 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 структуры вывода 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 объект.

  • Для присвоения поля одной структуры полю другой структуры эти поля должны иметь одинаковый тип и размер. Структуры потока состояний можно определить из различных 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. Затем диаграмма записывает данные в структуру вывода. out путем объединения значений локальных структур localbus и subbus.

Графическая функция abc2sb принимает структуру типа BusObject и возвращает структуру типа SubBus. Функция объединяет значения полей. a, b, и c с его входа и переставляет их в матрицу 3 на 3 типа int8. Затем функция сохраняет эту матрицу в качестве поля. ele выходной структуры.

Функция MATLAB ® sb2abc принимает структуру типа SubBus и возвращает структуру типа BusObject. Функция разлагает значение поля ele из его ввода в три компонента: вектор, матрица 3 на 2 и скаляр. Функция сохраняет эти компоненты в локальном MATLAB. struct Y который имеет ту же структуру, что и Simulink.Bus объект BusObject. Затем функция присваивает значение MATLAB. struct Y в структуру вывода 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 выходной шины.

См. также

| (Симулинк)

Связанные темы