Работа с массивами шин

Настройка модели для использования массива шин обычно включает в себя следующие основные задачи:

  1. Определите массив шин (см. «Создание массива шин из невиртуальных шин»).

  2. Добавьте подсистему для выполнения итерационной обработки каждого элемента массива шин. Например, используйте блок For Each Subsystem или блок Iterator. Соедините массив шин из блока Concatenate с итерационной подсистемой обработки. См. «Выполнение итерационной обработки».

  3. Моделируйте свой скалярный алгоритм в рамках итерационной подсистемы обработки (для примера, подсистема For Each).

    1. Работайте на массиве шин (используя Selector и Assignment блоки).

    2. Используйте блоки Bus Selector и Bus Assignment для выбора элементов или присвоения элементов невиртуальной шине в подсистеме.

    См. «Присвоение значений массиву шин» и «Выбор элементов шины из массива шин».

  4. Опционально импортируйте или логгируйте массив данных шин. См. «Импорт массива шин, данных и логарифмических массивов шин»

Получившаяся модель включает эти компоненты.

Выполните итерационную обработку

Можно выполнить итерационную обработку данных шины массива шин, используя блоки, такие как блок For Each Subsystem, блок While Iterator Subsystem или блок For Iterator Subsystem. Можно использовать один из следующих блоков для выполнения того же вида обработки:

  • Каждая шина в массиве шин

  • Выбранное подмножество шин в массиве шин

Присвоение значений массиву шин

Чтобы назначить значение сигналу в массиве шин, используйте:

  1. Блок Bus Assignment для назначения значения элементу шины

  2. Блок Assignment для назначения шины массиву шин

Используйте блок Assignment для назначения значений заданным элементам в массиве шин.

Для примера, в sldemo_bus_arrays модель, блок Assignment присваивает значение первому элементу массива шин.

Для назначения элементов шины используйте блок Bus Assignment. Входной вход для блока Bus Assignment должен быть шиной.

Присвоение в массивы шин

Можно использовать блок Bus Assignment для назначения или полной замены вложенной шины, представляющей собой массив шин. Чтобы назначить данные для вложенной шины внутри массива шин или сделать частичное назначение определенным элементам с массивом шин, можно использовать MATLAB Function блок.

Например, предположим, что у вас есть эта структура шины:

У автобуса есть children элемент, который является массивом подшин. В этом примере показано, как назначить элемент c и элементу a. Блоки Inport и Outport используют Parent Bus объект. Чтобы определить назначения, этот пример использует блок MATLAB Function, потому что вы не можете назначить в элемент a использование Bus Assignment или Assignment блока.

Блок MATLAB Function использует этот код функции для назначения:

function y = fcn(u)

y = u;
y.c = false;
for idx = 1:length(y.children)
    y.children(idx).a = int32(zeros(5, 1));
end

Выберите элементы шины из массива шин

Чтобы выбрать элемент шины из массива шин, используйте:

  1. Selector блок, чтобы выбрать соответствующую шину в массиве шин.

  2. Bus Selector блок, чтобы выбрать элемент шины в шине.

Используйте блок Selector для выбора элементов массива шин. Массив входа шин может иметь любую размерность. Выходная шина блока Selector является выбранным или переупорядоченным набором элементов из входного массива шин.

Для примера, sldemo_bus_arrays модель использует Selector блока, чтобы выбрать элементы из массива шин, которые выходы блоки Assignment и For Each Subsystem. В этом примере приведены Параметры блоков диалоговое окно для блока Selector, который выбирает первый элемент:

Для выбора элементов шины используйте блок Bus Selector. Входной вход для блока Bus Selector должен быть шиной.

Импорт массива данных шин

Используйте корневой Inport блок для импорта (загрузки) массива структур MATLAB® timeseries объекты для массива шин. Можно импортировать частичные данные в массив шин.

Для получения дополнительной информации смотрите Импорт массива данных шин.

Вы не можете использовать From Workspace или From File блок для импорта данных для массива шин.

Журнал массивов шин

Чтобы экспортировать массив шин, отметьте сигнал для логгирования сигналов. Для получения дополнительной информации смотрите Сохранить данные во время выполнения из симуляции.

Примечание

Simulink® не регистрирует сигналы внутри ссылочных моделей в быстром режиме Accelerator.

Чтобы получить доступ к данным логгирования сигналов для определенного сигнала в массиве шин, перемещайтесь по иерархии структуры и задайте индекс к конкретному сигналу. Для получения дополнительной информации смотрите Массив доступа к данным логгирования сигналов шин.

