exponenta event banner

Организация связанных определений параметров блока в структурах

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

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

Использовать структуры для:

  • Уменьшите количество переменных рабочей области, которые необходимо поддерживать.

  • Избегайте конфликтов имен между переменными рабочей области.

    Нельзя создать две переменные с одинаковыми именами в одной области, например в базовой рабочей области. При создании структур необходимо указать каждому полю имя, но каждая из них может содержать одно и то же поле. Поэтому можно использовать каждую структуру и подструктуру в качестве пространства имен, которое предотвращает конфликт имен полей друг с другом и с именами других переменных в одной области.

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

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

Основные сведения о создании структур MATLAB и управлении ими см. в разделе Структуры. Основные сведения о задании значений параметров блока в модели см. в разделе Задание значений параметров блока.

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

Создание и использование структуры параметров

В этом примере показано, как создать и использовать структуру параметров в модели.

Пример модели f14 использует несколько переменных из базовой рабочей области для задания значений параметров блока. Например, при открытии модели создаются переменные. Zw, Mw, и Mq в базовом рабочем пространстве. Чтобы упорядочить эти переменные в одну структурную переменную, выполните следующие действия.

  1. В командной строке откройте пример модели.

    f14

  2. В командной строке создайте структуру параметров myGains. Задайте значения полей, используя значения целевых переменных.

    myGains.Zw = Zw;
    myGains.Mw = Mw;
    myGains.Mq = Mq;

  3. В обозревателе моделей на панели Иерархия моделей (Model Hierarchy) щелкните Базовая рабочая область (Base Workspace). На панели «Содержимое» щелкните правой кнопкой мыши переменную. Mq и выберите «Найти используемое».

  4. В диалоговом окне «Выбор системы» щелкните узел f14 и нажмите кнопку «ОК». Нажмите кнопку «ОК», когда спросите об обновлении схемы.

  5. На панели «Содержимое» щелкните правой кнопкой мыши строку, соответствующую блоку с меткой Gain1 и выберите «Свойства». Откроется диалоговое окно Gain1 блока.

  6. Изменение значения параметра Gain с Mq кому myGains.Mq и нажмите кнопку ОК.

  7. На панели «Содержимое» щелкните правой кнопкой мыши строку, соответствующую блоку «Перенести Fcn.1», и выберите «Свойства».

  8. Изменение значения параметра Коэффициенты знаменателя с [1,-Mq] кому [1,-myGains.Mq] и нажмите кнопку ОК.

  9. На панели Иерархия модели (Model Hierarchy) щелкните Базовая рабочая область (Base Workspace). Для поиска блоков, использующих переменные, используйте команду «Найти используемые». Mw и Zw. В диалоговых окнах блоков замените ссылки на имена переменных в соответствии с таблицей.

    Имя переменнойИмя замены
    MwmyGains.Mw
    ZwmyGains.Zw

  10. Очистите старые переменные.

    clear Zw Mw Mq

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

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

Сохранение информации о типе данных в значениях полей

Использование структуры или массива структур для организации значений параметров, использующих тип данных, отличный от double, можно явно указать тип при создании структуры. При создании структуры используйте типизированные выражения, такие как single(15.23) для указания значений полей.

myParams.Gain = single(15.23);

Если вы хотите изменить значение поля позже, не забудьте указать тип еще раз. Если тип не указан, значение поля использует тип данных double вместо этого:

myParams.Gain = 15.23;
% The field 'Gain' now uses the data type 'double' instead of 'single'.

Чтобы сохранить спецификацию типа, можно использовать подстрочное назначение для назначения нового значения полю:

% Assign value of type 'single'.
myParams.Gain = single(15.23);

% Assign new value while retaining type 'single'.
myParams.Gain(:) = 11.79;

Чтобы сопоставить тип данных с фиксированной точкой, задайте значение поля с помощью fi (Конструктор фиксированных точек).

Управление типами данных полей и признаками путем создания объекта параметра

A Simulink.Parameter объект позволяет отделить значение параметра блока от его типа данных. При использовании объекта параметра для хранения структуры или массива структур можно создать Simulink.Bus объект для использования в качестве типа данных всей структуры.

