モデル階層とパラメーター化の使用
Tutorial Level: Beginner PIDコントローラーとモデルの動的挙動を水タンクモデルに追加する方法を学習します。コンテキスト変数を使用してモデルをパラメーター化する方法およびスーパーブロックをマスクしてモデル階層の詳細を非表示にする方法を学習します。
このチュートリアルのファイル
Watertank.scm
水タンク問題の概要
水タンクモデルで、タンクへの水の流量を調整するPIDコントローラーを追加します。
次の流動方程式は水タンクモデルを表しています。

タンクへの水の流入率qinを制御すると、指定された時間内で水位hに達することができます。このシステムモデルの入力と出力はそれぞれ1つのみ(qinとqout)なので、水の流量を制御するには従来型のPIDコントローラーを追加する必要があります。

PIDコントローラーは、基本的な代数ブロックと積分ブロックから構成されるスーパーブロックとして組み込みます。PIDコントローラーの比例項、積分項、微分項の係数は、OMLコマンドで編集可能なコンテキスト変数として定義されます。
スーパーブロック内のコントローラーはマスクされ、通常のTwin Activateブロックのように見えます。スーパーブロックの内容はマスクによって非表示になりますが、スーパーブロックをダブルクリックするとPIDパラメーターにアクセスすることはできます。
PIDコントローラーの構築
水流を調節するPIDコントローラーによるモデルを作成します。
-
リボンで、Files(ファイル)ツールグループの
をクリックします。
- 新しいモデルをwatertank_practice.scmという名前で保存します。
-
Paletteブラウザで、次のブロックをダイアグラムに追加します。
- Gainブロックを3つドラッグ&ドロップします。 から、
- Integralブロックをドラッグ&ドロップします。 から、
- Derivativeブロックをドラッグ&ドロップします。 から、
- Sumブロックをドラッグ&ドロップします。 から、
-
ブロックを次の図のように配置します:
-
各Gainブロックをダブルクリックし、ゲイン(Gain)パラメーターの値を入力してOKをクリックします。
- 上側のGainブロックについてはPと入力します。
- 中央のGainブロックについてはIと入力します。
- 下側のGainブロックについてはDと入力します。
注: パラメーターに、値であるP、I、Dを割り当てることにより、その値が本チュートリアルの後の部分で定義するコンテキスト変数を表すことを示しています。ブロックは次の図のようになります:
-
Sumブロックをダブルクリックします。入力数(Number of inputs)に3と入力します。Signsテーブルのすべての入力に“+”を割り当てます:
-
ブロックを次の図のように接続してリンクを調整します。
-
領域内をクリックしてカーソルをドラッグし、すべてのブロックをボックス選択します。
-
リボンでスーパーブロックの作成ツール
を選択します。
ダイアグラムにあるブロックがスーパーブロックに変換されます。 - SuperBlockをダブルクリックしてダイアグラムを開きます。
- InputブロックとOutputブロックを1つずつダイアグラムにドラッグ&ドロップします。 から、
-
ブロックを次の図のように接続します:
InputブロックとOutputブロックは、スーパーブロック内からスーパーブロック外のブロックへの信号交換のためのインターフェースとして機能します。 -
最上位のダイアグラムを表示するには、モデリングウィンドウの空白領域でダブルクリックします。
入力ポートと出力ポートがスーパーブロックに接続されていることを確認します。
-
スーパーブロックの名前を変更するため、F2キーを押し、Controllerと入力します。
スーパーブロックの名前がControllerに変わります。
水タンクの動的挙動のモデル化
3つの流れの方程式に基づいて水タンクの動的挙動を構築します。

