ドキュメンテーション

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

MATLAB Function ブロックを使用したカスタム機能の作成

この例では、MATLAB Function ブロックを使用して、値のベクトルの平均と標準偏差を計算するモデルを使用する方法を示します。

モデルの作成

  1. 新しい Simulink® モデルを作成し、MATLAB Function ブロックを User-Defined Functions ライブラリから挿入します。

  2. Constant ブロックを追加し、その値をベクトル [2 3 4 5] に設定します。2 つの Display ブロックをモデルに追加します。これらのブロックをブロック線図に示すように接続します。

  3. モデルを call_stats_block1 として保存します。

MATLAB Function ブロックのプログラム

ベクトルの値から平均と標準偏差を計算するブロックをプログラムします。

  1. MATLAB Function ブロックをダブルクリックします。MATLAB Function ブロック エディターに既定の関数シグネチャが表示されます。定義された関数シグネチャ内にコードを記述します。

  2. 関数のヘッダー行を次のように編集します。

    function [mean,stdev] = stats(vals)
    

    このコードから、stats という関数を定義します。これは、ベクトル vals の値の統計上の平均と標準偏差を計算します。関数ヘッダーは、vals を関数 stats への引数として宣言し、mean および stdev を関数からの戻り値として宣言しています。

  3. MATLAB Function ブロック エディターで、関数ヘッダーの後に空白行を入力し、以下のコードを追加します。

    % Calculates a statistical mean and a standard
    % deviation for the values in vals.
    
    len = length(vals);
    mean = avg(vals,len);
    stdev = sqrt(sum(((vals-avg(vals,len)).^2))/len);
    plot(vals,'-+');
    
    function mean = avg(array,size)
    mean = sum(array)/size;
    

     関数 length の詳細

     関数 len の詳細

     関数 plot の詳細

  4. モデルを call_stats_block2 という名前で保存します。

関数のビルドとエラーのチェック

Simulink モデルでブロックのプログラミングが終了したら、その関数をビルドしてエラーがないかテストできます。MATLAB Function ブロックを構築するには、サポートされているコンパイラが必要です。MATLAB では既定のコンパイラとして 1 つのコンパイラが自動的に選択されます。システムに MATLAB でサポートされているコンパイラが複数インストールされている場合は、mex -setup コマンドを使用して既定のコンパイラを変更できます。既定のコンパイラの変更 (MATLAB)を参照してください。

シミュレーション ビルドとコード生成ビルド対応コンパイラ

シミュレーションおよびコード生成対応 MATLAB Function ブロックを含んでいるモデルを作成するためのコンパイラの一覧を表示します。

  1. サポートされている互換コンパイラ Web ページへ移動し、該当するプラットフォームを選択します。

  2. Simulink 製品ファミリの表にスクロールします。

  3. シミュレーションに対応する MATLAB Function ブロックを含んでいるモデルを表から探すには、Simulink For Model Referencing, Accelerator mode, Rapid Accelerator mode, and MATLAB Function blocks という見出しの列でチェックマークの入ったコンパイラを見つけます。

    MATLAB Function ブロックを含むモデルを表から探してコードを生成するには、 Simulink Coder™ という見出しの列でチェックマークの入ったコンパイラを見つけます。

コード生成対応コンパイラ

MATLAB Function ブロックを含むモデルのコード生成には、Simulink Coder でのコード生成用に Simulink ソフトウェアがサポートする C コンパイラならどれでも使用できます。対応コンパイラのリストは次の方法でアクセスできます。

  1. サポートされている互換コンパイラ Web ページへ移動します。

  2. 該当するプラットフォームを選択します。

  3. Simulink と関連製品の表で、Simulink Coder という見出しの列でチェックマークの入ったコンパイラを探します。

エラーの追跡と訂正

ビルド プロセスでエラーが発生した場合、[診断ビューアー] ウィンドウにエラーが問題のコードへのリンクと共に列記されます。

次の演習問題には、MATLAB Function ブロック内のエラーを追跡して訂正する方法が示されています。

  1. 関数 stats 内で、ローカル関数 avg を実在しないローカル関数 aug に変更して再コンパイルすると、ウィンドウに次のメッセージが表示されます。[診断ビューアー] ウィンドウにそれぞれの検出されたエラーが赤色の影付き線で表示されます。

  2. Undefined function or variable 'aug' というタイトルのエラーを調べます。選択したエラーの診断メッセージ内で、関数名の後の青いリンクをクリックして、問題のコードを表示します。問題の行が強調表示されて MATLAB Function Block Editor に表示されます。

  3. エラー メッセージには MATLAB 関数の変数や式に関するコンパイル時のデータ型情報を入れたレポートへのリンクも付いています。この情報はデータ型の伝播規則を理解してエラー メッセージを診断する手がかりになります。このレポートの詳細は、MATLAB Function レポートを参照してください。レポートを表示するには、Launch diagnostic report という行の青色に強調表示されたリンクをクリックします。

  4. augavg に戻してエラーを訂正し、コンパイルし直します。

入力と出力の定義

