MATLAB 関数の定義による MATLAB コードの再利用
Stateflow® チャートにおける MATLAB® 関数は、アルゴリズム記述用のグラフィカル要素です。アルゴリズムは組み込みの MATLAB 関数を呼び出して簡単に実装できます。代表的な使用例は、以下のとおりです。
行列指向型の計算
データの解析と視覚化
このタイプの関数は、グラフィカルな Stateflow 構造よりも MATLAB を使ったほうが簡単に記述できるアルゴリズムのコード作成に便利です。MATLAB 関数では、組み込みアプリケーションのための効率性の高い量産品質の C コードを生成するために、最適化も行われます。
MATLAB 関数は、チャート、ステート、またはサブチャート内の任意の場所に配置できます。関数の場所により、その関数を呼び出すことのできるステートと遷移の集合が判定されます。
ある特定のステート、またはサブチャートとそのサブステートの内部で関数を呼び出す場合は、MATLAB 関数をそのステートまたはサブチャートに配置します。この関数は、そのステートまたはサブチャートの親や先祖に含まれる同じ名前の関数よりも優先されます。
チャートの任意の部分から関数を呼び出す場合は、MATLAB 関数をチャート レベルに配置します。
関数をモデル内の任意のチャートから呼び出す場合は、MATLAB 関数をチャート レベルに配置し、チャートレベルの関数のエクスポートを有効にします。詳細については、再利用のための Stateflow 関数のエクスポートを参照してください。
メモ
MATLAB 関数は、Stateflow 階層で自分より上にあるチャートとステート データにアクセスできます。
たとえば、以下の MATLAB 関数の名前は stdevstats
です。引数 vals
を取り、出力値 stdevout
を返します。
vals
内の値の標準偏差を計算するために、この関数は以下のコードを使用します。
function stdevout = stdevstats(vals) %#codegen % Calculates the standard deviation for vals len = length(vals); stdevout = sqrt(sum(((vals-avg(vals,len)).^2))/len); function mean = avg(array,size) mean = sum(array)/size;
チャート内での MATLAB 関数の定義
オブジェクト パレットで、MATLAB 関数のアイコン をクリックします。
チャート キャンバスで、新しい MATLAB 関数の位置をクリックします。
関数のシグネチャ ラベルを入力します。
関数のシグネチャ ラベルは、関数の名前と、その引数と戻り値の正式名称を指定します。シグネチャ ラベルの構文は以下のとおりです。
複数の戻り値と複数の入力引数を指定できます。戻り値と入力引数として、値のスカラー、ベクトル、または行列を指定できます。戻り値が 1 つのみの関数では、シグネチャ ラベルの大かっこを省略します。[return_val1,return_val2,...] = function_name(arg1,arg2,...)
引数と戻り値の両方に同じ変数名を使用できます。入力と出力で同じ変数を使用する場合は、"インプレース データ" を作成します。たとえば、以下のシグネチャ ラベルをもつ関数では、変数
y1
およびy2
を、入力と出力の両方として使用します。この関数を C コードにエクスポートすると、生成コードは[y1,y2,y3] = f(y1,u,y2)
y1
およびy2
を参照渡しされたインプレース引数として処理します。インプレース データを使用すると、生成コードが中間データをコピーする回数が減少するため、コードがより効率的になります。[シンボル] ペインおよびモデル エクスプローラーでは、関数に属するデータ項目として、関数シグネチャの引数と戻り値が表示されます。引数のスコープは
[入力]
です。戻り値のスコープは[出力]
です。データ プロパティの設定の説明に従って、各引数および戻り値のデータ プロパティを指定します。引数と戻り値が同じ名前である場合、引数のプロパティのみを編集できます。戻り値のプロパティは読み取り専用です。
関数をプログラミングするには、関数ボックスをダブルクリックして MATLAB Function ブロック エディターを開きます。
MATLAB Function ブロック エディターで、関数を実装する MATLAB コードを入力します。詳細については、チャート内での MATLAB 関数のプログラミングを参照してください。
関数に必要な追加のデータ項目を作成します。詳細については、モデル エクスプローラーによるデータの追加を参照してください。
関数からは、専用のデータや、親ステートまたはチャートに属しているデータにアクセスできます。関数内のデータ項目には、以下のいずれかのスコープを設定できます。
Constant
— すべての関数呼び出しで、その初期値を保持する定数データ。Parameter
— すべての関数呼び出しで、その初期値を保持するパラメーター データ。
MATLAB 関数では、ローカル データまたは一時的な関数データを明示的に作成する必要はありません。代わりに、未定義の変数を使用して、関数呼び出しの残りの部分でのみアクセス可能な値を格納できます。関数の呼び出し全体で維持される値を格納するには、チャート レベルでローカル データを使用するか、キーワード
persistent
を使用します。
ステートと遷移における MATLAB 関数の呼び出し
MATLAB 関数は、任意のステートまたは遷移のアクション、または他の関数から呼び出すことができます。MATLAB 関数をエクスポートする場合は、モデル内の任意のチャートから呼び出すことができます。関数のエクスポートの詳細については、再利用のための Stateflow 関数のエクスポートを参照してください。
MATLAB 関数を呼び出すには、関数シグネチャを使用し、関数シグネチャの各仮引数に実際の引数の値を設定します。
[return_val1,return_val2,...] = function_name(arg1,arg2,...)
実際の引数と仮引数のデータ型が異なる場合、関数は実際の引数を仮引数のデータ型にキャスト (変換) します。
MATLAB 関数のプロパティの指定
以下に示すプロパティは、MATLAB 関数が Stateflow チャート内の他のコンポーネントとどのように相互作用するかを指定します。これらのプロパティは、[プロパティ インスペクター]、モデル エクスプローラー、または [MATLAB 関数] プロパティ ダイアログ ボックスで変更できます。
[プロパティ インスペクター] を使用するには、次を行います。
[モデル化] タブの [データの設計] で、[プロパティ インスペクター] を選択します。
Stateflow エディターで、MATLAB 関数を選択します。
[プロパティ インスペクター] で、遷移のプロパティを編集します。
モデル エクスプローラーを使用するには、次を行います。
[モデル化] タブの [データの設計] で、[モデル エクスプローラー] を選択します。
[モデルの階層構造] ペインで、MATLAB 関数を選択します。
[ダイアログ] ペインで、MATLAB 関数のプロパティを編集します。
MATLAB 関数プロパティのダイアログ ボックスを使用するには、次を行います。
Stateflow エディターで、MATLAB 関数を右クリックします。
[プロパティ] を選択します。
プロパティ ダイアログ ボックスで、MATLAB 関数のプロパティを編集します。
これらのプロパティは、Stateflow.EMFunction
オブジェクトを使用してプログラムで変更することもできます。Stateflow プログラム インターフェイスの詳細については、Stateflow API の概要を参照してください。
名前
関数名。関数名のリンクをクリックして、MATLAB Function ブロック エディターで関数を開きます。
関数インライン オプション
生成コード内の関数のインライン化を制御します。
自動
— 内部計算に基づいて関数をインライン化するかどうかを判定します。インライン化
— 他のチャートにエクスポートせず、反復処理の一部に含まれていない場合、関数はインライン化されます (反復処理が発生するのは、関数が自分自身を直接的に呼び出している場合や、他の関数呼び出しを介して間接的に呼び出している場合です)。関数
— 関数をインライン化しません。
このプロパティは、[プロパティ インスペクター] では使用できません。
ラベル
関数のシグネチャ ラベル。関数シグネチャ ラベルは、関数の名前と、その引数と戻り値の正式名称を指定します。このプロパティは、[プロパティ インスペクター] では使用できません。
整数オーバーフローで飽和
生成コードで整数オーバーフローが飽和するかどうかを指定します。詳細については、チャート データの整数オーバーフローの処理を参照してください。
このプロパティは、C をアクション言語として使用するチャート内の MATLAB 関数にのみ適用されます。MATLAB をアクション言語として使用するチャート内では、データの動作はチャートの整数オーバーフローで飽和プロパティの値に依存します。
このプロパティは、[プロパティ インスペクター] では使用できません。
MATLAB 関数 fimath
MATLAB 関数の fimath
プロパティを定義します。指定される fimath
プロパティは、MATLAB 関数で作成されるすべての fi
オブジェクトと fimath
オブジェクトに関連付けられます。次のオプションのいずれかを選択します。
MATLAB と同じ — 関数は現在のグローバル
fimath
と同じfimath
プロパティを使用します。エディット ボックスが淡色表示され、現在のグローバルfimath
が読み取り専用で表示されます。グローバルfimath
とfimath
オブジェクトの詳細については、Fixed-Point Designer™ ドキュメンテーションを参照してください。それ以外を指定 — 次のいずれかの方法により、独自の
fimath
オブジェクトを指定します。fimath
オブジェクトをエディット ボックス内で作成する。fimath
オブジェクトを MATLAB またはモデル ワークスペース内で作成して、その変数名をエディット ボックスに入力する。
このプロパティは、C をアクション言語として使用するチャート内の MATLAB 関数にのみ適用されます。MATLAB をアクション言語として使用するチャート内では、データの動作はチャートのMATLAB チャート fimathプロパティの値に依存します。
このプロパティは、[プロパティ インスペクター] では使用できません。
説明
説明 — MATLAB 関数の説明。
ドキュメント リンク
MATLAB 関数のオンライン ドキュメンテーションへのリンク。HTML ファイルまたは MATLAB コマンド ウィンドウのテキストとしてドキュメンテーションを表示する、Web の URL アドレスまたは MATLAB コマンドを入力できます。[ドキュメント リンク] ハイパーリンクをクリックすると、Stateflow でリンクが評価され、ドキュメンテーションが表示されます。
参考
オブジェクト
ツール
- モデル エクスプローラー (Simulink)