Main Content

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

Stateflow チャートのカスタム構造体の統合

この例では、Stateflow® チャートのカスタム コードの構造体を使用する方法を説明します。構造体型のデータを C コードで定義し、Stateflow 構造体と Simulink® バス信号と統合することができます。カスタム コードとデータを共有することにより、Stateflow でサポートされている機能を拡張し、既存のコードを利用することができます。詳細については、Stateflow チャートでのカスタム コードの再利用を参照してください。

この例では、Stateflow チャートは Simulink バス信号からのデータを処理し、その結果を別の Simulink バス信号に出力します。入力バス信号と出力バス信号の両方がSimulink.Bus (Simulink)オブジェクト COUNTERBUS により定義されます。チャートでは、Simulink バス信号は Stateflow 構造体 inbus および outbus とインターフェイスをとります。チャートはカスタム C 関数を呼び出して出力構造体 outbus に書き込みます。

C コードでのカスタム構造体の定義

1. C コードで、カスタム ヘッダー ファイルを作成することによって構造体を定義します。ヘッダー ファイルには、このカスタム構造体のプロパティを定義する typedef 宣言が含まれています。たとえば、このモデルでは、ヘッダー ファイル counterbus.h は次の 3 つのカスタム構造体を宣言します。

...
typedef struct {
    int input;
} SIGNALBUS;
typedef struct {
    int upper_saturation_limit;
    int lower_saturation_limit;
} LIMITBUS;
typedef struct {
    SIGNALBUS inputsignal;
    LIMITBUS limits;
} COUNTERBUS;
...

2.バス エディターで、各カスタム構造体の typedef 宣言に一致する Simulink.Bus オブジェクトを定義します。各 Simulink.Bus オブジェクトの [ヘッダー ファイル] フィールドに、一致する typedef 宣言を含むヘッダー ファイルの名前を入力します。

3. カスタム C コードを含むように Stateflow チャートを構成します。

4. モデルをビルドして実行します。

カスタム コードへの Stateflow 構造体の引き渡し

構造体ポインターを引数として取るカスタム コード関数を呼び出す場合は、Stateflow 構造体をアドレスで受け渡します。Stateflow 構造体またはそのフィールドの 1 つのアドレスをカスタム関数に渡すには、& 演算子とドット表記を使用します。

  • &outbus は、Stateflow 構造体 outbus のアドレスを提供します。

  • &outbus.inputsignal は、構造体 outbus のサブ構造体 inputsignal のアドレスを提供します。

  • &outbus.inputsignal.input は、サブ構造体 outbus.inputsignal のフィールド input のアドレスを提供します。

詳細については、Stateflow 構造体へのインデックス付けと値の割り当てを参照してください。

たとえば、この例には、構造体ポインターを引数として取るカスタム C 関数 counterbusFcn が含まれています。カスタム ヘッダー ファイル counterbus.h には、以下の関数宣言が含まれています。

extern void counterbusFcn(COUNTERBUS *u1, int u2, COUNTERBUS *y1, int *y2);

チャートは、以下の関数呼び出しを使用して、アドレスを Stateflow 構造体 counterbus_struct および outbus に渡します。

counterbusFcn(&counterbus_struct, u2, &outbus, &y2);

関数は、チャート入力 u2 の値とローカル構造体 counterbus_struct を読み取ります。また、チャート出力 y2 および出力構造体 outbus に書き込みます。

参考

(Simulink)

関連するトピック