Stateflow 構造体へのインデックス付けと値の割り当て
この例では、Stateflow® 構造体の内容、または Stateflow 構造体の配列の内容にアクセスして変更する方法を説明します。Stateflow 構造体は、
オブジェクトから定義するデータ型です。Stateflow 構造体を使用すると、サイズや型の異なるデータを単一のデータ オブジェクトにまとめることができます。詳細については、Stateflow 構造体を介したバス信号へのアクセスを参照してください。Simulink.Bus
(Simulink)
サブ構造体とフィールドのインデックス付け
Stateflow 構造体のサブ構造体およびフィールドにインデックスを付けるには、ドット表記を使用します。名前の最初の部分は親構造体を識別します。後続の部分は、階層パスに沿って子を識別します。子は個別のフィールドであっても、構造体を含むフィールド (サブ構造体) であってもかまいません。Stateflow 構造体のフィールド名は、構造体を定義する Simulink.Bus
オブジェクトの要素名と一致します。フィールドにベクトル、行列または配列が含まれる場合、チャートのアクション言語がサポートするインデックス表記を使用して、その要素にアクセスできます。
たとえば、以下のモデル内のチャートには、入力構造体 (in
)、出力構造体 (out
)、ローカル構造体 (localbus
) およびローカル構造体配列 (subBusArray
) が含まれています。
チャートは
Simulink.Bus
オブジェクトBusObject
を使用して、入力構造体in
、出力構造体out
、ローカル構造体localbus
を定義します。これらの構造体にはsb
、a
、b
、c
の 4 つのフィールドがあります。フィールド
sb
はSimulink.Bus
オブジェクトSubBus
から定義されたサブ構造体です。この構造体にはele
というフィールドが 1 つあります。チャートは
Simulink.Bus
オブジェクトSubBus
を使用して、ローカル構造体の配列subBusArray
を定義します。配列のサイズは 4 です。配列の各要素は、ele
という 1 つのフィールドをもつ構造体です。
次のリストは、この例の構造体の仕様に基づいて、ドット表記と数値インデックスを組み合わせる式を示しています。
in.c
— 入力構造体in
のフィールドc
in.a(1)
— 入力構造体in
のベクトル場a
の最初の要素out.sb
— 出力構造体out
のサブ構造体sb
out.sb.ele
— サブ構造体out.sb
のフィールドele
out.sb.ele(2,2)
— サブ構造体out.sb
のフィールドele
の 2 行 2 列目の要素subBusArray(1)
— 構造体の配列subBusArray
の最初の要素subBusArray(1).ele
— 構造体subBusArray(1)
のフィールドele
subBusArray(1).ele(3,4)
— 構造体subBusArray(1)
のフィールドele
の 3 行 4 列目の要素
このチャートでは MATLAB をアクション言語として使用しているため、この例の配列の要素にアクセスするには、1 ベースのインデックスを小かっこで区切って使用します。C をアクション言語として使用するチャートでは、0 ベースのインデックスを大かっこで区切って使用します。詳細については、Stateflow でのベクトルおよび行列の演算を参照してください。
構造体とフィールドへの値の代入
Input
以外のスコープをもつ任意の Stateflow 構造体に書き込むことができます。構造体全体、サブ構造体、または単一のフィールドに値を代入できます。
ある構造体を別の構造体に代入するには、両方の構造体を、ベース ワークスペース内の同じ
Simulink.Bus
オブジェクトから定義します。ある構造体を別の構造体のサブ構造体に代入するには (またはその逆)、同じ
Simulink.Bus
オブジェクトから構造体とサブ構造体を定義します。ある構造体のフィールドを別の構造体のフィールドに代入するには、両方のフィールドの型とサイズが同じでなければなりません。Stateflow 構造体は、異なる
Simulink.Bus
オブジェクトから定義できます。
たとえば、この例のチャートは以下の代入を行います。
localbus = sb2abc(in.sb)
— 構造体localbus
と、MATLAB® 関数sb2abc
の出力引数は、同じSimulink.Bus
オブジェクトBusObject
から定義されています。この関数は、その入力をベクトル、3 行 2 列の行列、スカラーの 3 つの要素に分解します。この関数は、これらの要素を出力のフィールドa
、b
およびc
に返します。この関数の詳細については、MATLAB 関数内の Simulink バス信号へのアクセスを参照してください。subBusArray(1) = in.sb
— 構造体subBusArray(1)
とサブ構造体in.sb
は、同じSimulink.Bus
オブジェクトSubBus
から定義されています。subBusArray(2) = abc2sb(in)
— 構造体subBusArray(2)
とグラフィカル関数abc2sb
の出力引数は、同じSimulink.Bus
オブジェクトSubBus
から定義されています。この関数は、関数の入力のフィールドa
、b
、およびc
の値を結合して、int8
型の 3 行 3 列の行列に再配置します。この関数はこの行列を出力のフィールドele
に返します。subBusArray(3).ele = transpose(in.sb.ele)
— フィールドsubBusArray(3).ele
の型とサイズは、transpose(in.sb.ele)
の結果と同じです。いずれもint8
型の 3 行 3 列の行列です。subBusArray(4).ele = int8(magic(3))
— フィールドsubBusArray(4).ele
の型とサイズは、int8(magic(3))
の結果と同じです。いずれもint8
型の 3 行 3 列の行列です。out = localbus
—out
とlocalbus
の両方が同じSimulink.Bus
オブジェクトBusObject
から定義されています。out.sb = subBusArray(idx)
— サブ構造体out.sb
と構造体subBusArray(idx)
は、同じSimulink.Bus
オブジェクトSubBus
から定義されています。
シミュレーションの実行
この例をシミュレートすると、チャートは入力構造体のフィールド sb
の値を使用して、出力構造体の a
、b
、c
の各フィールドに入力します。パラメーター idx
は構造体の配列 subBusArray
の要素を選択して、出力のサブ構造体 sb
として使用します。この例の idx
は 2 に等しいため、チャートは入力構造体のフィールド a
、b
、c
の値を使用して、サブ構造体に入力します。
idx
に異なる値を使用すると、サブ構造体 out.sb
には、in.sb
と同じ値、in.sb
の転置、または 3 行 3 列の魔方陣が含まれます。
参考
Simulink.Bus
(Simulink)