MATLAB System ブロックからの Simulink 関数の呼び出し
Simulink® 関数は、Simulink 環境で計算単位をグラフィカルに表現したものです。Simulink 関数を作成したら、任意の計算単位で実行したり、複数の場所で呼び出すことができます。呼び出すことができるのは、System object™ の stepImpl
、outputImpl
、または updateImpl
メソッド内の Simulink 関数のみです。Simulink 関数の詳細については、Simulink 関数の概要を参照してください。
メモ
Simulink 関数を呼び出す MATLAB System ブロックが含まれるモデルでは、インタープリター モード
はサポートされていません。
Simulink Function ブロックの作成
y = 2 * u
のようなシンプルな関数を実装する Simulink Function ブロックを設定します。
[Simulink エディター] から新しいモデルを開き、Simulink キャンバスに「Simulink function」と入力して Simulink Function ブロックを追加します。
[関数プロトタイプ] ウィンドウが開いたら、関数定義として
y = timestwo_func(u)
と入力します。これは、u
を入力引数として取り、y
を出力引数として生成するtimestwo_func
と呼ばれる関数を定義することを示しています。あるいは、関数名を Simulink Function ブロック パラメーターで定義します。Simulink Function ブロックをダブルクリックし、Trigger Port 関数ブロックが入力および出力引数ブロックと共に表示されることを確認します。
Simulink Function ブロックの Trigger Port ブロックをダブルクリックして、[関数の可視性] が
[スコープ内]
に設定されていることを確認します。Simulink 関数の[スコープ内]
の詳細については、スコープ内、グローバル、および端子スコープ内の Simulink Function ブロックの概要を参照してください。Gain ブロックを追加して、その値を 2 に設定します。それを入力および出力引数ブロックに接続します。[親に移動する] をクリックして、メイン モデルに戻ります。
メモ
MATLAB System ブロックが呼び出している Simulink 関数を判別するには、関数のトレース ラインをオンにします。[デバッグ] タブで [情報のオーバーレイ] 、 [関数コネクタ] を選択します。
MATLAB System ブロックの作成と System object の定義
MATLAB System ブロックをモデルにドラッグし、このブロックに System object を実装します。
MATLAB System ブロックを Simulink モデルに追加します。
ブロック ダイアログ ボックスで、
[新規]
リストから [標準] を選択します。これにより、コードを入力するための基本的な System object テンプレートが開きます。matlab.System
からオブジェクトをサブクラス化するには、Untitled
を System object の名前で置き換えます。この例では、SimulinkFcnCaller
という名前を付けます。System object の
stepImpl
メソッドで、getSimulinkFunctionNamesImpl
を使用して Simulink 関数を宣言します。下に示す System object コードの例を参照してください。System object を記述する方法の詳細については、基本的な System object の定義を参照してください。
classdef SimulinkFcnCaller < matlab.System % Public, tunable properties % SimulinkFcnCaller calls a Simulink function from a % MATLAB System block to multiply the signal's value by 2. methods(Access = protected) function y = stepImpl(obj,u) % Implement algorithm. Calculate y as a function of input u and % discrete states. y = timestwo_func(u); end function names = getSimulinkFunctionNamesImpl(obj) % Use 'getSimulinkFunctionNamesImpl' method to declare % the name of the Simulink function that will be called % from the MATLAB System block's System object code. names = {'timestwo_func'}; end end end
ファイルを
SimulinkFcnCaller.m
という名前で保存します。
MATLAB System ブロックからのサブシステム内の Simulink 関数の呼び出し
Simulink Function ブロックの階層は System object での関数呼び出しに影響します。たとえば、Simulink 関数が Simulink モデルの高い階層で定義されている場合、関数はその階層内のすべてのブロックに対して定義されます。Simulink 関数が低い階層で定義されている場合、Subsystem と関数名を修飾する必要があります。たとえば、MATLAB System ブロックと同じレベルで Simulink Function ブロックが含まれる Subsystem があるとします。Simulink Function ブロックがサブシステム内に配置されている場合、関数名はサブシステムの外部には表示されません。System object で Subsystem の名前を使用して関数名を修飾することで Simulink Function ブロックを呼び出すことができます。Subsystem と関数名を修飾するには、以下の手順に従います。
System object コードの
stepImpl
メソッドで、ドット表記を使用して Simulink 関数を呼び出します。たとえば、コードy = Subsystem1.timestwo_func(u)
では、Subsystem1
は Subsystem に対応し、timestwo_func
は Simulink 関数名に対応します。同様に、ドット表記を使用して Subsystem と Simulink 関数を
getSimulinkFunctionNamesImpl
メソッドで宣言します。System object コードには、MATLAB System ブロックよりも低い階層で定義された Simulink 関数用に作成されたtimestwo
の例が示されます。classdef SimulinkFcnCallerQualified < matlab.System % SimulinkFcnCallerQualified calls a Simulink function embedded in a Subsystem % from a MATLAB System block, and multiplies the signal's value by 2. methods(Access = protected) function y = stepImpl(obj,u) % Use the '.' notation to call a scoped Simulink function from % a Simulink Function block. % Subsystem1 corresponds to the block name, where % timestwo_funct is the Simulink function name. y = Subsystem1.timestwo_func(u); end function names = getSimulinkFunctionNamesImpl(obj) % Use the 'getSimulinkFunctionNamesImpl' method with the '.' % notation to declare the name of a Simulink function in % MATLAB System block's System object code. names = {'Subsystem1.timestwo_func'}; end end end
System object ファイルを
SimulinkFcnCallerQualified.m
という名前で保存します。
MATLAB System ブロックからの Simulink 関数の呼び出し
この例では、System object® の調整不可プロパティを使用して MATLAB System ブロックによって条件付きで呼び出された 2 つの Simulink® 関数を示します。
MATLAB System ブロックは、Sine Wave ブロックからの信号の値に応じて 2 つの異なるサブシステム内のいずれかの Simulink 関数を呼び出します。信号の値が 10 未満の場合、MATLAB System ブロックは SS1
サブシステムの timestwo_func
Simulink 関数を呼び出します。値が 10 より大きい場合、SS2
サブシステムの timesthree_func
を呼び出します。
関数名は調整不可プロパティとして定義され、関数 str2func
を使用して string から関数に切り替えられます。次に、これらの関数は getSimulinkFunctionNamesImpl
メソッド内でプロパティとして宣言されます。