Когда вы используете числовой MATLAB® переменные, чтобы задать параметры блоков значения в модели, большие модели могут накапливать много переменных, увеличивая усилия по обслуживанию и заставляя имена переменных увеличиваться в длину.
Вместо этого можно организовать эти значения параметров в структуры. Каждая структура является одной переменной, и каждое поле структуры хранит числовое значение параметров. Можно присвоить значимые имена структурам, подструктурам и полям, чтобы указать назначение каждого значения.
Используйте структуры для:
Уменьшите количество переменных рабочей области, которые вы должны поддерживать.
Избегайте конфликтов по совпадению имен между переменными рабочей области.
Вы не можете создать две переменные с одним и тем же именем в одной возможности, например, в базовом рабочем пространстве. Когда вы создаете структуры, вы должны предоставить каждому полю имя, но каждый из нескольких структур может содержать поле, которое использует одно и то же имя. Поэтому можно использовать каждую структуру и подструктуру как namespace, которая препятствует конфликтам имен полей друг с другом и с другими именами переменных в одной возможности.
Логически сгруппировать наборы значений параметров блоков. Для примера используйте вложенные структуры, чтобы четко идентифицировать значения параметров, которые используют каждая подсистема или ссылочные модели.
Если вы используете параметры маски или аргументы модели, чтобы передать значения параметров компонентам системы, можно использовать структуры, чтобы уменьшить количество отдельных параметров маски или аргументов модели, которые вы должны поддерживать. Вместо передачи нескольких переменных можно передать одну структурную переменную.
Основные сведения о создании и манипулировании структурами MATLAB см. в разделе Структуры. Для получения основной информации об установке параметров блоков значений в модели, смотрите Задать Параметры блоков значения.
Чтобы использовать структуры для инициализации сигналов шины, см. Раздел «Задание начальных условий для элементов шины».
В этом примере показано, как создать и использовать структуру параметра в модели.
Пример модели f14
использует несколько переменных из базового рабочего пространства, чтобы задать значения параметров блоков. Для примера, когда вы открываете модель, она создает переменные Zw
, Mw
, и Mq
в базовом рабочем пространстве. Чтобы организовать эти переменные в одну структурную переменную:
В командной строке откройте пример модели.
f14
В командной строке создайте структуру параметра myGains
. Установите значения полей с помощью значений целевых переменных.
myGains.Zw = Zw; myGains.Mw = Mw; myGains.Mq = Mq;
В Model Explorer на панели Model Hierarchy нажмите Base Workspace. На панели Contents щелкните правой кнопкой мыши переменную Mq
и выберите Find Where Used.
В диалоговом окне Select a system щелкните узел f14 и нажмите OK. Нажмите OK, когда спросят об обновлении схемы.
На панели Contents щелкните правой кнопкой мыши строку, соответствующую маркированному блоку Gain1 и выберите Properties. Откроется Gain1 диалогового окна блока.
Измените значение параметра Gain из Mq
на myGains.Mq
и нажмите OK.
На панели Contents щелкните правой кнопкой мыши строку, соответствующую блоку Transfer Fcn.1, и выберите Properties.
Измените значение параметра Denominator coefficients из [1,-Mq]
на [1,-myGains.Mq]
и нажмите OK.
На панели Model Hierarchy нажмите Base Workspace. Используйте Find Where Used, чтобы найти блоки, которые используют переменные Mw
и Zw
. В диалоговые окна блока замените ссылки на имена переменных согласно таблице.
Имя переменной | Имя замены |
---|---|
Mw | myGains.Mw |
Zw | myGains.Zw |
Очистите старые переменные.
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
(Fixed-Point Designer) объект.
A Simulink.Parameter
объект позволяет вам отделить значение параметров блоков от его типа данных. Если вы используете объект параметра для хранения структуры или массива структур, можно создать Simulink.Bus
объект для использования в качестве типа данных всей структуры.
Можно использовать объект шины и объект параметра для явного управления:
Тип данных каждого поля. Когда вы используете этот метод, вы не должны помнить, чтобы использовать типизированные выражения или подписанное назначение для установки значений полей.
Сложность, размерности и модули каждого поля.
Минимальное и максимальное значение каждого поля, если поле представляет настраиваемому параметру значение.
Форма всей структуры. shape структуры - это число, имена и иерархия полей.
Настраиваемость структуры в коде, который вы генерируете из модели.
Создайте структуру параметра 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)... );
Используйте функцию Simulink.Bus.createObject
для создания Simulink.Bus
объекты, которые представляют структуру и подструктуры.
Simulink.Bus.createObject(myParams)
Потому что myParams
содержит две уникальные подструктуры, функция создает три Simulink.Bus
объекты: один именованный slBus1
для представления родительской структуры myParams
, один по наименованию SubsystemA
для подструктуры SubsystemA
, и один именованный SubsystemB
для подструктуры SubsystemB
.
Переименуйте объект шины slBus1
как myParamsType
.
myParamsType = slBus1;
clear slBus1
Сохраните структуру myParams
в Simulink.Parameter
объект.
myParams = Simulink.Parameter(myParams);
The Value
свойство объекта параметра содержит структуру.
Установите тип данных объекта параметра в объект шины myParamsType
.
myParams.DataType = 'Bus: myParamsType';
Откройте Редактор шин, чтобы просмотреть объекты шины.
buseditor
На панели Model Hierarchy щелкните узел SubsystemA. На панели Contents установите типы данных полей согласно рисунку.
Вы можете задать типы данных полей для подструктуры SubsystemB
.
Объект параметра myParams
сохраняет структуру параметра. Тип данных объекта параметра является объектом шины myParamsType
. Перед симуляцией и генерацией кода объект параметра приводит значения полей к типам данных, которые вы задали в объекте шины.
Чтобы использовать одно из полей для задания параметров блоков значения, задайте такое выражение, как myParams.SubsystemB.Init1
.
Для доступа к значениям полей в командной строке используйте Value
свойство объекта параметра. Поскольку объект шины управляет типами данных поля, вам не нужно использовать типизированное выражение, чтобы задать значение поля.
myParams.Value.SubsystemA.Gain = 12.79;
Объект шины строго управляет характеристиками поля и формой структуры. Для примера, если вы задаете значение двухэлементного поля myParams.SubsystemB.Coeffs
для массива с тремя элементами модель генерирует ошибку, когда вы задаете параметры блоков значение. Чтобы изменить размерности поля, измените элемент Coeffs
в объекте шины SubsystemB
.
Для управления объектами шины после их создания смотрите Создать и Задать Simulink Объекты .Bus и Сохранить объекты Simulink .Bus.
Предположим, что вы используете поле myParams.SubsystemA.Gain
чтобы задать значение параметра Gain в блоке Gain. Если вы хотите, чтобы тип данных поля совпадал с типом данных выходного сигнала блока, вы не можете полагаться на контекстно-зависимое типирование данных (см. Раздел «Контекстно-чувствительный тип данных»). Рассмотрите использование Simulink.AliasType
или Simulink.NumericType
объект для установки типа данных поля и сигнала. Если вы не используете объект типа данных, необходимо не забывать изменять тип данных поля всякий раз, когда вы изменяете тип данных сигнала.
В командной строке создайте Simulink.AliasType
объект, который представляет тип данных single
.
myType = Simulink.AliasType; myType.BaseType = 'single';
В диалоговом окне Gain блока, на вкладке Signal Attributes, установите Output data type равным myType
.
В командной строке откройте Редактор шин.
buseditor
На панели Model Hierarchy выберите объект шины SubsystemA
. На панели Contents задайте тип данных поля Gain
на myType
.
Теперь и выходной сигнал блока Gain, и поле структуры 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
.
Можно также разбить массив структур на For Each Subsystem блок. Этот метод помогает вам организовать переменные рабочей области, когда модель выполняет алгоритм неоднократно, для примера путем итерации алгоритма по вектору сигналу. Для получения примера смотрите Повторить алгоритм Используя для каждой подсистемы.
Если вы используете аргументы модели, чтобы задать различные значения параметров для нескольких образцов модели-ссылки, можно использовать массивы структур, чтобы организовать значения аргументов модели. В рабочем пространстве модели-ссылки создайте переменную структуры и сконфигурируйте модель, чтобы использовать структуру в качестве аргумента модели. Используйте поля структуры, чтобы задать параметры блоков значения в модели. Затем создайте массив структур в базовом рабочем пространстве или словаре данных, с которым связаны родительская модель или модели. В родительской модели или моделях используйте каждую из структур в массиве в качестве значения аргумента модели в блоке Model. Каждая структура в массиве хранит значения параметров для одного образца ссылочных моделей.
Пример модели sldemo_mdlref_datamngt
содержит три образцов (Model блоков) маскированной ссылочной модели sldemo_mdlref_counter_datamngt
. Базовые переменные базового рабочего пространства IC1
, IC2
, Param1
, и Param2
являются Simulink.Parameter
объекты, значениями которых являются структуры. Родительская модель использует эти переменные, чтобы задать значения параметров маски на блоках Model. Начиная с IC1
структурно идентичен IC2
, и Param1
на Param2
можно объединить эти четыре структуры в два массива структур.
Откройте пример родительской модели.
sldemo_mdlref_datamngt
Модель создает четыре Simulink.Parameter
объекты в базовом рабочем пространстве.
Откройте пример, на который ссылаются модели.
sldemo_mdlref_counter_datamngt
Это рабочее пространство модели задаёт два аргумента модели, CounterICs
и CounterParams
, значения которого являются структурами. Блоки в модели используют поля этих структур, чтобы задать значения параметров.
В модель sldemo_mdlref_datamngt
, откройте Model Data Editor (на вкладке Modeling нажмите Model Data Editor). В Model Data Editor смотрите вкладку Parameters.
В модели щелкните один из блоков Model.
В Model Data Editor подсвечиваются строки, которые соответствуют двум параметрам маски на выбранном блоке Model. Блок использует маскирующие параметры, чтобы задать значения двух аргументов модели, заданных ссылочной моделью sldemo_mdlref_counter_datamngt
. Каждый Model блок использует разную комбинацию четырех объектов параметра из базового рабочего пространства, чтобы задать значения аргументов.
В столбце Value Model Data Editor щелкните один из камер, чтобы начать редактирование значения соответствующего параметра маски (для примера IC1
). Рядом со значением параметров нажмите кнопку действия и выберите Open. Откроется диалоговое окно свойств объекта параметра.
В диалоговом окне свойств, рядом с полем Value, нажмите кнопку действия и выберите Open Variable Editor.
Редактор переменных показывает, что объект параметра хранит структуру. Структуры в Param2
и IC2
иметь те же поля, что и структуры в Param1
и IC1
но различные значения полей.
В командной строке объедините четыре объекта параметра в два объекта параметра, значения которых являются массивами структур.
% 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
В родительской модели, в Model Data Editor, используйте столбец Value, чтобы заменить значения параметров маски согласно таблице
Предыдущее значение | Новое значение |
---|---|
Param1 | Param(1) |
IC1 | IC(1) |
Param2 | Param(2) |
IC2 | IC(2) |
Каждый Model блок устанавливает значение аргумента модели 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;
Можно использовать структуру в блоке Constant, чтобы создать один сигнал шины, который передает несколько числовых констант. Для получения дополнительной информации см. раздел Constant. Для получения информации о сигналах шины см. Раздел «Виртуальная шина».
Прежде чем вы мигратируете модель, чтобы использовать параметр структуры, обнаружите все блоки в целевой модели и в других моделях, которые используют переменные, которые вы намереваетесь заменить.
Например, предположим, что два блока в модели используют переменную рабочей области myVar
. Если вы создаете структуру myParams
с полем myVar
, и установите значение параметров только в одном из блоков равным myParams.myVar
другой блок продолжает использовать переменную myVar
. Если вы удаляете myVar
модель генерирует ошибку, поскольку оставшийся блок требует удаленной переменной.
Чтобы обнаружить все блоки, которые используют переменную:
Откройте все модели, которые могут использовать переменную. Если модели находятся в иерархии модели-ссылки, можно открыть только модель верхней части.
В Model Data Editor или на панели Contents Model Explorer щелкните правой кнопкой мыши переменную и выберите Find Where Used. В Model Explorer отображаются все блоки, которые используют переменную.
Вы можете обнаружить использование переменных только в открытых моделях. Прежде чем вы перейдете в структуры параметров, откройте все модели, которые могут использовать целевые переменные. Для получения дополнительной информации об определении использования переменных в модели, смотрите Поиск блоков, которые используют определенную переменную.
Также можно воздержаться от удаления myVar
. Однако, если вы измените значение myParams.myVar
поле структуры, вы должны не забывать изменить значение myVar
чтобы соответствовать.
Можно объединить несколько отдельных переменных или объектов параметра (таких как Simulink.Parameter
) в структуру, которую вы храните в одной переменной или объекте параметра (для объединения объектов параметра смотрите Объединить существующие объекты параметра в структуру). Однако получившаяся переменная или объект действует как одна сущность. В результате нельзя применить различные настройки генерации кода, такие как классы памяти, к отдельным полям в структуре.
Когда вы используете объекты параметров, чтобы задать параметры блоков значения (для примера, так что можно применить классы памяти), чтобы объединить объекты в одну структуру:
Создайте структуру MATLAB и сохраните ее в переменной. Чтобы задать значения полей, используйте значения параметров, которые хранят каждый существующий объект параметра.
Преобразуйте переменную в объект параметра. Создайте и используйте Simulink.Bus
объект как тип данных объекта параметра (см. Управление типами данных поля и характеристиками путем создания объекта параметра).
Выберите класс памяти для применения к полученному объекту параметра. Можно выбрать только один класс памяти, который применяется ко всей структуре.
Передайте метаданные параметра, такие как 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';
Создайте структурную переменную.
myParams.coeff = coeff.Value; myParams.init = init.Value; myParams.offset = offset.Value;
Преобразуйте переменную в объект параметра.
myParams = Simulink.Parameter(myParams);
Создайте объект шины и используйте его как тип данных объекта параметра.
Simulink.Bus.createObject(myParams.Value);
paramsDT = copy(slBus1);
myParams.DataType = 'Bus: paramsDT';
Передайте метаданные от старых объектов параметра к элементам шины в объекте шины.
% 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
функция.
Применить класс памяти к объекту параметра.
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
объекты вместо структур для хранения и группировки данных. Этот метод улучшает читаемость модели путем четкой идентификации данных как частей интерполяционной таблицы и явной связи данных точек по оси Х с данными таблицы. Смотрите Общие данные точек по оси Х и Данные таблицы для интерполяционных таблиц.
Можно создать структуру параметров, которая соответствует struct
введите определение, которое задает существующий код С. Используйте этот метод для:
Замените существующий код С на Simulink® модель.
Интеграция существующих Кодов С для симуляции в Simulink (для примера, с помощью Legacy Code Tool). Для получения примера смотрите Интегрирация функции C, аргументы которой являются указателями на структуры.
Сгенерируйте Коды С ( Simulink Coder™), которые можно скомпилировать с существующими Кодами С в одно приложение. Для получения примера смотрите Структурированные и перечисленные данные обмена между сгенерированными и внешними Кодами (Embedded Coder).
В MATLAB сохраните структуру параметра в объекте параметра и используйте объект шины в качестве типа данных (см. «Типы данных поля управления и характеристики путем создания объекта параметра»). Чтобы создать объект шины в соответствии с вашим код С struct
type, использовать Simulink.importExternalCTypes
функция.