Main Content

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

初期化関数、再初期化関数、リセット関数および終了関数の使用

ブロックの中にはシミュレーションで使用する状態情報を保持するものがあります。たとえば、Unit Delay ブロックはブロックの現在の状態を使用して、次のシミュレーションのタイム ステップの出力信号の値を計算します。

Subsystem ブロックは既定の初期化ルーチンと終了ルーチンをもちます。Initialize Function ブロック、Reinitialize Function ブロック、および Terminate Function ブロックを使用して既定のルーチンにカスタム ルーチンを追加し、ブロックの状態を変更または読み取ることができます。Reset Function ブロックを使用してカスタム ルーチンを実装することもできます。これらの Function ブロックには次が含まれます。

  • 初期化、再初期化、終了の関数呼び出しイベント受信時に結合されたルーチンを実行する、またはリセット関数呼び出しイベント受信時にカスタム ルーチンを実行する Event Listener ブロック。

  • ブロックの状態を初期化または設定する State Writer ブロック、または状態を読み取る State Reader ブロック。

カスタム ルーチンを定義するには、ブロックの内容を編集します。たとえば、次のようにします。

  • State Writer ブロックまたは State Reader ブロックの [状態オーナー ブロック] パラメーターを設定します。

  • さらに State Writer ブロックまたは State Reader ブロックを追加します。

  • Parameter Writer ブロックを追加してブロック パラメーターの値を設定します。パラメーター値の初期化とリセットを参照してください。

  • Data Store Write ブロックを追加してデータ ストアにデータを書き込むか、Data Store Read ブロックを追加してデータ ストアのデータを読み取ります。データ ストアの作成によるグローバル データのモデル化を参照してください。

  • ブロックまたは信号線を追加して State Writer ブロック、Parameter Writer ブロック、および Data Store Write ブロックに値を提供し、State Reader ブロックまたは Data Store Read ブロックによって読み取られる値を書き込むか保存します。

状態をもつモデル コンポーネントの作成

Simulink® ブロックを使用してモデル アルゴリズムを定義できます。この例では、単一の Discrete-Time Integrator ブロックによって、入力信号を統合するためのアルゴリズムを定義します。

  1. 新しい Simulink モデルを開きます。このモデルを Model01 という名前で保存します。

  2. Discrete-Time Integrator ブロックを追加します。既定のパラメーター値として、1.0[ゲイン値] に、0[初期条件] に、[自動][初期条件設定] に、-1[サンプル時間] に設定されていることを確認します。

  3. Constant ブロックを Discrete-Time Integrator ブロックの入力に接続して、入力信号をモデル化します。Scope ブロックを出力信号に接続します。

  4. [コンフィギュレーション パラメーター] ダイアログ ボックスを開きます。ソルバーのシミュレーション パラメーター [タイプ][固定ステップ] に、[ソルバー][自動] に、[固定ステップ サイズ]1 に設定します。

  5. Scope ブロックを開き、シミュレーションを実行します。出力信号は各タイム ステップで 1 ずつ増加します。

ブロックの状態の初期化

一部のモデル アルゴリズムに含まれている状態は初期化することができます。たとえば、センサーの値を読み取るアルゴリズムでは、センサーの初期状態を設定する計算を実行できます。

シミュレーションの最初に、State Writer ブロックを使用してブロックの状態を初期化します。初期化が発生するタイミングを制御するには、State Writer ブロックを含む Initialize Function ブロックを使用します。

  1. Initialize Function ブロックを追加します。

    既定では、Initialize Function ブロックには [イベント タイプ] パラメーターが [初期化] に設定された Event Listener ブロックが含まれます。ブロックには State Writer ブロックと、初期状態値のソースのプレースホルダーとして Constant ブロックも含まれます。

  2. モデルの初期条件。この例では、Constant ブロックの [定数値] パラメーターを 4 に設定します。

  3. 状態ライターを状態オーナーに接続します。[State Writer] ダイアログ ボックスを開きます。状態オーナー セレクター ツリーを展開して [Discrete-Time Integrator] を選択し、[適用] をクリックします。

    State Writer ブロックに状態オーナー ブロックの名前が表示されます。状態オーナー ブロックに State Writer ブロックへのリンクを示すタグが表示されます。タグの上のラベルをクリックすると、State Writer ブロックに移動するリンクが示されたリストが開きます。

  4. シミュレーションを実行し、モデルがエラーなしにシミュレートされることを確認します。

    Initialize Function ブロックはシミュレーションの最初に実行されます。出力信号は初期値 4 で開始され、シミュレーションの終わりまでに 1 ずつ増加します。

