Simulink API (5) 2種類のブロックプロパティとSimulinkモデルの動き その1


2種類のブロックプロパティとは

今回は、”Simulinkブロックパラメータ”の説明をしつつ、Simulinkモデリングの基本・重要な考え方を2回に分けて述べたいと思います。(文章力大事だね。。。)

Simulinkのブロックプロパティの値を取得する方法としてget_param関数があります。
例えば、図のGainブロックのゲイン値を取得したい場合、次のようになります。

gainValue = get_param(gcbh,'Gain')
gainValue =

    '5'

このプログラム自体は、どのブロックがどういう名前のプロパティを持っているか?がわかっていれば簡単なので、これ以上深堀りしません。

では、同じ図のGainブロックの出力信号のデータ型は同じget_paramを使ってどの様に取得すれば良いでしょうか?

portType = get_param(gcbh,'CompiledPortDataTypes')
portType = 

  0×0 empty struct array with fields:

    Inport
    Outport
    Enable
    Trigger
    State
    LConn
    RConn
    Ifaction
    Reset

はい、間違いです。何も得られませんでした。

Q : Gainブロックの出力信号のデータ型に設定したプロパティ値は何でしょうか?
であれば、次のコマンドで正解ですが、

get_param(gcbh,'OutDataTypeStr')

ans =

    'Inherit: Same as input'

「Gainブロックの出力信号のデータ型は」と問をたてているところがポイントです。

Simulinkは「シミュレーション実行が可能な」ブロックダイアグラムで手軽に実機レスなシミュレーション環境を構築できます。Simulinkブロックは、このシミュレーション実行可能なブロックライブラリで、プロパティ種別として2つのタイプがあります。

  1. 静的なプロパティ
  2. コンパイル型プロパティ

1. 静的なプロパティ

静的なプロパティとは、シミュレーション実行に依らず、一意に定まるプロパティです。

2. コンパイル型プロパティ

コンパイル型プロパティとは、シミュレーション実行直前にresolveされるプロパティです。
データ型、単位、次元、サンプル時間などのプロパティが属します。
では、先程間違えたコマンドの前に「シミュレーション直前」の状態を作ってからプロパティを取得してみましょう。

手順1. コンパイル状態(シミュレーション直前状態)を作り、モデルをロックさせます。
feval(bdroot(gcs),[],[],[],'compile');

Simulinkのキャンバスがグレーになり、モデルの状態が"Compiled"となります。
データ型も更新されGainブロックの出力データ型はdoubleだった表示がint16になります。

手順2. コンパイル型のプロパティを取得します
portType = get_param(gcbh,'CompiledPortDataTypes')

portType = 

  struct with fields:

      Inport: {'int16'}
     Outport: {'int16'}
      Enable: []
     Trigger: []
       State: []
       LConn: []
       RConn: []
    Ifaction: []
       Reset: []
手順3. コンパイル状態を解除します
feval(bdroot(gcs),[],[],[],'term');

はい、出来ました!一件落着。。。

「Simulinkってシミュレーション実行できる」っていうのが大切なんですよね。
Simulink APIを使ってプログラムを作成するときにも、Simulinkモデルは生き物のように扱わないと痛い目にあいます。

次回、その2へ続きます。

修正1:
Gainブロックの出力信号のデータ型に設定したプロパティ値のコマンドが抜けておりましたので、追加しました。