OMLカスタムブロックの定義

Tutorial Level: Intermediate OMLカスタムブロックを使って、スプリングダンパモデルの挙動を定義する方法をご紹介します。



このチュートリアルのファイル

Spring_Damper_oml_block.scm

このチュートリアルで作成したモデルの完成版は、デモブラウザからアクセスできます:Activate > Custom Blocks > Spring_Damper_oml_block.scm。または、<installation_directory>/_demos/Custom Blocks/Spring_Damper_oml_block.scmをインストールします。

スプリングダンパモデルの作成

OMLカスタムブロック、Step GeneratorおよびScopeブロックを使って、簡単なスプリングダンパモデルを作成します。F、M、k_s、k_dの4つのパラメータでモデルのコンテキストを定義します。これらはそれぞれシステムの適用された力、質量、剛性、ダンピングを表し、OMLカスタムブロックのシミュレーション機能を通して呼び出されます。
  1. OMLカスタムブロック、Step GeneratorおよびScopeブロックをモデル図にドラッグします。
    • Palettes > Activate > CustomBlocks > OMLCustomBlock
    • Palettes > Activate > Signal Generators > StepGenerator
    • Palettes > Activate > SignalViewers > Scope
  2. ダイアグラムのアセンブリ:


  3. 保存して、モデルに名前を付けます。
  4. ダイアグラムアイコンを選択します。

  5. システムモデルのContextを定義します。Fは適用された力、Mは質量、k_sはバネ係数、k_dは減衰係数、x0は速度と位置の初期状態を指定します。
    F=2;
    M-2;
    k_s = 1;
    k_d = 1;
    x0 = [0,0];

Step Generatorの定義

  1. Step Generatorブロックをダブルクリックします。
  2. 最終値に、荷重Fを入力します。


  3. ステップ時間と初期値はデフォルトのままにしておきます。

OMLカスタムブロックの定義

OMLカスタムブロックのポート、パラメータ、およびシミュレーション関数を定義します。

  1. モデル内のOml Custom Blockをダブルクリックします。
  2. Portsタブを選択します。
    • 入力ポート数に1を入力し、名前をForceにします。
    • システムの入力が直接出力に影響することを指定する、Feedthroughオプションを選択します。
    • 出力ポートに1を入力し、名前をPositionにします。
    • 残りの欄はデフォルトのままにします。


  3. Statesタブを選択します:
    • 初期連続状態には、x0を入力します。
    • 残りの欄はデフォルトのままにします。


  4. Parametersタブを選択します:
    オブジェクトパラメーターの数は4を入力し、以下のように定義します。