Объект шины и объект параметра можно использовать для явного управления:

  • Тип данных каждого поля. При использовании этого метода не обязательно использовать типизированные выражения или подстрочное назначение для установки значений полей.

  • Сложность, размеры и единицы измерения каждого поля.

  • Минимальное и максимальное значение каждого поля, если поле представляет значение настраиваемого параметра.

  • Форма всей конструкции. Форма структуры - это число, имена и иерархия полей.

  • Настраиваемость структуры в коде, создаваемом из модели.

  1. Создание структуры параметров myParams.

    myParams = struct(...
        'SubsystemA',struct(...
            'Gain',15.23,...
            'Offset',89,...
            'Init',0.59),...
        'SubsystemB',struct(...
            'Coeffs',[5.32 7.99],...
            'Offset',57,...
            'Init1',1.76,...
            'Init2',2.76)...
    );

  2. Используйте функцию Simulink.Bus.createObject создать Simulink.Bus объекты, представляющие структуру и подструктуры.

    Simulink.Bus.createObject(myParams)
    

    Поскольку myParams содержит две уникальные подструктуры, функция создает три Simulink.Bus объекты: один именованный slBus1 для представления родительской структуры myParams, один по имени SubsystemA для подструктуры SubsystemA, и один по имени SubsystemB для подструктуры SubsystemB.

  3. Переименование объекта шины slBus1 как myParamsType.

    myParamsType = slBus1;
    clear slBus1

  4. Сохранение структуры myParams в Simulink.Parameter объект.

    myParams = Simulink.Parameter(myParams);

    Value свойство объекта параметра содержит структуру.

  5. Установка типа данных объекта параметра в качестве объекта шины myParamsType.

    myParams.DataType = 'Bus: myParamsType';

  6. Откройте редактор шины для просмотра объектов шины.

    buseditor

  7. В Образцовом стекле Иерархии щелкните по узлу SubsystemA. На панели «Содержимое» задайте типы данных полей в соответствии с рисунком.

  8. При необходимости задайте типы данных полей для подструктуры SubsystemB.

Объект параметра myParams сохраняет структуру параметров. Тип данных объекта параметра - это объект шины myParamsType. Перед моделированием и созданием кода объект-параметр приводит значения полей к типам данных, указанным в объекте-шине.

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

Для доступа к значениям полей в командной строке используйте команду Value свойства объекта параметра. Поскольку объект bus управляет типами данных поля, нет необходимости использовать типизированное выражение для задания значения поля.

myParams.Value.SubsystemA.Gain = 12.79;

Объект шины строго контролирует характеристики поля и форму конструкции. Например, если задать значение двухэлементного поля myParams.SubsystemB.Coeffs для трехэлементного массива модель создает ошибку при задании значения параметра блока. Чтобы изменить размеры поля, измените элемент Coeffs в объекте шины SubsystemB.

Чтобы управлять объектами шины после их создания, см. разделы Создание и указание объектов Simulink.Bus и Сохранение объектов Simulink.Bus.

Сопоставление типа данных поля с типом данных сигнала

Предположим, что вы используете поле myParams.SubsystemA.Gain для установки значения параметра «Усиление» в блоке «Усиление». Если необходимо, чтобы тип данных поля соответствовал типу данных выходного сигнала блока, нельзя полагаться на контекстно-зависимый тип данных (см. Контекстно-зависимый тип данных). Рассмотрите возможность использования Simulink.AliasType или Simulink.NumericType объект для установки типа данных поля и сигнала. Если объект типа данных не используется, следует помнить об изменении типа данных поля при каждом изменении типа данных сигнала.

  1. В командной строке создайте Simulink.AliasType объект, представляющий тип данных single.

    myType = Simulink.AliasType;
    myType.BaseType = 'single';

  2. В диалоговом окне «Блок усиления» на вкладке «Атрибуты сигнала» задайте для параметра «Тип выходных данных» значение myType.

  3. В командной строке откройте редактор шины.

    buseditor

  4. На панели «Иерархия модели» выберите объект шины. SubsystemA. На панели «Содержимое» задайте тип данных поля. Gain кому myType.

Теперь и выходной сигнал блока усиления, и структурное поле myParams.SubsystemA.Gain используйте тип данных, указанный с помощью BaseType имущество myType.

Дополнительные сведения об объектах типа данных см. в разделе Simulink.AliasType и Simulink.NumericType.

Управление структурными переменными

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

