Main Content

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

入力信号のサイズに基づく出力の計算

この例では、実行時に Stateflow® チャート内の出力データのサイズを変更する方法を示します。Stateflow チャートは、MATLAB® 関数、Simulink® 関数、および MATLAB 真理値表を介して、モデル内の他のチャートおよびブロックとの間で可変サイズ データをやり取りします。この例では、2 つの Stateflow チャートで MATLAB 関数を使用することにより、このプロセスについて説明します。

このモデルでは、一方の Stateflow チャート VarSizeSignalSource が、時相論理を使用して可変サイズ信号を生成します。次に、2 番目のチャート SizeBasedProcessing が、最初のチャートによって生成された信号のサイズに基づいて出力を計算します。

VarSizeSignalSource チャート

VarSizeSignalSource チャートは、時相論理を使用して、3 つのステート間を遷移します。ステートごとに異なるサイズの出力が生成されます。

チャートはソース ブロックと同様に機能します。入力はなく、出力は y という可変サイズ出力のみです。

可変サイズ出力の場合、各次元についてサイズと上限を明示的に指定する必要があります。この場合、y は、長さの上限が 16 のベクトルです。

ステートや遷移は、可変サイズ データとの間で読み取りや書き込みができないため、y は、ステート アクションや遷移ロジックには表示されません。可変サイズ データを含む計算はすべて、チャートの MATLAB 関数で行なわなければなりません。

MATLAB 関数: generateOutput

MATLAB 関数は、可変サイズのチャートレベル データに直接アクセスします。関数への入力または出力としてのデータは渡しません。このチャートでは、関数 generateOutput は、可変サイズ出力ベクトル y を、受信する入力に基づいた数列として作成します。

function generateOutput(len)
%#codegen
assert(len<=16);
y = (1:len)';

MATLAB 関数は、コンパイル時に可変サイズ データの上限を決定できなければなりません。ただし、このケースでは、上限は len であり、モデルがその入力値を実行時に計算します。この情報を提供するために、関数 assertlen の明示的な上限を指定します。この上限は、チャート出力 y に対して指定されている上限と一致します。

SizeBasedProcessing チャート

SizeBasedProcessing チャートは、3 つの MATLAB 関数を使用して、可変サイズ入力 u の値に基づいて、可変サイズ出力 y を計算します。

  • 入力 u は、VarSizeSignalSource チャートによって生成される可変サイズ信号です。

  • 出力 y は可変サイズ信号で、そのサイズは、u がスカラーとベクトルのどちらであるかによって異なります。

チャート VarSizeSignalSource の場合と同様に、可変サイズ データがステート アクションまたは遷移ロジックに表示されることはありません。その代わり、ステートは、MATLAB 関数を呼び出して可変サイズ出力を計算します。遷移は、MATLAB 関数を条件ステートメント内で呼び出して可変サイズ入力を評価します。

MATLAB 関数: isScalarInput

この関数は、チャート入力 u (チャート VarSizeSignalSource によって生成される信号) がスカラー値とベクトル値のどちらであるかをテストします。

function isScalar = isScalarInput
%#codegen
isScalar = length(u)==1;

MATLAB 関数: computeOutput

入力 u がベクトルの場合、この関数はその各値の正弦を出力します。

function computeOutput
%#codegen
y = sin(u);

MATLAB 関数: resetOutput

入力 u がスカラーの場合、この関数は値ゼロを出力します。

function resetOutput
%#codegen
y = 0;

モデルのシミュレーション

  1. モデルを開きます。エディターのキャンバスの上部に並んでいるタブを使用すると、Simulink モデルと 2 つの Stateflow チャートの間の切り替えが可能です。

  2. VarSizeSignalSource チャートからシミュレーションを開始します。チャートのアニメーションを見ると、アクティブ ステートが Scalar ステート、VectorPartial ステート、VectorFull ステートの間で循環していることがわかります。

  3. タブを切り替えて SizeBasedProcessing チャートを表示します。チャートのアニメーションを見ると、アクティブ ステートが Scalar ステートと Vector ステートの間で交互に切り替わっていることがわかります。

  4. タブを切り替えて Simulink モデルに戻ります。Display ブロックに、可変サイズ ベクトルからの 1 個、8 個、および 16 個の値が周期的に表示されます。

関連するトピック