Level-2 MATLAB s-functionはどのように使用しますか?

12 ビュー (過去 30 日間)
MathWorks Support Team
MathWorks Support Team 2018 年 4 月 2 日
編集済み: MathWorks Support Team 2018 年 4 月 2 日
Level-2 MATLAB s-functionの使用方法を教えてください。同じくMATLABプログラムで内容を記述するMATLAB functionブロックとどう違うのかがわかりません。どう使い分けるのでしょうか。

採用された回答

MathWorks Support Team
MathWorks Support Team 2018 年 4 月 2 日
編集済み: MathWorks Support Team 2018 年 4 月 2 日
Level-2 MATLAB s-functionは、figureへのグラフィック描画などのMATLAB固有の関数やシステムオブジェクトを使用し、さらに連続状態や離散状態を必要とする場合に有用な機能です。
今回は例題として、XYグラフを表示するLevel-2 MATLAB s-functionを作成します。
Simulinkで動作するXYグラフを作成するには、MATLAB固有の機能であるfigureへのプロット、および固定サイズバッファを利用した表示データ更新が必要です。
これらを実現するには、コールバック関数DoPostPropSetupの中でワークベクトル(状態量)の条件を定義し、バッファ長分のメモリを確保して毎ステップ描画しつつ、バッファ状態を更新します。今回は離散状態を定義できるよう、DWORKベクトルを以下のように定義して使用します。X軸データ、Y軸データのほか、入力データがバッファに溜まりきるまでの描画を調整するために、ステップ数をカウントする変数countも定義します。
function DoPostPropSetup(block)
block.NumDworks = 3;%3種類のdworkベクトルを定義する
block.Dwork(1).Name = 'x0';
block.Dwork(1).Dimensions = block.DialogPrm(1).Data;%描画に使用する信号長
block.Dwork(1).DatatypeID = 0;
block.Dwork(1).Complexity = 'Real';
block.Dwork(1).UsedAsDiscState = true;
block.Dwork(2).Name = 'y1';
block.Dwork(2).Dimensions = block.DialogPrm(1).Data;%描画に使用する信号長
block.Dwork(2).DatatypeID = 0;
block.Dwork(2).Complexity = 'Real';
block.Dwork(2).UsedAsDiscState = true;
block.Dwork(3).Name = 'count';
block.Dwork(3).Dimensions = 1;
block.Dwork(3).DatatypeID = 0;
block.Dwork(3).Complexity = 'Real';
block.Dwork(3).UsedAsDiscState = true;
%endfunction
また、今回はバッファ長と表示範囲を可変できるようにダイアログパラメータとし、MATLAB S-functionの引数に指定しています。
パラメータは、ファイル>モデルプロパティ>モデルコールバックで以下の値を定義しています。
slen = 5000;%表示に使用するデータバッファのサイズ
Xlim = [-2 2];%X表示範囲
Ylim = [-2 2];%Y表示範囲
回答欄上部から、R2017a以降のバージョンで使用可能なサンプルモデルがダウンロード可能です。
サンプルモデルを実行すると、以下のようにSimulink搭載のXYプロットと同様の描画がMATLAB s-functionで実行できることがわかります。
Level-2 MATLAB s-functionの詳細は
からご参照頂けます。
MATLAB functionブロックとの使い分け
Simulinkシミュレーションにおいて、Level-2 MATLAB s-functionは毎ステップMALTABを呼び出してインタプリタ実行するのに対し、MATLAB functionブロックはMATLABプログラムから自動的にCコードを生成してライブラリビルドして使用するという仕組みの違いがあります。この違いにより、一般的にMATLAB functionブロックの方が高速に実行可能ですが、MATLAB functionブロックではC言語コードへの変換に対応していない関数やシステムオブジェクトを使用することはできません。MATLAB functionブロックでもCコード生成に非対応の関数に対してcoder.extrinsicオプションを付与すると実行可能にはなりますが、その結果毎ステップMATLABを呼び出すことになり、高速に実行できる利点が失われます。
また、MATLAB functionブロックは基本的にはプログラムを逐次実行することを想定しており、前ステップの状態を持ち越すような処理には向いていません。
これらの条件では、Level-2 MATLAB s-functionを使用するのが有用です。Level-2 MATLAB s-functionは常にインタプリタ実行されることで高速な処理は望めませんが、その代わりMATLABで提供されるすべての関数、システムオブジェクトが使用可能です。また、状態更新のコールバック関数が用意されており、連続状態、離散状態のどちらも保持することが可能です。
※類似機能にMATLAB systemブロックがありますが、現在のところMATLAB systemは連続状態の定義に対応しておらず、離散状態のみに対応しています。
以上から、最終的にMATLAB functionブロックに対するCコード生成を目的とせず、coder.extrinsic関数を使用するような処理に対してはLevel-2 MATLAB s-functionの使用が有用と言えます。

その他の回答 (0 件)

カテゴリ

Help Center および File ExchangeAuthor Blocks Using MATLAB S-Functions についてさらに検索

製品


リリース

R2018a

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!