ブロックの状態のリセット

シミュレーション中は、State Writer ブロックを使用してブロックの状態をリセットできます。リセットが発生するタイミングを制御するには、Reset Function ブロックを使用します。

メモ

ブロックの状態をリセットするには、Reinitialize Function ブロックまたは Reset Function ブロックのどちらも使用できます。Reinitialize Function ブロックと Reset Function ブロックはいずれも、ブロックの状態への書き込みを実行したり、ユーザーがブロック設定時に指定するアクションを実行したりできます。これらのブロックの違いは、Reinitialize Function はまずモデル内のすべてのブロックの状態を暗黙的に初期状態にリセットしてから、その他の任意のアクション (ブロックの状態への書き込みやユーザーがブロック設定時に指定するアクションを含む) を実行する点です。反対に、Reset Function ブロックは、ユーザーがブロック設定時に指定するアクションのみを実行します。この例では、Discrete-Time Integrator ブロック以外に状態をもつブロックがモデルに含まれないため、Reinitialize Function ブロックを Reset Function ブロックの代わりに使用しても結果に差はありません。

  1. Reset Function ブロックを追加します。

  2. Reset Function ブロックを開きます。

  3. モデルのリセット条件。この例では、Constant ブロックの [定数値] パラメーターを 2 に設定します。

  4. 状態ライターを状態オーナーに接続します。State Writer ブロックのダイアログ ボックスを開きます。状態オーナー セレクター ツリーを展開して [Discrete-Time Integrator] を選択し、[適用] をクリックします。

  5. Reset Function ブロックのイベント名、reset がブロック上に表示されます。

    タグ上をクリックすると、Initialize Function ブロックと Reset Function ブロックに配置された State Writer ブロックに移動するリンクが示されたリストが開きます。

    メモ

    仮に Reset Function ブロックが Reinitialize Function ブロックに置き換えられた場合、Reinitialize Function ブロックはまず、Discrete-Time Integrator ブロックの状態を Discrete-Time Integrator ブロック ダイアログで指定された初期状態である 0 に戻します。次に、Reinitialize Function ブロックは State Writer ブロックを使用して Discrete-Time Integrator ブロックの状態を 2 に設定し、暗黙的な 0 への再初期化をオーバーライドします。この一連の動作では、単に Discrete-Time Integrator ブロックの状態を 2 に設定するだけの Reset Function ブロックと同じ効果になります。

    仮に State Writer ブロックを使用せずに Reinitialize Function ブロックを使用した場合、Discrete-Time Integrator ブロックの状態は初期状態である 0 に設定されます。仮に State Writer ブロックを使用せずに Reset Function を使用した場合、その他のブロックの状態には何も影響しません。

  6. シミュレーションを実行し、モデルがエラーなしにシミュレートされることを確認します。

    シミュレーション中は Reset Function ブロックは実行されません。このブロックには関数呼び出しイベント信号が必要です。

    Reset Function ブロックの関数呼び出しイベント信号を作成するには、関数呼び出しを生成するテスト ハーネスの作成を参照してください。

ブロックの状態の読み取りと保存