Выходы шины корневого уровня не регистрируются при выборе параметра конфигурации Output. Вместо этого используйте стандартную регистрацию сигналов, как описано в Export Signal Data Using Логгирование.

Не используйте регистрацию сигналов для шины или массивов шин непосредственно из подсистемы For Each. Либо используйте блок Bus Selector, чтобы выбрать сигналы элемента шины для регистрации, либо добавьте блок Outport за пределами подсистемы, а затем зарегистрируйте этот сигнал. Для получения дополнительной информации смотрите Журнал сигналов в Для каждой подсистемы.

Инициализация массивов шин

Чтобы задать уникальное начальное значение для каждого из отдельных сигналов в массиве шин, можно использовать массив начальных структур условий. Каждая структура массива инициализирует одну из шин.

Вот пример, который показывает, как инициализировать массив шин. Предположим, что вы задаете типы шин MyData и PressureBus.

Предположим, что вы устанавливаете тип данных сигнального элемента temperature на int16, и тип данных элементов s1 и s2 на double.

Чтобы задать начальные условия для массива шин, можно создать переменную, значение которой является массивом начальных структур условий.

initValues(1).temperature = int16(5);
initValues(1).pressure.s1 = 9.87;
initValues(1).pressure.s2 = 8.71;

initValues(2).temperature = int16(20);
initValues(2).pressure.s1 = 10.21;
initValues(2).pressure.s2 = 9.56;

initValues(3).temperature = int16(35);
initValues(3).pressure.s1 = 8.98;
initValues(3).pressure.s2 = 9.17;

Переменная initValues обеспечивает начальные условия для сигнала, который является массивом из трех шин. Можно использовать initValues чтобы задать параметр Initial condition для блока, такого как Unit Delay.

Кроме того, можно использовать одну скалярную структуру, чтобы задать те же начальные условия для всех шин массива.

initStruct.temperature = int16(15);
initStruct.pressure.s1 = 10.32;
initStruct.pressure.s2 = 9.46;

Если вы задаете initStruct в Initial condition параметре блока каждая шина в массиве использует одно и то же начальное значение, 15, для сигнального элемента temperature. Точно так же автобусы используют начальное значение 10.32 для элемента pressure.s1 и значение 9.46 для элемента pressure.s2.

Чтобы создать массив структур для шины, которая использует большую иерархию элементов сигнала, рассмотрите использование функции Simulink.Bus.createMATLABStruct.

В этом примере показано, как инициализировать вложенный массив шин. Создайте начальную структуру условий для сложной иерархии сигналов, которая включает вложенные массивы шин.

  1. В редакторе шин создайте Bus объекты MyData и PressureBus.

  2. На панели иерархии выберите элемент шины pressure. Установите свойство Dimensions равным [1 3].

  3. Создайте массив из четырех структур инициализации с помощью функции Simulink.Bus.createMATLABStruct. Сохраните массив в переменной initStruct. Инициализируйте все отдельные сигналы до значения земли, 0.

    initStruct=Simulink.Bus.createMATLABStruct('MyData',[],[1 4]);

  4. В базовом рабочем пространстве дважды кликните переменную initStruct чтобы просмотреть его в редакторе переменных.

    Каждая из четырех структур в массиве имеет поля temperature и pressure.

  5. Чтобы просмотреть pressureдважды кликните одно из полей.

    Значение каждого из четырех pressure поля являются массивом из трех подструктур. Каждая подструктура имеет поля s1 и s2.

  6. Чтобы предоставить уникальные значения инициализации для сигналов в массиве шин, можно задать значения вручную с помощью редактора переменных.

    Также можно написать скрипт. Для примера доступа к полю s1 второй подструктуры pressure в третьей структуре initStruct, используйте этот код:

    initStruct(3).pressure(2).s1 = 15.35;

Требования к параметрам структуры

Чтобы инициализировать массив шин с параметрами структуры, можно использовать:

  • Номер 0. В этом случае все отдельные сигналы в массиве шин используют начальное значение 0.

  • Скалярное struct который представляет ту же иерархию полей и имен полей, что и тип шины. В этом случае скалярная структура расширяется, чтобы инициализировать каждый из отдельных сигналов в массиве шин.

  • Массив структур, который задает начальное значение для каждого из отдельных сигналов в массиве шин.

    Если используется массив структур, все структуры массива должны иметь одинаковую иерархию полей. Каждое поле иерархии должно иметь одинаковые характеристики для массива:

    • Имя поля

    • Тип числовых данных, такой как single или int32

    • Сложность

    • Размерности

Вы не можете использовать частичные структуры.

Генерация кода

Генерация кода для массивов шин создает структуры с определенным форматом. Смотрите Генерацию кода для массивов шин.

Похожие темы