В этом примере показано, как преобразовать модель 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'}
Для создания структуры MATLAB, содержащей все числовые переменные из базового рабочего пространства или словаря данных, используемого моделью, можно использовать Simulink.BlockDiagram.createVarStruct.
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.m2. При необходимости отредактируйте сценарий 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')
Примечание:
Для получения информации о том, что будет изменено без фактического изменения модели, можно использовать «предварительный просмотр» ApplyMode:
Simulink.BlockDiagram.applyVarStruct(model,'ModelParam', 'ApplyMode', 'preview')
Если модель скомпилирована, во избежание повторной компиляции модели можно использовать «кэшированный» метод SeureMethod:
Simulink.BlockDiagram.applyVarStruct(model,'ModelParam', 'SearchMethod', 'cached')
Если остающаяся без применения продукция не пуста, Вы можете исследовать причину, используя Simulink.findVars (модель, 'WorkspaceType', 'основа', 'Имя', variableName). Вероятные причины: вы изменили имена полей структуры или добавили дополнительные поля; переменная используется блоком, который требует особого внимания, например, диаграмма Stateflow ®, S-функция или блок модели.
2. Проверьте структуру MATLAB в измененной модели.
Удалите ненужные переменные и запустите моделирование для проверки результатов.
clear; model = 'sldemo_applyVarStruct'; sldemo_applyVarStruct_data;
sim('sldemo_applyVarStruct');Проверьте наличие предупреждений или ошибок.
Проверьте результаты моделирования.
По умолчанию структура MATLAB не отображается в сгенерированном коде, поскольку числовые значения встроены. Для создания кода требуется Simulink ® Coder™.
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.Parameter.
Можно использовать Simulink.Bus.createObject для создания объекта шины той же формы, что и структура MATLAB.
busInfo=Simulink.Bus.createObject(ControlParam.Value)
Присвойте имя объекта шины атрибуту Simulink.Parameter DataType.
ParamType=eval(busInfo.busName); ControlParam.DataType='Bus: ParamType'; clear(busInfo.busName); clear busInfo;
ПРИМЕЧАНИЕ. Только Simulink.Parameter может принимать имя объекта шины в качестве типа данных. Для структур 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}
}