Main Content

ラピッド プロトタイピング モデル関数

ラピッド プロトタイピング コードでは、メイン プログラム (main.c または main.cpp) とインターフェイス接続する以下の関数を定義します。

  • Model(): モデル登録関数。この関数は、モデルに使用される作業領域 (ポインターを様々なデータ構造体に割り当て、設定するなど) を初期化します。モデル登録関数は、関数 MdlInitializeSizes と関数 MdlInitializeSampleTimes を呼び出します。これらの 2 つの関数は、S-Function の mdlInitializeSizes メソッドと mdlInitializeSampleTimes メソッドに非常によく似ています。

  • MdlStart(void): モデル登録関数 MdlInitializeSizes および MdlInitializeSampleTimes が実行された後で、MdlStart を呼び出すことにより、メイン プログラムが実行を開始します。このルーチンは起動時に一度呼び出されます。

    関数 MdlStart には以下の 4 つの基本的な部分があります。

    • 状態をもつルート モデルの各ブロックの状態を初期化するコード。サブルーチンは、条件付き実行サブシステムの「initialize states」ルーチンに対して呼び出されます。

    • モデルの各ブロックの 1 回の初期化 (スタート) 関数により生成されたコード

    • ルート モデルに常駐する Function-Call Subsystem、トリガーされた内部ブロック、イネーブル メソッドをもつルート モデルのブロックを有効にするコード。Simulink® のブロックは、イネーブル メソッドまたはディセーブル メソッドをもつことができます。イネーブル メソッドはブロックが実行を開始する直前に呼び出され、ディセーブル メソッドはブロックが実行を終了した直後に呼び出されます。

    • 出力値が定数であるモデル内の各ブロックのコード。ブロックのパラメーターが生成コード内で調整可能でなく、コード ジェネレーターが定数畳み込みでこのブロック コードを排除できない場合にのみ、このブロック コードが関数 MdlStart に現れます。

  • MdlOutputs(int_T tid): MdlOutputs は、ブロックの出力を更新します。tid (タスク識別子) パラメーターは、サンプル時間に基づいていつブロックを実行するかをマップするタスクを識別します。このルーチンは、メジャー タイム ステップ中、およびマイナー タイム ステップ中に、メイン プログラムによって呼び出されます。メジャー タイム ステップとは、メイン プログラムが実際のタイム ステップを取る時間です (つまり、特定のタスクを実行する時間です)。モデルに連続状態がある場合、マイナー タイム ステップが使用されます。マイナー タイム ステップは、主要出力間の点である積分ステージをソルバーが生成する時間です。これらの積分ステージは、連続状態を進行させるために使用する微係数を計算するために使用されます。

  • MdlUpdate(int_T tid): MdlUpdate は、作業ベクトルに保存されている状態の情報および作業ベクトル状態の情報 (連続でも離散でもない状態) を更新します。tid (タスク識別子) パラメーターは、どのサンプル時間がアクティブかを示すタスクを識別します。これによって、アクティブなブロックの状態のみを条件付きで更新できます。このルーチンは、主要な MdlOutputs が実行された後で、インターフェイスによって呼び出されます。また、ソルバーが呼び出され、その積分ステージの間にソルバーが model_Derivatives をマイナー ステップで呼び出します。連続状態をもつすべてのブロックには、同一数の微係数があります。これらのブロックは、ソルバーが状態を積分できるよう、微係数を計算することが必要となります。

  • MdlTerminate(void): MdlTerminate には、ブロック シャットダウン コードが含まれています。MdlTerminate は、リアルタイム プログラムの終了部分として、インターフェイスによって呼び出されます。

上の関数の内容は、モデルのブロックに直接関係しています。Simulink ブロックは、以下の式に一般化することが可能です。

y=f0(t,xc,xd,u)

出力 y は、連続状態 xc、離散状態 xd、および入力 u の関数です。各ブロックは、MdlOutputs のセクションに特定の式を書き込みます。

