Main Content

このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。

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

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

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

Stateflow 構造体のサブ構造体およびフィールドにインデックスを付けるには、ドット表記を使用します。名前の最初の部分は親オブジェクトを識別します。後続の部分は、階層パスに沿って子を識別します。親が構造体に該当する場合は、子は個別のフィールドに該当するか、他の構造体を含むフィールド (サブ構造体) に該当します。Stateflow 構造体のフィールド名は、構造体を定義する Simulink.Bus オブジェクトの要素名と一致します。

たとえば、このモデル内のチャートには、入力構造体 (in)、出力構造体 (out)、および 2 つのローカル構造体 (localbussubbus) が含まれています。

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

  • チャートは Simulink.Bus オブジェクト SubBus を使用して、ローカル構造体 subbus を定義します。この構造体には ele という 1 つのフィールドがあります。

次のリストは、これらの構造体のフィールドにインデックスを付けるために、Stateflow チャートでシンボルをドット表記で解決する方法を示しています。

  • in.c — 入力構造体 in のフィールド c

  • out.sb — 出力構造体 out のサブ構造体 sb

  • in.a(1) — 入力構造体 in のベクトル場 a の最初の値。

  • subbus.ele(2,2) — ローカル構造体 subbus のフィールド ele の 2 行 2 列目の値。

  • in.sb.ele(3,4) — サブ構造体 in.sb のフィールド ele の 3 行 4 列目の値。

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

Input 以外のスコープをもつ Stateflow 構造体、サブ構造体、および構造体のフィールドに値を代入できます。

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

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

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

次のリストは、この例の構造体指定に基づいて、構造体の代入が有効か無効かを示しています。

  • in = localbus; — 無効です。入力構造体には書き込みできません。

  • out = localbus; — 有効です。outlocalbus の両方が同じ Simulink.Bus オブジェクト BusObject から定義されています。

  • subbus = in; — 無効です。構造体 subbusin は、別々の Simulink.Bus オブジェクトから定義されています。

  • subbus = in.sb; — 有効です。構造体 subbus とサブ構造体 in.sb は、同じ Simulink.Bus オブジェクト SubBus から定義されています。

  • in.sb = subbus; — 無効です。入力構造体のサブ構造体には書き込みできません。

  • out.sb = subbus; — 有効です。サブ構造体 out.sb と構造体 subbus は、同じ Simulink.Bus オブジェクト SubBus から定義されています。

  • in.c = out.c; — 無効です。入力構造体のフィールドには書き込みできません。

  • out.sb.ele = subbus.ele; — 有効です。フィールド out.sb.ele の型とサイズは、フィールド subbus.ele と同じです (int8 型の 3 行 3 列の行列)。

  • localbus.a(1) = in.c; — 有効です。値 localbus.a(1) の型とサイズは、フィールド in.c と同じです (double 型のスカラー)。

たとえば、チャートはステート A の entry アクションで関数 abc2sb および sb2abc を呼び出し、その結果をローカル構造体 localbus および subbus に格納します。その後、チャートはローカル構造体 localbussubbus の値を結合し、出力構造体 out に書き込みます。

グラフィカル関数 abc2sbBusObject 型の構造体を取り、SubBus 型の構造体を返します。この関数は、関数の入力のフィールド ab、および c の値を結合して、int8 型の 3 行 3 列の行列に再配置します。その後、この関数はこの行列を出力構造体のフィールド ele として格納します。

MATLAB® 関数 sb2abcSubBus 型の構造体を取り、BusObject 型の構造体を返します。この関数は入力から得たフィールド ele の値を、ベクトル、3 行 2 列の行列、スカラーの 3 つの要素に分解します。この関数は、Simulink.Bus オブジェクト BusObject と同じ構造体をもつローカルの MATLAB struct Y にこれらの要素を格納します。その後、この関数は MATLAB struct Y の値を出力構造体 y に代入します。

function y = sb2abc(u)
% extract data from input structure
E = int8(magic(3));
A = double(u.ele(1:2,1));
B = uint8(u.ele(:,2:3));
C = double(u.ele(3,1));
% create local structure
X = struct('ele',E);
Y = struct('sb',X,'a',A,'b',B,'c',C);
% assign value to output structure
y = Y;
end

シミュレーションの実行

この例をシミュレートすると、チャートは入力バスのフィールド sb の値を使用して、出力バスの abc の各フィールドに入力します。また、チャートは入力バスの abc の各フィールドの値を使用して、出力バスのフィールド sb に入力します。

参考

| (Simulink)

関連するトピック