Определение иерархии параметров путем создания вложенных структур

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

Например, предположим, что создаются подсистемы с именем SubsystemA и SubsystemB в модели. Используются такие переменные, как Offset_SubsystemA и Offset_SubsystemB установка значений параметров блока в подсистемах.

Gain_SubsystemA = 15.23;
Offset_SubsystemA = 89;
Init_SubsystemA = 0.59;

Coeffs_SubsystemB = [5.32 7.99];
Offset_SubsystemB = 57;
Init1_SubsystemB = 1.76;
Init2_SubsystemB = 2.76;

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

myParams = struct(...
    'SubsystemA',struct(...
        'Gain',Gain_SubsystemA,...
        'Offset',Offset_SubsystemA,...
        'Init',Init_SubsystemA),...
    'SubsystemB',struct(...
        'Coeffs',Coeffs_SubsystemB,...
        'Offset',Offset_SubsystemB,...
        'Init1',Init1_SubsystemB,...
        'Init2',Init2_SubsystemB)...
);

Одиночная структурная переменная myParams содержит всю информацию о параметрах для блоков в подсистемах. Поскольку каждая подструктура действует как пространство имен, можно определить Offset поле более одного раза.

Для использования Offset поле из подструктуры SubsystemB в качестве значения параметра блока укажите значение параметра в диалоговом окне блока в качестве выражения myParams.SubsystemB.Offset.

Группирование структур с несколькими параметрами в массив

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

Предположим, что в модели создаются две идентичные подсистемы.

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

myParams(1).Gain = 15.23;
myParams(1).Offset = 89;
myParams(1).Init = 0.59;

myParams(2).Gain = 11.93;
myParams(2).Offset = 57;
myParams(2).Init = 2.76;

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

Чтобы задать значение параметра блока в одной из подсистем, укажите выражение, которое ссылается на поле одной из структур в массиве. Например, используйте выражение myParams(2).Init.

Организация значений параметров для многократно используемых компонентов и итеративных алгоритмов

Можно также разделить массив структур в блоке «Для каждой подсистемы». Этот метод помогает организовать переменные рабочей области, когда модель выполняет алгоритм повторно, например, путем итерации алгоритма по векторному сигналу. Пример см. в разделе Повторение алгоритма с использованием для каждой подсистемы.

Если аргументы модели используются для указания различных значений параметров в нескольких экземплярах ссылочной модели, можно использовать массивы структур для организации значений аргументов модели. В рабочей области ссылочной модели создайте структурную переменную и настройте модель для использования структуры в качестве аргумента модели. Поля структуры используются для задания значений параметров блока в модели. Затем создайте массив структур в базовой рабочей области или словаре данных, с которым связана родительская модель или модели. В родительской модели или моделях используйте каждую из структур в массиве в качестве значения аргумента модели в блоке Model. Каждая структура в массиве сохраняет значения параметров для одного экземпляра ссылочной модели.

