В этом примере показано, как преобразовать модель Simulink ®, которая параметризована неструктурированными переменными рабочей области в модель, которая параметризована структурой MATLAB ®. Пример использует ряд утилит Simulink, чтобы организовать переменные модели из базового рабочего пространства в иерархическую структуру и затем применить структуру к модели.
Откройте модель sldemo_applyVarStruct
.
Эта модель использует ряд числовых параметров из базового рабочего пространства.
Этот пример изменяет исходную модель и создает файлы в текущей рабочей директории. Если вы планируете сохранить модели примера, сохраните копию в текущей директории.
Миграция модели для использования параметров структуры выполняется следующими шагами:
1. Соберите все числовые переменные, используемые моделью, в структуру MATLAB.
2. Измените структуру MATLAB (при необходимости).
3. Примените структуру MATLAB к модели.
4. Настройте внешний вид структуры параметра в сгенерированном коде (необязательно).
Можно использовать Simulink.findVars, чтобы узнать, какие переменные используются моделью Simulink.
model = 'sldemo_applyVarStruct'; varList = Simulink.findVars(model, 'WorkspaceType', 'base')
varList = 20x1 VariableUsage array with properties: Name Source SourceType Users
var = varList(1)
var = VariableUsage with properties: Name: 'Ka' Source: 'base workspace' SourceType: 'base workspace' Users: {'sldemo_applyVarStruct/Controller/Gain3'}
Можно использовать Simulink .BlockDiagram.createVarStruct, чтобы сгенерировать структуру MATLAB, содержащую все числовые переменные из базового рабочего пространства или словаря данных, используемого моделью.
Simulink.BlockDiagram.createVarStruct(model, 'ModelParam')
Created variable 'ModelParam' in global namespace visible to the model.
Переменная ModelParam является структурой MATLAB, которая содержит числовые переменные в виде полей (отсортированных по имени).
Примечание:
Модель и все данные, которые использует модель, должны быть загружены перед вызовом Simulink .BlockDiagram.createVarStruct.
Вы не можете присвоить структуре MATLAB то же имя что и существующей переменной.
Исходная структура содержит все переменные на одном уровне иерархии. Можно изменить структуру перед применением ее к модели. Для примера переупорядочьте поля параметра, добавьте дополнительные уровни к параметрам модели группы или добавьте дополнительные поля.
Примечание:
Не изменяйте имена листовых полей в структуре.
Не удаляйте исходные переменные до завершения процесса миграции.
1. Один из способов сделать это - использовать Simulink.saveVars, чтобы записать структуру в скрипт MATLAB и внести изменения в файл.
Simulink.saveVars('sldemo_applyVarStruct_data.m','ModelParam') edit sldemo_applyVarStruct_data.m
2. Отредактируйте скрипт MATLAB по мере необходимости. Для примера разделите структуру на две структуры.
ControlParam содержит все параметры подсистемы контроллера.
ModelParam 'содержит все другие числовые параметры.
ControlParam = struct; ControlParam.Ka = 0.677; ControlParam.Kf = -1.746; ControlParam.Ki = -3.864; ControlParam.Kq = 0.8156; ControlParam.Tal = [0.3959 1]; ControlParam.Ts = [0.1 1]; ControlParam.W1 = [1 2.971]; ControlParam.W2 = [1 4.144];
ModelParam = struct; ModelParam.Md = -6.8847; ModelParam.Mq = -0.6571; ModelParam.Mw = -0.00592; ModelParam.Swg = 3; ModelParam.Ta = 0.05; ModelParam.Uo = 689.4; ModelParam.Vto = 690.4; ModelParam.Zd = -63.9979; ModelParam.Zw = -0.6385; ModelParam.a = 2.5348; ModelParam.b = 64.13; ModelParam.g = 32.2;
Сохраните измененный файл данных. Вы можете использовать его как функцию предварительной загрузки.
3. Запустите измененный скрипт MATLAB, чтобы создать структуры MATLAB.
sldemo_applyVarStruct_data;
Можно использовать Simulink .BlockDiagram.applyVarStruct, чтобы автоматически заменить ссылки переменных в блоке схеме эквивалентными ссылками на структуры.
1. Примените структуру MATLAB к модели. Модель будет изменена. Затем можно сохранить его в директории с возможностью записи.
[applied,unapplied]=Simulink.BlockDiagram.applyVarStruct(model,'ControlParam')
[applied,unapplied]=Simulink.BlockDiagram.applyVarStruct(model,'ModelParam')
Примечание:
Можно использовать 'preview' ApplyMode, чтобы получить информацию о том, что будет изменено, не меняя модель на самом деле:
Simulink.BlockDiagram.applyVarStruct(model,'ModelParam', 'ApplyMode', 'preview')
Если модель была скомпилирована, можно использовать 'cached' SearchMethod, чтобы избежать перекомпиляции модели:
Simulink.BlockDiagram.applyVarStruct(model,'ModelParam', 'SearchMethod', 'cached')
Если неприменимый выход не пуст, можно исследовать причину с помощью Simulink.findVars (модель, 'WorkspaceType', 'base', 'Name', variableName). Вероятными причинами являются: вы изменили имена структурных полей или добавили дополнительные поля; переменная используется блоком, который нуждается в особом факторе, например, диаграммой Stateflow ®, блоком S-Function или Model.
2. Протестируйте структуру MATLAB в измененной модели.
Очистите ненужные переменные и запустите симуляцию, чтобы проверить результаты.
clear; model = 'sldemo_applyVarStruct'; sldemo_applyVarStruct_data;
sim('sldemo_applyVarStruct');
Проверьте наличие предупреждений или ошибок.
Проверьте результаты симуляции.
По умолчанию структура MATLAB не отображается в сгенерированном коде, поскольку числовые значения встроены. Генерация кода требует Coder™ Simulink ®.
1. Чтобы сделать структуру переменной настраиваемой, создайте Simulink. Параметр со значением структуры и классом памяти 'ExportedGlobal'.
p=Simulink.Parameter; p.Value=ControlParam; p.CoderInfo.StorageClass='ExportedGlobal'; ControlParam=p; clear p;
rtwbuild('sldemo_applyVarStruct');
Сгенерированный код теперь содержит определение типа структуры для настраиваемой структуры в model_types.h заголовочном файле. По умолчанию Simulink Coder генерирует автоматическое имя для типа структур параметров. Это имя уникально, но его нелегко распознать.
typedef struct { real_T Ka; real_T Kf; real_T Ki; real_T Kq; real_T Tal[2]; real_T Ts[2]; real_T W1[2]; real_T W2[2]; } struct_mn4cJ7zsH8aqc8bBlbIkqC;
2. Вы можете управлять этим именем типа, используя Simulink .Bus, чтобы задать тип данных объекта Simulink. Параметр.
Можно использовать Simulink .Bus.createObject для создания объекта шины той же формы, что и структура MATLAB.
busInfo=Simulink.Bus.createObject(ControlParam.Value)
Присвойте имя объекта шины Simulink. Параметр атрибут DataType.
ParamType=eval(busInfo.busName); ControlParam.DataType='Bus: ParamType'; clear(busInfo.busName); clear busInfo;
ПРИМЕЧАНИЕ. Только Simulink. Параметр можете принять имя объекта шины как тип данных. Для структур MATLAB Simulink Coder генерирует автоматическое имя для типа.
3. Сохраните файл данных, чтобы включить измененные переменные рабочей области.
Simulink.saveVars('sldemo_applyVarStruct_data.m', '-append')
4. Перегенерируйте код для измененной модели (требует Simulink Coder).
rtwbuild(model);
Теперь сгенерированное определение типа появляется следующим образом:
typedef struct { real_T Ka; real_T Kf; real_T Ki; real_T Kq; real_T Tal[2]; real_T Ts[2]; real_T W1[2]; real_T W2[2]; } ParamType;
Определение параметра:
ParamType ControlParam = { 0.677, -1.746, -3.864, 0.8156, {0.3959, 1.0}, {0.1, 1.0}, {1.0, 2.971}, {1.0, 4.144} }