入力信号のサイズに基づく出力の計算
この例では、Stateflow® チャートで可変サイズの出力データを定義する方法を示します。このモデルでは、チャート VarSizeSignalSource
で可変サイズ信号を生成します。この信号をチャート SizeBasedProcessing
で解析し、関連する可変サイズ信号を生成します。2 つの信号の値とサイズを Display ブロックで表示します。
可変サイズ データの詳細については、Stateflow チャートでの可変サイズ データの宣言を参照してください。
可変サイズの出力データの生成
Stateflow チャート VarSizeSignalSource
は MATLAB® をアクション言語として使用します。このチャートの時相論理によって、4 つのステート間の遷移がトリガーされます。各ステートは異なるサイズの出力値を生成します。これらは、スカラー、2 要素の列ベクトル、4 要素の行ベクトル、および 2 列 4 行の行列です。
チャートはソース ブロックと同様に動作します。入力はなく、出力は y
という可変サイズ出力のみです。可変サイズ出力の場合、各次元の上限を明示的に指定しなければなりません。この例では、y
の [可変サイズ] プロパティが有効で、その [サイズ] プロパティが信号の最大サイズである [2 4]
に設定されています。
MATLAB をアクション言語として使用するチャートでは、ステート アクションと遷移アクションは、可変サイズのデータの読み取りと書き込みを直接行うことができます。たとえば、このチャートのステートの entry アクションは、y
の値を明示的に計算します。
可変サイズの入力データの処理
Stateflow チャート SizeBasedProcessing
は C をアクション言語として使用します。これらのチャートは、モデル内の他のチャートおよびブロックとの間で可変サイズのデータをやり取りできます。ただし、C チャート内のステート アクションと遷移アクションでは、可変サイズのデータを直接読み取る、または書き込むことはできません。可変サイズのデータを含む計算はすべて、MATLAB 関数、Simulink® 関数、および MATLAB をアクション言語として使用する真理値表で行なわなければなりません。
このチャートには、次の 2 つの可変サイズのデータ オブジェクトがあります。
入力
u
は、VarSizeSignalSource
チャートによって生成される可変サイズ信号です。チャートのプロパティ [可変サイズの配列をサポート] が有効になっているため、このチャートは Simulink モデル内の他のブロックからの可変サイズの入力データを受け入れます。u
の [サイズ] プロパティは-1
に設定され、この入力の最大サイズがチャートVarSizeSignalSource
の出力から継承されることを示しています。
出力
y
は可変サイズ信号で、そのサイズと値は、u
がスカラー、ベクトル、行列のいずれであるかによって異なります。u
の [サイズ] プロパティは、信号の最大サイズである[2 4]
に設定されています。
このチャートはアクション言語として C を使用するため、ステート アクションまたは遷移ロジックに可変サイズ データの名前は表示されません。代わりに、チャートの遷移ロジックは MATLAB 関数 readInputSize
を呼び出して入力 u
のサイズを特定します。同様に、ステート内のアクションは MATLAB 関数 computeOutput
を呼び出して、可変サイズ出力 y
のさまざまなサイズの値を生成します。MATLAB 関数はチャートレベルのデータに直接アクセスできるため、可変サイズのデータを入力または出力としてこれらの関数に渡す必要はありません。
入力のサイズの特定
MATLAB 関数 isScalarInput
は、チャート入力 u
のサイズを特定します。この信号はチャート VarSizeSignalSource
によって生成され、スカラー、2 行 1 列の列ベクトル、1 行 4 列の行ベクトル、または 2 行 4 列の行列にすることができます。この関数は、u
の次元をチャートレベルの出力 z
として保存します。
function readInputSize %#codegen z = size(u); end
可変サイズの出力の生成
MATLAB 関数 computeOutput
は、チャート入力 u
のサイズと値に基づいてチャート出力 y
の値を計算します。
u
がスカラーの場合、関数はスカラー値 0 をy
に代入。u
が列ベクトルの場合、関数はその各要素の正弦を計算し、それらをy
に保存。u
が行ベクトルの場合、関数はその各要素の余弦を計算し、それらをy
に保存。u
が行列の場合、関数はその各要素の平方根を計算し、それらをy
に保存。
いずれの場合も、出力 y
の値のサイズは入力 u
と同じになります。
function computeOutput(key) %#codegen switch key case 0 % scalar y = 0; case 1 % column vector y = sin(u); case 2 % row vector y = cos(u); case 3 % matrix y = sqrt(u); end end
モデルのシミュレーション
エクスプローラー バーの上部にあるタブを使用すると、Simulink モデルと 2 つの Stateflow チャートの間の切り替えが可能です。シミュレーション中:
チャートのアニメーションを見ると、各チャートのアクティブ ステートが
Scalar
ステート、ColumnVector
ステート、RowVector
ステート、VectorPartial
ステート、Matrix
ステートの間で循環していることがわかります。Simulink モデルでは、Display ブロック
Signal Source
およびProcessed Signal
により、可変サイズ信号の 1 ~ 8 個の値が周期的に表示されます。Display ブロック
Size of Signal
と Scope ブロックにより、可変サイズ信号の行数と列数が表示されます。