Когда вы используете числовые переменные MATLAB®, чтобы установить значения параметров блоков в модели, большие модели могут накопить много переменных, увеличив усилие по обслуживанию и заставив имена переменных вырасти в длине.
Вместо этого можно организовать эти значения параметров в структуры. Каждая структура является одной переменной, и каждое поле структуры хранит числовое значение параметров. Можно присвоить понятные имена к структурам, подструктурам и полям, чтобы указать на цель каждого значения.
Используйте структуры для:
Сократите количество переменных рабочей области, которые необходимо поддержать.
Избегайте конфликтов по совпадению имен между переменными рабочей области.
Вы не можете создать две переменные, которые имеют то же имя в том же осциллографе, такой как в базовом рабочем пространстве. Когда вы создаете структуры, необходимо предоставить каждому полю имя, но несколько структур могут каждый содержать поле, которое использует то же имя. Поэтому можно использовать каждую структуру и подструктуру как namespace, который препятствует тому, чтобы имена полей конфликтовали друг с другом и с другими именами переменных в том же осциллографе.
Логически наборы группы значений параметров блоков. Например, используйте вложенные структуры, чтобы ясно идентифицировать значения параметров, что каждая подсистема или сослалась на образцовое использование.
Если вы используете параметры маски или образцовые аргументы, чтобы передать значения параметров компонентам системы, можно использовать структуры, чтобы сократить количество отдельных параметров маски или образцовых аргументов, которые необходимо поддержать. Вместо того, чтобы передать несколько переменных, можно передать одну переменную структуры.
Для основной информации о создании и управлении структурами MATLAB, смотрите Структуры (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
. Числовое значение каждого поля структуры равно значению соответствующей переменной, которую вы очистили.
Можно использовать функции Simulink.BlockDiagram.createVarStruct
и Simulink.BlockDiagram.applyVarStruct
, чтобы переместить модель, чтобы использовать одну структуру параметра вместо нескольких переменных рабочей области. Для примера смотрите Миграцию к Параметрам Структуры.
Чтобы использовать структуру или массив структур, чтобы организовать значения параметров, которые используют тип данных кроме 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
.
Объект 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);
Свойство 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
шины.
Чтобы управлять объектами шины после того, как вы создаете их, смотрите, Изменяют Объекты Шины и Сохраняют и Объекты Шины Импорта.
Предположим, что вы используете поле 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
.
Можно также разделить массив структур в Для Каждого блока 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 (View> 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, чтобы создать один сигнал шины, который передает несколько числовых констант. Для получения дополнительной информации смотрите Константа. Для получения информации о сигналах шины смотрите Шины.
Прежде чем вы переместите модель, чтобы использовать структуры параметра, обнаружить все блоки в целевой модели и в других моделях, которые используют переменные, которые вы намереваетесь заменить.
Например, предположите, что два блока в модели используют переменную 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
, используйте функцию Simulink.importExternalCTypes
.