Main Content

Stateflow 構造体へのインデックス付けと値の割り当て

この例では、Stateflow® 構造体の内容、または Stateflow 構造体の配列の内容にアクセスして変更する方法を説明します。Stateflow 構造体は、Simulink.Bus (Simulink) オブジェクトから定義するデータ型です。Stateflow 構造体を使用すると、サイズや型の異なるデータを単一のデータ オブジェクトにまとめることができます。詳細については、Stateflow 構造体を介したバス信号へのアクセスを参照してください。

サブ構造体とフィールドのインデックス付け

Stateflow 構造体のサブ構造体およびフィールドにインデックスを付けるには、ドット表記を使用します。名前の最初の部分は親構造体を識別します。後続の部分は、階層パスに沿って子を識別します。子は個別のフィールドであっても、構造体を含むフィールド (サブ構造体) であってもかまいません。Stateflow 構造体のフィールド名は、構造体を定義する Simulink.Bus オブジェクトの要素名と一致します。フィールドにベクトル、行列または配列が含まれる場合、チャートのアクション言語がサポートするインデックス表記を使用して、その要素にアクセスできます。

たとえば、以下のモデル内のチャートには、入力構造体 (in)、出力構造体 (out)、ローカル構造体 (localbus) およびローカル構造体配列 (subBusArray) が含まれています。

  • チャートは Simulink.Bus オブジェクト BusObject を使用して、入力構造体 in、出力構造体 out、ローカル構造体 localbus を定義します。これらの構造体には sbabc の 4 つのフィールドがあります。

  • フィールド sbSimulink.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 ベースのインデックスを大かっこで区切って使用します。詳細については、ベクトルおよび行列でサポートされている演算を参照してください。

構造体とフィールドへの値の代入

Input 以外のスコープをもつ任意の Stateflow 構造体に書き込むことができます。構造体全体、サブ構造体、または単一のフィールドに値を代入できます。

  • ある構造体を別の構造体に代入するには、両方の構造体を、ベース ワークスペース内の同じ Simulink.Bus オブジェクトから定義します。

  • ある構造体を別の構造体のサブ構造体に代入するには (またはその逆)、同じ Simulink.Bus オブジェクトから構造体とサブ構造体を定義します。

  • ある構造体のフィールドを別の構造体のフィールドに代入するには、両方のフィールドの型とサイズが同じでなければなりません。Stateflow 構造体は、異なる Simulink.Bus オブジェクトから定義できます。

たとえば、この例のチャートは以下の代入を行います。

  • localbus = sb2abc(in.sb) — 構造体 localbus と、MATLAB® 関数 sb2abc の出力引数は、同じ Simulink.Bus オブジェクト BusObject から定義されています。この関数は、その入力をベクトル、3 行 2 列の行列、スカラーの 3 つの要素に分解します。この関数は、これらの要素を出力のフィールド ab および c に返します。この関数の詳細については、MATLAB 関数内の Simulink バス信号へのアクセスを参照してください。

  • subBusArray(1) = in.sb — 構造体 subBusArray(1) とサブ構造体 in.sb は、同じ Simulink.Bus オブジェクト SubBus から定義されています。

  • subBusArray(2) = abc2sb(in) — 構造体 subBusArray(2) とグラフィカル関数 abc2sb の出力引数は、同じ Simulink.Bus オブジェクト SubBus から定義されています。この関数は、関数の入力のフィールド ab、および 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 = localbusoutlocalbus の両方が同じ Simulink.Bus オブジェクト BusObject から定義されています。

  • out.sb = subBusArray(idx) — サブ構造体 out.sb と構造体 subBusArray(idx) は、同じ Simulink.Bus オブジェクト SubBus から定義されています。

シミュレーションの実行

この例をシミュレートすると、チャートは入力構造体のフィールド sb の値を使用して、出力構造体の abc の各フィールドに入力します。パラメーター idx は構造体の配列 subBusArray の要素を選択して、出力のサブ構造体 sb として使用します。この例の idx は 2 に等しいため、チャートは入力構造体のフィールド abc の値を使用して、サブ構造体に入力します。

idx に異なる値を使用すると、サブ構造体 out.sb には、in.sb と同じ値、in.sb の転置、または 3 行 3 列の魔方陣が含まれます。

参考

(Simulink)

関連するトピック