シミュレーションの最後に、ブロックの状態を読み取り、その状態を保存することができます。

  1. Terminate Function ブロックを追加します。

    既定では、Terminate Function ブロックには [イベント タイプ] パラメーターが [終了] に設定された Event Listener ブロックが含まれます。ブロックには State Reader ブロックと、状態値を保存するためのプレースホルダーとして Terminator ブロックも含まれます。

  2. 状態リーダーを状態オーナーと接続します。State Reader ブロックのダイアログ ボックスを開きます。状態オーナー セレクター ツリーから [Discrete-Time Integrator] を選択し、[適用] をクリックします。

  3. シミュレーションを実行し、モデルがエラーなしにシミュレートされることを確認します。Terminate Function ブロックはシミュレーションの最後に実行されます。

  4. テスト用に追加したブロックを削除します。Constant ブロックを Inport ブロックで置き換え、Scope ブロックを Outport ブロックで置き換えます。

テスト用のモデル コンポーネントの準備

以下の変更を加えて、シミュレーション テスト用にコンポーネント モデルがエクスポート関数モデルに配置されたときのシミュレーション エラーを回避します。

  1. Discrete-Time Integrator ブロックの [ブロック パラメーター] ダイアログ ボックスを開きます。[積分手法][累積:前進型オイラー] に設定します。

  2. [モデル コンフィギュレーション パラメーター] ダイアログ ボックスを開きます。ソルバーの [タイプ][固定ステップ] に、[ソルバー][自動] に設定されていることを確認します。[固定ステップ サイズ]1 から auto に変更します。

    この変更によって、Function-Call Subsystem に複数のサンプル時間をもつことで引き起こされるシミュレーション エラーが回避されます。

エクスポート関数モデルの作成

初期化関数、リセット関数および終了関数のテスト用にモデル コンポーネントをテスト ハーネスに配置する場合、モデルはエクスポート関数ルールに従わなければなりません。エクスポート関数モデルの概要および関数呼び出しを生成するテスト ハーネスの作成を参照してください。

エクスポート関数モデルを作成するには、Model ブロックを使用してモデル コンポーネントを Function-Call Subsystem ブロックに配置します。入力端子と出力端子をモデルからサブシステムの入力端子と出力端子に接続します。

  1. Simulink モデルを作成します。このモデルを Model02 という名前で保存します。

  2. [コンフィギュレーション パラメーター] ダイアログ ボックスを開きます。ソルバーのシミュレーション パラメーター [タイプ][固定ステップ] に設定します。[ソルバー][自動] に、[固定ステップ サイズ]auto に設定されていることを確認します。

  3. Function-Call Subsystem ブロックを追加します。ブロックをダブルクリックしてサブシステムを開きます。

  4. Model ブロックをサブシステムに追加し、[モデル名]Model01 に設定します。Inport ブロックおよび Outport ブロックを追加します。

  5. モデルの最上位レベルに移動します。

  6. Inport ブロックを追加します。このブロックは、サブシステムの実行に関する制御信号です。ブロックの名前を Run に変更し、それを function() 端子に接続します。

    Inport ブロックのダイアログ ボックスを開き、[信号属性] タブで [関数呼び出しの出力] チェック ボックスをオンにします。

  7. 2 番目の Inport ブロックを追加し、名前を Signal In に変更します。それをサブシステムの In1 端子に接続します。このブロックは積分アルゴリズムの信号です。

    Outport ブロックを追加し、名前を Signal Out に変更します。その後、それをサブシステムの Out1 端子に接続します。このブロックは統合された信号です。

  8. プロパティ インスペクターに移動してモデルの実行領域を [エクスポート関数] に指定することにより、モデルをエクスポート関数モデルとして指定します。エクスポート関数モデルの指定を参照してください。

  9. [コンフィギュレーション パラメーター] ダイアログ ボックスを開きます。[モデル参照] ペインで、[最上位モデルごとに可能なインスタンスの総数][1] に設定します。

  10. Ctrl-D を押してモデルを更新し、エラーが表示されないことを確認します。

次の手順でテスト ハーネスを作成します。関数呼び出しを生成するテスト ハーネスの作成を参照してください。

参考

ブロック

関連するトピック