Миграция, чтобы структурировать параметры

Этот пример показывает, как преобразовать модель Simulink®, которая параметризована неструктурированными переменными рабочей области к модели, которая параметризована структурой MATLAB®. Пример использует много утилит Simulink, чтобы организовать образцовые переменные из базового рабочего пространства в иерархическую структуру и затем применить структуру к модели.

Образцовое описание

Откройте модель sldemo_applyVarStruct.

Эта модель использует много числовых параметров от базового рабочего пространства.

Требования в качестве примера

Этот пример изменяет исходную модель и создает файлы в текущей рабочей директории. Если вы планируете сохранить модели в качестве примера, сохраните копию в текущем каталоге.

Типичный рабочий процесс

Миграция модели, чтобы использовать параметры структуры выполняет эти шаги:

1. Соберите все числовые переменные, используемые моделью в структуру MATLAB.

2. Измените структуру MATLAB (при необходимости).

3. Примените структуру MATLAB к модели.

4. Сконфигурируйте внешний вид структуры параметра в (дополнительном) сгенерированном коде.

Сбор числовых переменных в структуру MATLAB

Можно использовать 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 base workspace.

Переменный ModelParam является структурой MATLAB, которая содержит числовые переменные как поля (отсортированный по наименованию).

Примечание:

  • Модель и все данные, что образцовое использование должно загрузиться прежде, чем вызвать Simulink. BlockDiagram.createVarStruct.

  • Вы не можете дать структуре MATLAB то же имя как существующая переменная.

Изменение структуры 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;

Применение структуры MATLAB к модели

Можно использовать 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')
  • Если модель была скомпилирована, можно использовать, 'кэшировал' SearchMethod, чтобы избежать образцовой перекомпиляции:

Simulink.BlockDiagram.applyVarStruct(model,'ModelParam', 'SearchMethod', 'cached')
  • Если остающийся без применения вывод не пуст, можно исследовать причину с помощью Simulink.findVars (модель, 'WorkspaceType', 'основа', 'Имя', variableName). Вероятные причины: вы изменили имена полей структуры или добавили дополнительные поля; переменная используется блоком, которому нужно специальное замечание, например, график Stateflow®, S-функция или блок Model.

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. Соедините шиной, чтобы задать тип данных Simulink. Объект параметра.

Можно использовать Simulink. Bus.createObject, чтобы создать шину возражают с той же формой как структура MATLAB.

busInfo=Simulink.Bus.createObject(ControlParam.Value)

Присвойте имя объекта шины Simulink. Атрибут Типа данных параметров.

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}
  }