ドキュメンテーション

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

構造体パラメーターへの移行

この例では、構造化されていないワークスペース変数によってパラメーター化されている Simulink® モデルを、MATLAB® 構造体によってパラメーター化されているモデルに変換する方法を示します。この例では、Simulink ユーティリティを使用してベース ワークスペースからのモデル変数を階層構造に整理し、その構造をモデルに適用します。

モデルの説明

モデル sldemo_applyVarStructsldemo_applyVarStruct を開きます。

このモデルでは、ベース ワークスペースからの数値パラメーターをいくつか使用します。

例の要件

この例では、元のモデルを変更し、現在の作業ディレクトリにファイルを作成します。モデル例を保存する場合は、コピーを現在のディレクトリに保存してください。

一般的なワークフロー

構造体パラメーターを使用するためにモデルを移行するには、以下の手順に従います。

1.モデルが使用する数値変数をすべて MATLAB 構造体に収集します。

2.MATLAB 構造体を必要に応じて変更します。

3.MATLAB 構造体をモデルに適用します。

4.生成コード内のパラメーター構造体の外観を設定します (オプション)。

MATLAB 構造体への数値変数の収集

Simulink モデルが使用している変数を確認するには、Simulink.findVars を使用します。

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 を使用します。

ModelParam = Simulink.BlockDiagram.createVarStruct(model)
ModelParam = 

     Ka: 0.6770
     Kf: -1.7460
     Ki: -3.8640
     Kq: 0.8156
     Md: -6.8847
     Mq: -0.6571
     Mw: -0.0059
    Swg: 3
     Ta: 0.0500
    Tal: [0.3959 1]
     Ts: [0.1000 1]
     Uo: 689.4000
    Vto: 690.4000
     W1: [1 2.9710]
     W2: [1 4.1440]
     Zd: -63.9979
     Zw: -0.6385
      a: 2.5348
      b: 64.1300
      g: 32.2000

変数 ModelParam は、名前順の数値変数をフィールドとして含む MATLAB 構造体です。

メモ:

  • モデルとモデルが使用するデータはすべて、Simulink.BlockDiagram.createVarStruct を呼び出す前に読み込まなければなりません。

  • MATLAB 構造体の名前は、いずれかの数値変数と同じにしないでください。

MATLAB 構造体の変更

元の構造体では、1 つのレベルの階層に変数がすべて含まれています。構造体は、モデルに適用する前に変更できます。たとえば、パラメーター フィールドを並べ替えたり、レベルを追加してモデル パラメーターをグループ化したり、フィールドを追加することができます。

メモ:

  • 構造体内のリーフ フィールドの名前は変更しないでください。

  • 元の変数は、移行プロセスが完了するまでクリアしないでください。

1.これを行う 1 つの方法は、Simulink.saveVars を使用して構造体を MATLAB スクリプトに書き込み、ファイル内で変更することです。

Simulink.saveVars('sldemo_applyVarStruct_data.m','ModelParam')
edit sldemo_applyVarStruct_data.m

2.必要に応じて MATLAB スクリプトを編集します。たとえば、構造体を 2 つの構造体に分割します。

  • 'ControlParam' には Controller サブシステム用のすべてのパラメーターが含まれています。

  • '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')

メモ:

  • 'preview' ApplyMode を使用すると、モデルを実際に変更せずに、変更される内容に関する情報を取得できます。

Simulink.BlockDiagram.applyVarStruct(model,'ModelParam', 'ApplyMode', 'preview')
  • モデルがコンパイルされている場合は、'cached' SearchMethod を使用して、モデルがリコンパイルされるのを防ぐことができます。

Simulink.BlockDiagram.applyVarStruct(model,'ModelParam', 'SearchMethod', 'cached')
  • unapplied の出力が空でない場合は、Simulink.findVars(model,'WorkspaceType','base','Name',variableName) を使用してその理由を調査できます。原因としては、構造体のフィールド名を変更したか、フィールドを追加したか、あるいは Stateflow® チャート、S-Function、Model ブロックなどの、特別な考慮が必要なブロックによって変数が使用されているなどが考えられます。

2.変更したモデル内の MATLAB 構造体をテストします。

不要な変数をクリアし、シミュレーションを実行して結果を確認します。

clear;
model = 'sldemo_applyVarStruct';
sldemo_applyVarStruct_data;
sim('sldemo_applyVarStruct');
  • 警告やエラーがないかどうか確認します。

  • シミュレーション結果を確認します。

生成コードに含まれる構造体パラメーターの設定

既定の設定では、MATLAB 構造体は生成コードには表示されません。その理由は、数値がインライン化されているためです。コードを生成するには Simulink® Coder™ が必要です。

1.構造体の変数を調整可能にするには、構造体の値と 'ExportedGlobal' ストレージ クラスを使用して Simulink.Parameter を作成します。

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}
  }
この情報は役に立ちましたか?