xd+1=fu(t,xd,u)

離散状態 xd は、現在の状態と入力の関数です。離散状態のある各ブロックでは、MdlUpdate における状態が更新されます。

x˙=fd(t,xc,u)

微係数 x は、現在の入力の関数です。連続状態のある各ブロックは、model_Derivatives のソルバー (ode5 など) に微係数を提供します。微係数は、連続状態を積分して次の値を生成するためにソルバーが使用します。

出力 y は、一般にブロック I/O 構造体に書き込まれます。ルートレベルの Outport ブロックは、外部出力構造体への書き込みを行います。連続状態と離散状態は、状態構造体に保存されます。入力 u は、ブロック I/O 構造体にある別のブロックの出力、外部入力 (外部入力構造体にある)、または状態から開始します。これらの構造体は、Simulink Coder™ ソフトウェアが生成する model.h ファイルで定義されます。

次の例は、model.c ファイルに書き込まれる C コードのラピッド プロトタイピング スタイルの一般的な内容を示しています。

この図は、ラピッド プロトタイピングの生成コードの実行を説明するフロー チャートを示しています。

ラピッド プロトタイピング実行フロー チャート

各ブロックは、実装しているアルゴリズムに従って、特定の Mdl ルーチンにコードを配置します。ブロックには、入力、出力、パラメーター、状態のほか、一般的な項目があります。たとえば、一般に、ブロックの入出力は、ブロック I/O 構造体 (model_B) に書き込まれます。また、接続が切断された場合に積分器 (model_X) の状態端子に接続したり、あるいは接地を取る場合に接地 (rtGround) に接続すると、ブロックの入力は、外部入力構造体 (model_U) や状態構造体から開始することもできます。また、ブロックの出力は、外部出力構造体 (model_Y) に接続することもできます。この図は、これらの項目間の一般的なマッピングを示します。

生成コードのデータ表示

以下のリストは、前の図に示す構造体を定義しています。

  • ブロック I/O 構造体 (model_B):この構造体は、ブロックの固定出力信号で構成されています。ブロックの出力信号数は、モデルの非バーチャル ブロックのデータ出力端子幅の合計です。ブロック I/O 最適化を有効にする場合、Simulink および Simulink Coder の各製品では、以下を実行すると、model_B 構造体のサイズが縮小されます。

    • model_B 構造体の要素を再利用する

    • 他の要素をローカル変数にする

    これらの最適化の詳細については、生成されたコードによる内部信号、状態、パラメーター データの保存方法を参照してください。

    構造体のフィールド名は、ブロックの出力信号名 (存在する場合)、あるいは出力信号のラベルが付いていない場合にはブロック名と端子数により決定されます。

  • ブロック状態構造体:連続状態構造体 (model_X) には、連続状態をもつモデルのブロックの連続状態の情報が含まれています。離散状態は、DWork vector (model_DWork) と呼ばれるデータ構造体に保存されます。

  • ブロック パラメーター構造体 (model_P):パラメーター構造体には、実行中に変更可能なブロック パラメーター (Gain ブロックのパラメーターなど) が含まれています。

  • 外部入力構造体 (model_U):外部入力構造体は、ルートレベルの Inport ブロック信号で構成されています。フィールド名は、存在する場合はブロックの出力信号名、出力信号にラベル付けされていない場合には Inport ブロック名により決定されます。

  • 外部出力構造体 (model_Y):外部出力構造体は、ルートレベルの Outport ブロックで構成されています。フィールド名は、モデルのルートレベルの Outport ブロックの名前によって決まります。

  • 実数作業、整数作業、ポインター作業の各構造体 (model_RWorkmodel_IWorkmodel_PWork):ブロックは、実数作業範囲、整数作業範囲、またはポインター作業範囲が必要な可能性があります。たとえば、Memory ブロックでは、各信号で実数作業要素を使用します。これらの範囲は、内部状態や類似情報を保存するために使用されます。

関連するトピック