既定の設定では、関数の入力と出力はその端子に付いている信号からデータ型とサイズを継承します。MATLAB Function ブロック用の入力データと出力データがデータ型とサイズを正しく継承しているかチェックします。

  1. MATLAB Function ブロック stats をダブルクリックします。

  2. MATLAB Function ブロック エディターで、[データの編集] を選択します。[Ports and Data Manager] が開き、ここで MATLAB Function ブロックの引数を定義できます。

    左のペインに、MATLAB Function ブロック用に作成した引数 vals と戻り値 mean および stdev が表示されます。valsスコープSimulink からの入力を意味する [Input] に、meanstdevスコープSimulink への出力を意味する [Output] になっていることがわかります。

  3. [端子とデータの管理] の左のペインで、vals の行のどこかをクリックしてその行を強調表示します。

    右側のペインでは、valsデータ プロパティがダイアログ ボックスに表示されます。既定の設定では、入力と出力引数のクラス、サイズ、単位、実数/複素数は、各入力端子や出力端子に対応付けられている信号から継承されます。継承を指定するには、[サイズ]-1 に、[実数/複素数][継承] に、[データ型][継承: Simulink と同じ] に設定します。

    実際に継承されるサイズとデータ型の値はモデルのコンパイル時に設定され、左のペインの [コンパイルされたタイプ] 列と [コンパイルされたサイズ] 列に表示されます。

    入力引数や出力引数のデータ型は、[データ] プロパティ ダイアログ ボックスの[タイプ] フィールドで (double などの) データ型を選択して設定することもできます。また、[サイズ] フィールドに式を入力することによって、入力または出力引数のサイズを指定することもできます。たとえば、vals2-by-3 の行列にする場合は、[サイズ] フィールドに「[2 3]」と入力します。データ型とサイズに関する入力可能な式の詳細は、関数引数の型指定および関数引数のサイズ指定を参照してください。

    メモ

    MATLAB Function ブロック関数に追加する配列用の既定の最初のインデックスは MATLAB の場合と同様に 1 です。

コード生成用のローカル変数の定義

MATLAB Function ブロックの MATLAB アルゴリズムからコードを生成する場合、ローカル変数は、演算で使用したり関数で出力として返す前にクラス、サイズおよび実数/複素数を明示的に割り当てなければなりません (コード生成のためのデータの定義を参照してください)。関数 stats の例では、ローカル変数 len は平均と標準偏差の計算に使用する前に定義されます。

len = length(vals);

一度変数にプロパティを割り当てた後は、関数本体の他の場所でそのクラス、サイズ、実数/複素数を再定義することはできませんが、いくつかの例外があります (変数プロパティの再代入を参照してください)。

MATLAB Function ブロックのコードの生成

  1. MATLAB Function ブロックのプログラムの終わりに保存した call_stats_block2 モデルを開きます。

  2. stats ブロックをダブルクリックします。

  3. [モデルのビルド][ビルド] を選択し、モデル例をコンパイルし、ビルドします。

    [可変ステップ] ソルバーに関連するエラーが表示されると、[コンフィギュレーション パラメーター][ソルバー] から、ソルバー タイプを [固定ステップ] ソルバーに変更し、ビルドに戻ります。固定ステップと可変ステップの違いに関する詳細については、固定ステップ ソルバーと可変ステップ ソルバーを参照してください。

    エラーが発生しなければ、[診断ビューアー] ウィンドウに成功を示すメッセージが表示されます。エラーが発生した場合は、エラーの追跡と訂正で説明されているように、このウィンドウでエラーを追跡できます。

プログラムによる MATLAB Function ブロックへのコードの追加

この例では、プログラムでモデルに MATLAB Function ブロックを追加し、そのブロックに MATLAB コードを組み込む方法を示します。このワークフローは、既に MATLAB コードがある場合に、MATLAB Function ブロックに手動で追加する必要がないため便利です。

  1. myModel というモデルを作成して保存します。

  2. 次のコードを含む MATLAB function を作成し、これを myAdd.m に保存します。

    function c = myAdd(a, b)
    c = a + b;

  3. MATLAB Function ブロックを myModel に追加して myAdd.m の内容を組み込む MATLAB スクリプトを記述します。

    % Add a MATLAB Function block to a model and populate the block with MATLAB
    % code.
    %
    % Copyright 2018 The Mathworks, Inc.
    
    open_system('myModel.slx');
    libraryBlockPath = 'simulink/User-Defined Functions/MATLAB Function';
    newBlockPath = 'myModel/myBlockName';
    % Add a MATLAB Function to the model
    add_block(libraryBlockPath, newBlockPath);
    % In memory, open models and their parts are represented by a hierarchy of
    % objects. The root object is slroot. This line of the script returns the
    % object that represents the new MATLAB Function block:
    blockHandle = find(slroot, '-isa', 'Stateflow.EMChart', 'Path', newBlockPath);
    % The Script property of the object contains the contents of the block,
    % represented as a character vector. This line of the script loads the
    % contents of the file myAdd.m into the Script property:
    blockHandle.Script = fileread('myAdd.m');
    % Alternatively, you can specify the code directly in a character vector.
    % For example: 
    % blockHandle.Script = 'function c = fcn (a, b)';

  4. スクリプトを実行し、myModel の新しい MATLAB Function ブロックを観測します。

  5. ブロックに追加したコードを参照するには、ブロック myBlockName をダブルクリックします。

参考

|

関連するトピック