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のフィールドcin.a(1)— 入力構造体inのベクトル場aの最初の要素out.sb— 出力構造体outのサブ構造体sbout.sb.ele— サブ構造体out.sbのフィールドeleout.sb.ele(2,2)— サブ構造体out.sbのフィールドeleの 2 行 2 列目の要素subBusArray(1)— 構造体の配列subBusArrayの最初の要素subBusArray(1).ele— 構造体subBusArray(1)のフィールドelesubBusArray(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)