-
Paletteブラウザで、次のブロックをダイアグラムに追加します。
- Gainブロックを2つドラッグ&ドロップします。 から、
- Sumブロックをドラッグ&ドロップします。 から、
- MathFuncブロックをドラッグ&ドロップします。 から、
- Integralブロックをドラッグ&ドロップします。 から、
- ブロックの追加後、MathFuncブロックを選択して右クリックし、反転(Flip)を選択します。Gainブロックの1つにも同じ操作を実行します。
-
ブロックを次の図のように配置します。
-
上側と下側のGain(ゲイン)ブロックをダブルクリックし、Gainパラメーターの値を入力してかOKらをクリックします。
- 上側のGainブロックについてはb/Rと入力します。
- 下側のGainブロックについてはa/Rと入力します。
- MathFuncブロックをダブルクリックします。関数(Function)パラメーターに“sqrt”と入力してOKをクリックします。
-
ブロックを次のように接続します:
-
Paletteブラウザで、次のブロックをダイアグラムに追加します。
- Sumブロックをドラッグ&ドロップします。 から、
- Constantブロックをドラッグ&ドロップします。 から
- Scopeブロックをドラッグ&ドロップします。 から、
- Constantブロックをダブルクリックします。定数(Constant)パラメーターに10と入力してOKをクリックします。
-
ブロックを次のように組み立てて接続します:
-
ダイアグラム上でクリック&ドラッグによるボックス選択で、次の図のように複数のブロックを選択します:
-
右クリックして、Super Blockを選択します。
ダイアグラムの選択された領域内にあるブロックがスーパーブロックに変換されます。スーパーブロック操作により、新しいスーパーブロックはダイアグラム内の既存のブロックに自動的にリンクされます。
- プロパティエディターで新しいスーパーブロックを選択します。名前欄をダブルクリックし、Watertankという名前を入力します。
-
ダイアグラム内の他のブロックに対するWatertankブロックの接続を次のように修正します。
- モデルを保存します。
コンテキスト変数の定義
ダイアグラムダイアログのコンテキストタブで、メインコンテキスト変数とローカルコンテキスト変数の値を入力します。
-
ルートダイアグラムの空白領域を右クリックしてコンテキスト(Context)を選択するか、メニューバーツールダイアグラム(Diagram)
を選択します。
ダイアグラムダイアログが開きます。 -
コンテキストタブで、次の図に示すようにOMLコマンドを入力してからOKをクリックします。
コンテキスト変数P、I、Dはメインダイアグラムのコンテキストで定義されますが、モデルのその他の部分で使用される変数もこれらの値を受け取ります。ただし、ローカルコンテキストで定義された値は除きます。 - スーパーブロックWatertankをダブルクリックします。
- メインダイアグラムの何もない領域を右クリックしてContextを選択します。
-
コンテキストタブで、次の図に示すようにOMLコマンドを入力してからOKをクリックします。
コンテキスト変数R、a、bは、スーパーブロック内部のダイアグラムで定義します。これらの変数のスコープはセミグローバルです。つまり、これらの変数を認識できるのは、現在のダイアグラムの中および現在のダイアグラムにあるすべてのスーパーブロックの中のみです。Gainブロックは現在のダイアグラム内にあり、変数R、a、bを含むため、これらの変数はコンテキストタブで指定した値に基づいて定義されます。 -
リボンでRunを選択します。
シミュレーションが開始されます。
-
メインダイアグラムで、Scopeブロックをダブルクリックします。
Scopeウィンドウが表示されます。
-
Scopeのビューをウィンドウにフィットさせるには、マウスの中央ボタンをクリックします。
このカーブは、水タンクの水位が指定水位である10に達したあと、それが維持されることを示しています。
スーパーブロックのマスク
Controllerスーパーブロックをマスクして、P、I、Dの各パラメーターを調整します。
-
ルートダイアグラムでControllerスーパーブロックを選択します。リボンから、自動マスク(Auto Mask)ツールを選択します。
このスーパーブロックが自動的にマスクされます。
-
マスクされたスーパーブロックControllerをダブルクリックします。
パラメーターダイアログが表示されます。入力としてのパラメーター値I、D、Pは、ルートダイアグラムのコンテキストで定義されたコンテキスト変数です。
-
スーパーブロックControllerを選択してから、リボンでマスクの編集(Edit Mask)
ツールを選択します。
-
表示されたマスクエディターダイアログで、概要(Short Description )欄にBasic PID Controllerと入力します。
-
パラメーターごとに
をクリックします。表示されたパラメーター作成ダイアログで、次の図に示す情報を入力してOKをクリックします。
-
パラメーター情報を入力すると、テーブルは次のようになります。
-
スーパーブロックControllerをダブルクリックします。パラメーターの説明が更新されているはずです。次の図に示す数値をパラメーターに入力します:
-
リボンで実行を選択します。
シミュレーションが開始されます。Scopeウィンドウに以下の結果のプロットが表示されます: - スーパーブロックControllerをダブルクリックします。Proportional Parameter欄に8と入力します。
-
もう一度シミュレーションを実行します。プロットは次の図のようになります。
Scopeウィンドウには、出力が最初に先ほどより急激に増加しますが、設定値を超える量は小さくなるようなグラフが示されます。 - モデルを保存します。