Main Content

プログラムによるモデル化の基礎

モデルの作成、モデルへのブロックの追加、パラメーターの設定など、Simulink® の基本的なモデル化操作のほとんどは MATLAB® コマンド ウィンドウでプログラムを使用して実行することができます。ここでは、それらのうちの一部のコマンドとそれらのコマンドの使用方法について説明します。

モデルの読み込み

モデルを読み込むと、モデルがメモリに格納されますが、Simulink エディターで編集用には開きません。モデルを読み込んだ場合は、モデルをプログラムで操作できます。Simulink エディターを使用してモデルを編集できるのは、モデルを開いた場合だけです。

システムを読み込むには、load_system コマンドを使用します。

たとえば、MATLAB パス上に myModel という名前のモデルがあるとします。モデルを読み込むには、MATLAB コマンド ウィンドウで次のコマンドを入力します。

load_system('myModel')

モデルの作成とパラメーター設定の指定

モデルを作成して目的の設定を指定する関数を記述することができます。たとえば、次の関数では、背景が緑色で ode3 ソルバーを使用するモデルが作成されます。

function new_model(modelname) 
% NEW_MODEL Create a new, empty Simulink model
%    NEW_MODEL('MODELNAME') creates a new model with
%    the name 'MODELNAME'. Without the 'MODELNAME'
%    argument, the new model is named 'my_untitled'.

if nargin == 0 
     modelname = 'my_untitled';
end 

% create and open the model
open_system(new_system(modelname));

% set default screen color
set_param(modelname,'ScreenColor','green');

% set default solver
set_param(modelname,'Solver','ode3');

% save the model
save_system(modelname);

モデルを開く際のプログラムによる変数の読み込み

ブロック パラメーターの値として変数を割り当てる場合、モデルで変数の値を定義しなければなりません。関数 set_paramPreloadFcn コールバックを使用することで、変数をプログラムで定義することができます。この関数の形式を次に示します。

set_param('mymodel','PreloadFcn','expression')

expression は MATLAB の検索パスにある MATLAB コマンドまたは MATLAB スクリプトです。このコマンドにより、指定した値にモデルの PreloadFcn コールバックが設定されます。モデルを保存すると設定が保存されます。

たとえば、MATLAB スクリプト loadvar.m でモデル modelname.slx に対する変数を定義する場合は、次のコマンドを使用します。

set_param('modelname','PreloadFcn','loadvar')
変数 K に値 15 を割り当てるには、次のコマンドを使用します。

set_param('modelname','PreloadFcn','K=15')

モデルを保存すると、次にモデルを開いたときに PreloadFcn コールバックが実行されます。

プログラムによるブロックの追加と接続

この例では、関数を使用してブロックの追加やブロックの接続をプログラムで行う方法について示します。モデルにブロックを追加した後で、ルーティング指定ライン、端子ハンドル、端子 ID の 3 つの異なる方法を使用してそれらを接続します。ルーティング指定ラインは、すべての接続線セグメントのエンドポイントの正確な (x,y) 座標を指定できます。端子ハンドルと端子 ID は、端子位置の座標を知らなくても接続線をブロック端子に接続できます。

'mymodel' という名前の空のモデルを作成して開きます。

ブロックを追加します (サブシステム ブロックを含む)。関数 set_paramposition 配列を使用して、ブロックのサイズと位置を設定します。(x,y) 座標を使用してブロックの左上隅と右下隅を設定します。

add_block('simulink/Sources/Sine Wave','mymodel/Sine1');
set_param('mymodel/Sine1','position',[140,80,180,120]);
add_block('simulink/Sources/Pulse Generator','mymodel/Pulse1');
set_param('mymodel/Pulse1','position',[140,200,180,240]);
add_block('simulink/Ports & Subsystems/Subsystem','mymodel/Subsystem1');
set_param('mymodel/Subsystem1','position',[315,120,395,200]);
add_block('simulink/Sinks/Scope','mymodel/Scope1');
set_param('mymodel/Scope1','position',[535,140,575,180]);

Subsystem1 内の In1Out1 の間の既定の接続を削除します。また、ブロック ライブラリの In1 をコピーして名前を変更することにより、2 番目の入力端子を追加します。

delete_line('mymodel/Subsystem1','In1/1','Out1/1');
add_block('simulink/Sources/In1','mymodel/Subsystem1/In2');

Subsystem1 内の内部入力端子ブロックと内部出力端子ブロックの位置を変更します。

set_param('mymodel/Subsystem1/In1','position',[50,50,90,70]);
set_param('mymodel/Subsystem1/In2','position',[50,130,90,150]);
set_param('mymodel/Subsystem1/Out1','position',[500,80,540,100]);

Subsystem1 内に Add ブロックを挿入して配置します。

add_block('simulink/Math Operations/Add','mymodel/Subsystem1/Add1');
set_param('mymodel/Subsystem1/Add1','position',[250,80,290,120]);

次に、モデル内のすべてのブロックを接続する線を追加します。ルーティング指定ラインを使用して Sine1 ブロックと Pulse1 ブロックを接続することから始めます。

Sine1 出力端子の (x,y) 座標を調べます。

Sine1_Port = get_param('mymodel/Sine1','PortConnectivity')

Sine1_Port = 

  struct with fields:

        Type: '1'
    Position: [185 100]
    SrcBlock: []
     SrcPort: []
    DstBlock: [1×0 double]
     DstPort: [1×0 double]

get_param は、端子の位置が [185 100] であることを示しています。

Pulse1 出力端子の (x,y) 座標を調べます。

Pulse1_Port = get_param('mymodel/Pulse1','PortConnectivity')