Пример модели sldemo_mdlref_datamngt содержит три экземпляра (блоки модели) маскированной ссылочной модели sldemo_mdlref_counter_datamngt. Базовые переменные рабочей области IC1, IC2, Param1, и Param2 являются Simulink.Parameter объекты, значения которых являются структурами. Родительская модель использует эти переменные для установки значений параметров маски в блоках модели. С тех пор IC1 конструктивно идентичен IC2, и Param1 кому Param2, можно объединить эти четыре структуры в два массива структур.

  1. Откройте пример родительской модели.

    sldemo_mdlref_datamngt

    Модель создает четыре Simulink.Parameter объектов в базовом рабочем пространстве.

  2. Откройте пример ссылочной модели.

    sldemo_mdlref_counter_datamngt

    Рабочее пространство модели определяет два аргумента модели, CounterICs и CounterParams, чьи ценности являются структурами. Блоки в модели используют поля этих структур для задания значений параметров.

  3. В модели sldemo_mdlref_datamngtоткройте Редактор данных модели (на вкладке Моделирование (Modeling) щелкните Редактор данных модели (Model Data Editor)). В Редакторе данных модели (Model Data Editor) проверьте вкладку Параметры (Parameters).

  4. В модели щелкните один из блоков модели.

    Редактор данных модели выделяет строки, соответствующие двум параметрам маски в выбранном блоке модели. Блок использует параметры маски для установки значений двух аргументов модели, определенных ссылочной моделью. sldemo_mdlref_counter_datamngt. Каждый блок модели использует различную комбинацию четырех объектов параметров из базовой рабочей области для задания значений аргументов.

  5. В столбце Значение редактора данных модели (Model Data Editor Value) щелкните одну из ячеек, чтобы начать редактирование значения соответствующего параметра маски (например, IC1). Рядом со значением параметра нажмите кнопку действия и выберите Открыть. Откроется диалоговое окно свойств объекта-параметра.

  6. В диалоговом окне свойств рядом с полем «Значение» нажмите кнопку действия и выберите «Открыть редактор переменных».

    Редактор переменных показывает, что объект параметра хранит структуру. Структуры в Param2 и IC2 имеют те же поля, что и структуры в Param1 и IC1 но различные значения полей.

  7. В командной строке объедините четыре объекта параметров в два объекта параметров, значения которых являются массивами структур.

    % Create a new parameter object by copying Param1.
    Param = Param1.copy;
    
    % Use the structure in Param2 as the second structure in the new object.
    Param.Value(2) = Param2.Value;
    % The value of Param is now an array of two structures.
    
    % Delete the old objects Param1 and Param2.
    clear Param1 Param2
    
    % Create a new parameter object by copying IC1.
    % Use the structure in IC2 as the second structure in the new object.
    IC = IC1.copy;
    IC.Value(2) = IC2.Value;
    clear IC1 IC2

  8. В родительской модели в редакторе данных модели используйте столбец Значение (Value) для замены значений параметров маски в соответствии с таблицей.

    Предыдущее значениеНовое значение
    Param1Param(1)
    IC1IC(1)
    Param2Param(2)
    IC2IC(2)

Каждый блок модели задает значение аргумента модели CounterICs с помощью одной из структур в массиве IC. Аналогично, каждый блок устанавливает значение CounterParams используя одну из структур в Param.

Обеспечение однородности в массиве структур

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

Чтобы использовать объект параметра для представления массива структур параметров, задайте значение объекта для массива структур:

% Create array of structures.
myParams(1).Gain = 15.23;
myParams(1).Offset = 89;
myParams(1).Init = 0.59;
myParams(2).Gain = 11.93;
myParams(2).Offset = 57;
myParams(2).Init = 2.76;

% Create bus object.
Simulink.Bus.createObject(myParams);
myParamsType = slBus1;
clear slBus1

% Create parameter object and set data type.
myParams = Simulink.Parameter(myParams);
myParams.DataType = 'Bus: myParamsType';

Чтобы использовать одно из полей для задания значения параметра блока, укажите выражение, например myParams(2).Offset.

Для доступа к значениям полей в командной строке используйте команду Value свойства объекта параметра.

myParams.Value(2).Offset = 129;

Создание структуры сигналов с постоянным значением

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

Примечания перед переносом в структуры параметров

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

    Например, предположим, что два блока в модели используют переменную рабочего пространства myVar. При создании структуры myParams с полем myVarи задайте значение параметра только в одном из блоков равным myParams.myVar, другой блок продолжает использовать переменную myVar. При удалении myVar, модель генерирует ошибку, поскольку для оставшегося блока требуется удаленная переменная.

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

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

    2. В Редакторе данных модели (Model Data Editor) или на панели Содержимое проводника моделей (Model Explorer Contents) щелкните правой кнопкой мыши переменную и выберите Найти где используется (Find Where Used). В обозревателе моделей отображаются все блоки, использующие переменную.

    Использование переменных можно обнаружить только в открытых моделях. Перед миграцией в структуры параметров откройте все модели, которые могут использовать целевые переменные. Дополнительные сведения об определении использования переменной в модели см. в разделе Поиск блоков, использующих определенную переменную.

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

  • Можно комбинировать несколько отдельных переменных или объектов параметров (например, Simulink.Parameter) в структуру, хранящуюся в одной переменной или объекте параметра (сведения об объединении объектов параметров см. в разделе Объединение существующих объектов параметров в структуру). Однако результирующая переменная или объект действует как один объект. В результате к отдельным полям структуры нельзя применять различные параметры создания кода, например, классы хранения.

Объединение существующих объектов параметров в структуру

