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

В этом примере показано, как преобразовать модель 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 global namespace visible to the model.

Переменный 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). Вероятные причины: вы изменили имена полей структуры или добавили дополнительные поля; переменная используется блоком, которому нужно специальное замечание, e.g., график Stateflow®, S-функция или блок Model.

2. Протестируйте структуру MATLAB в модифицированной модели.

Очистите ненужные переменные и запустите симуляцию, чтобы проверять результаты.

clear;
model = 'sldemo_applyVarStruct';
sldemo_applyVarStruct_data;
sim('sldemo_applyVarStruct');
  • Проверяйте на любые предупреждения или ошибки.

  • Проверяйте результаты симуляции.

Конфигурирование параметра структуры, чтобы появиться в сгенерированном коде

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

1. Чтобы сделать переменную структуры настраиваемой, создайте Simulink.Parameter со значением структуры и классом памяти '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 object.

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