Sim関数の定義

  1. SimFunctionタブを選択します。
  2. generate skeletonボタンをクリックし、テキストエディターボタンをクリックします。


    このソフトウェアは、シミュレーション関数とダイアグラムのコンテキストで定義した情報に基づいて、適切なフラグオプションを持つスケルトンコードを生成します。必要なフラグを挿入し、モデルに不要なフラグは無効にします。
    注: 生成されるスケルトンの構造はCCustomBlockやPyCustomBlockのような異なるカスタムブロックでも同じで、導入されるプログラミング言語の構文を尊重しています。


  3. スプリングダンパのシミュレーション機能を完成させるために、以下の画像のように4か所のコードを修正します。
    1. 9行目、追加:Position = x(2);
    2. 17行目、コメント解除:
      vssSetOutputData (block,1, Position, vssGetOutputDataType (block,1));
    3. 20行目、運動方程式を追加:
      xd = [(Force-k_d*x(1)-k_s*x(2))/M ; x(1)];
    4. 21行目、コメントアウトを解除:
      vssSetDerState(block,<derivative value>);
      および、<derivative value>を、drivative state variableを参照に変更:
      vssSetDerState(block,xd);
    作成された新規スクリプトは以下のようになります:


  4. OKをクリックします。
    参考までに、このチュートリアルのスケルトンで提示されているフラグを以下の表で説明します。
    フラグ/API 説明 このチュートリアルで適用される
    Force=vssGetInputData(block,1); vssGetInputDataが呼び出され、Force変数がブロックの信号入力と等しいと定義されます。 Yes
    nevprt=vssGetEventCode(block); GetEventCodeが呼び出され、変数 nevprt がブロックのイベント入力(この場合はnone)と等しくなるように定義されます。 Yes
    x=vssGetState(block); GetStateが呼び出され、変数xが与えられたブロックの状態と等しくなるように定義されます。 Yes
    k_s=vssGetOparData(block,1); GetOparDataが呼び出され、変数k_s が、Parametersタブで定義されている与えられた Object Parameter 1 と等しくなるように定義されます。 Yes
    k_d=vssGetOparData(block,2); GetOparDataが呼び出され、変数k_dが、Parameters タブで定義されている与えられた Object Parameter2と等しくなるように定義されます。 Yes
    F=vssGetOparData(block,3); GetOparDataが呼び出され、変数Fが、Parameters タブで定義されている与えられた Object Parameter 3と等しくなるように定義されます。 Yes
    M=vssGetOparData(block,4); GetOparDataが呼び出され、変数Mが、Parameters タブで定義されている与えられた Object Parameter4と等しくなるように定義されます。また、APIを呼び出すことで、Position = x(2)の計算が可能になります。 Yes
    if flag == vssBlockInitializeFlag このフラグは、シミュレーションの開始時にメモリの確保やファイルやチャンネルを開くために呼ばれます。 No
    elseif flag == vssBlockReinitializeFlag このフラグは、主に定義された入力に基づき状態を更新する連続ブロックに使用されます。例えば、システムの定常状態を求めるために、初期化段階でシミュレータからこのブロックを呼び出すことができます。 No
    elseif flag == vssBlockTerminateFlag このフラグは、ブロックの実行が終了した後、変数のクリア、エクスポート、情報の整理などの最終タスクが必要な場合に、シミュレーションの終了時に1回だけ呼び出されます。 No
    elseif flag == vssBlockOutputUpdateFlag このフラグはシミュレーション中に出力を計算するために呼ばれ、ブロックが起動されるたびに呼び出されます。このチュートリアルでは、トリガーされるOutputはvssSetOuputDataで定義されています。 Yes
    vssSetOutputData (block,1,Position,vssGetOutputDataType(block,1)); vssSetOutputDataが呼び出され、出力が定義されます。 Yes
    vssGetOutputDataTypeは、出力信号のデータ型を割り当てるために呼び出されます。 Yes
    elseif flag == vssBlockDerivativeFlag

    xd = [(Force-k_d*x(1)-k_s*x(2))/M ; x(1)];

    vssSetDerState(block,xd);
    このフラグは、システムに計算を適用するために呼び出されます。このチュートリアルでは、運動方程式(xd = [(Force-k_d*x(1)-k_s*x(2))/M ; x(1)];)を使用します。その後、API vssSetDerStateが呼び出され、運動方程式で解かれたシステムの速度と等しい微分状態が設定されます。 Yes
    elseif flag == vssBlockStateUpdateFlag このフラグは、状態を持つブロックに対して、状態を更新するために呼び出されます。このフラグは、ブロックがアクティブになるたびに呼び出されます。 No

アドバンスト設定の定義

  1. アドバンスト(Advanced)タブを選択します。
  2. アクティベーションモードに、Always Active modeを選択します。これは、ブロックが時間に依存し、シミュレーションの各ステップで継続的に呼び出されることを指定します。


  3. OKをクリックします。
    バネ減衰モデルのセットアップが完了しました。

シミュレーションの実行

  1. シミュレーションパラメータのデフォルト値はそのままにしておきます。
  2. 実行をクリックします。

  3. シミュレーションの実行が終了したら、Scopeブロックをダブルクリックします。


    スコープは、OMLカスタムブロックから出力される信号を、位置 vs. 時間で表示します。