При использовании объектов параметров для задания значений параметров блоков (например, для применения классов хранения) для объединения объектов в единую структуру:

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

  2. Преобразование переменной в объект параметра. Создание и использование Simulink.Bus объект как тип данных объекта параметра (см. раздел Типы данных и признаки поля управления путем создания объекта параметра).

  3. Выберите класс хранения для применения к результирующему объекту параметра. Можно выбрать только один класс хранения, который применяется ко всей структуре.

  4. Передача метаданных параметров, таких как Min и Max свойств существующих объектов параметров, соответствующих свойствам Simulink.BusElement объектов в объекте шины.

Например, предположим, что у вас есть три отдельных объекта параметров.

coeff = Simulink.Parameter(17.5);
coeff.Min = 14.33;
coeff.DataType = 'single';
coeff.StorageClass = 'ExportedGlobal';

init = Simulink.Parameter(0.00938);
init.Min = -0.005;
init.Max = 0.103;
init.DataType = 'single';
init.StorageClass = 'Model default';

offset = Simulink.Parameter(199);
offset.DataType = 'uint8';
offset.StorageClass = 'ExportedGlobal';

  1. Создайте структурную переменную.

    myParams.coeff = coeff.Value;
    myParams.init = init.Value;
    myParams.offset = offset.Value;

  2. Преобразование переменной в объект параметра.

    myParams = Simulink.Parameter(myParams);

  3. Создайте объект шины и используйте его в качестве типа данных объекта параметра.

    Simulink.Bus.createObject(myParams.Value);
    paramsDT = copy(slBus1);
    
    myParams.DataType = 'Bus: paramsDT';

  4. Передача метаданных из старых объектов параметров в элементы шины в объекте шины.

    % coeff
    paramsDT.Elements(1).Min = coeff.Min;
    paramsDT.Elements(1).DataType = coeff.DataType;
    
    % init
    paramsDT.Elements(2).Min = init.Min;
    paramsDT.Elements(2).Max = init.Max;
    paramsDT.Elements(2).DataType = init.DataType;
    
    % offset
    paramsDT.Elements(3).DataType = offset.DataType;

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

  5. Примените класс хранения к объекту параметра.

    myParams.StorageClass = 'ExportedGlobal';

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

Структуры параметров в сгенерированном коде

Структуры параметров можно настроить так, чтобы они отображались в сгенерированном коде как структуры и массивы структур. Сведения о создании кода со структурами параметров см. в разделе Организация данных в структуры в сгенерированном коде (Simulink Coder).

Ограничения структуры параметров

  • Значение поля, используемое для установки параметра блока, должно быть числовым или иметь перечисляемый тип. Значение поля может быть вещественным или сложным скалярным, векторным или многомерным массивом.

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

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

    • Имя поля

    • Числовой тип данных, например single или int32

    • Сложность

    • Размеры

    Предположим, что определен массив из двух структур.

    paramStructArray = ...
    [struct('sensor1',int16(7),'sensor2',single(9.23)) ...
     struct('sensor1',int32(9),'sensor2',single(11.71))];

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

  • Структуры параметров не поддерживают ввод контекстно-зависимых данных в созданном коде. Если структура параметров настраивается в коде, в полях структуры используются числовые типы данных, которые задаются с помощью либо типизированных выражений, либо Simulink.Bus объект. Если не используются типизированные выражения или Simulink.Bus , поля структуры используют double тип данных.

Общие точки останова пакета и данные таблицы для таблиц подстановки

При совместном использовании данных между блоками таблицы поиска рекомендуется использовать Simulink.LookupTable и Simulink.Breakpoint вместо структур для хранения и группирования данных. Этот метод улучшает читаемость модели, четко идентифицируя данные как части таблицы подстановки и явно связывая данные точек останова с данными таблицы. См. раздел Общие точки останова пакета и данные таблицы для таблиц подстановки.

Создание структуры параметров по типу структуры из существующего кода C

Можно создать структуру параметров, соответствующую struct определение типа, которое определяет существующий код C. Используйте этот метод для:

В MATLAB сохраните структуру параметров в объекте параметра и используйте объект шины в качестве типа данных (см. Управление типами данных полей и признаками путем создания объекта параметра). Создание объекта шины в соответствии с кодом C struct введите, используйте Simulink.importExternalCTypes функция.

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