Когда вы используете числовые переменные 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
.
Можно также разделить массив структур в блоке 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
введите, используйте Simulink.importExternalCTypes
функция.