Pulse1_Port = 

  struct with fields:

        Type: '1'
    Position: [185 220]
    SrcBlock: []
     SrcPort: []
    DstBlock: [1×0 double]
     DstPort: [1×0 double]

get_param は、端子の位置が [185 220] であることを示しています。

ルーティング指定ラインの 3 つのセグメントを使用して、Sine1 の出力を Subsystem1 の最初の入力に接続します。

add_line('mymodel', [185 100; 275 100]);
add_line('mymodel', [275 100; 275 140]);
add_line('mymodel', [275 140; 310 140]);

ルーティング指定ラインの 3 つのセグメントを使用して、Pulse1 の出力を Subsystem1 の 2 番目の入力に接続します。

add_line('mymodel', [185 220; 275 220]);
add_line('mymodel', [275 220; 275 180]);
add_line('mymodel', [275 180; 310 180]);

get_param を使用して接続するブロック端子のハンドルを取得します。次にブロック端子のハンドルを使用して Subsystem1 の出力を Scope1 の入力に接続します。

SubsysPortHandles = get_param('mymodel/Subsystem1','PortHandles');
ScopePortHandles = get_param('mymodel/Scope1','PortHandles');
add_line('mymodel',SubsysPortHandles.Outport(1),...
ScopePortHandles.Inport(1));

端子名と端子 ID を使用して Subsystem1 内の Add1 ブロックをサブシステムの入力および出力と接続します。Simulink は端子の接続に最も直接的なパスを使用します。

add_line('mymodel/Subsystem1','In1/1','Add1/1');
add_line('mymodel/Subsystem1','In2/1','Add1/2');
add_line('mymodel/Subsystem1','Add1/1','Out1/1');

プログラムによるブロックのコメントアウトまたはコメントスルー

コメント化されたブロックの状態をプログラムで表示または変更するには、get_param コマンドと set_param コマンドを使用します。

  • コメント化されたブロックの状態を表示:

    get_param(gcb,'commented');

  • ブロックをコメントアウト:

    set_param(gcb,'commented','on');

  • ブロックをコメントスルー:

    set_param(gcb,'commented','through');

  • ブロックをコメント解除:

    set_param(gcb,'commented','off');

プログラムによる信号の名前の設定

  1. 信号線のソースのブロックを選択します。

  2. get_param を使用して、現在選択しているブロックの端子ハンドルを変数 p に代入します。get_param を使用して、その端子に接続されたラインのハンドルを変数 l に代入します。その後、信号線の名前を 's9' に設定します。

p = get_param(gcb,'PortHandles')
l = get_param(p.Outport,'Line')
set_param(l,'Name','s9')

モデル レイアウトの自動調整

Simulink.BlockDiagram.arrangeSystem コマンドを使用して、モデルをレイアウトできます。このコマンドは、入力ブロックを左側、出力ブロックを右側、モデル要素を入力と出力の間の列に並べます。このコマンドは、一度に 1 つの層のみに影響します。

Simulink.BlockDiagram.routeLine コマンドを使用して、モデルの既存のラインをルーティングできます。既存のラインをルーティングすることで、ラインのルートの品質が向上し、ラインがモデル内の他のラインや障害物とオーバーラップすることを回避できます。

このコマンドは開かれている任意のモデルで使用できますが、プログラムによってビルドしたモデルで特に役立ちます。例については、プログラムによって入力されたモデルの調整を参照してください。

同じモデルを複数のウィンドウで開く

モデルを開くと、Simulink エディターのウィンドウにそのモデルが表示されます。たとえば、1 つのモデルが開いている場合、2 番目のモデルを開くと、そのモデルは 2 番目のウィンドウに表示されます。

同じモデルを 2 つの Simulink エディター ウィンドウに表示するには、MATLAB コマンド プロンプトで、window 引数を使用して open_system コマンドを入力します。たとえば、modelName というモデルを開いている状態で modelName のインスタンスをもう 1 つ開くには、次のように入力します。

open_system('modelName','window')

モデルのインデックス付けと検索、およびモデルの見つけやすさの向上のためのモデル ファインダーの使用

関数 modelfinder を使用して、複数のデータベースで例、モデル、およびプロジェクトを検索できます。既定では、modelfinderMathWorks® Examples データベースを検索します。データベースをモデル ファインダーで構成することもできます。モデル ファインダーの詳細については、Configure and Search Databasesを参照してください。

強調表示を使用したブロック線図要素の特定

開いているモデル内のブロック、ライン、端子または注釈を強調表示するには、hilite_system を使用します。

プログラミングでの色の指定

MATLAB コマンド ラインで、または MATLAB プログラムで、set_param コマンドを使用すると、ブロック線図の背景色とブロック線図の要素の背景色および前景色を定義するパラメーターを設定できます。次の表は、モデルの色を制御するパラメーターをまとめたものです。

パラメーター決定する対象

ScreenColor

モデルの背景

BackgroundColor

ブロックおよび注釈の背景

ForegroundColor

ブロックおよび注釈の前景

色パラメーターを名前のついた色または RGB 値に設定します。

  • 名前の付いた色: 'automatic', 'black', 'white', 'red', 'green', 'blue', 'cyan', 'magenta', 'yellow', 'gray', 'lightBlue', 'orange', 'darkGreen'

  • RGB 値: '[r,g,b]'

    ここで、rg および b は、0.0 から 1.0 の範囲に正規化された色の赤、緑および青成分です。

たとえば、次のコマンドは現在選択してあるシステムまたはサブシステムの背景色を薄い緑色に設定します。

set_param(gcs,'ScreenColor','[0.3, 0.9, 0.5]')

参考

| | | | | | | | | | | |

関連するトピック