Main Content

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

レガシ コード ツールによって外部コードへの呼び出しを生成コードにインポート

レガシ コード ツールとコード生成

Simulink® レガシ コード ツール を使用して、レガシまたはカスタム コード用の完全インライン化 C MEX S-Function を生成できます。S-Function はデバイス ドライバーやルックアップ テーブルのような組み込みコンポーネント用に最適化され、既存の C 関数または C++ 関数を呼び出します。

メモ

レガシ コード ツールは、C++ 関数とインターフェイスで接続することができますが、C++ オブジェクトとは接続できません。ツールが C++ オブジェクトのインターフェイスとして機能するようにこの問題を回避するには、Legacy Code Tool Limitationsを参照してください。

このツールは以下の目的で使用できます。

  • 生成された S-Function をシミュレーション向けにコンパイルし、ビルドする。

  • 既存の外部コードを呼び出すように設定されたマスク付きの S-Function ブロックを生成する。

コードを生成しようとしているモデルにこのような S-Function を含めるには、ツールを使用して TLC ブロック ファイルを生成します。TLC ブロック ファイルは、モデルの生成コードが既存の C または C++ 関数を呼び出す方法を指定します。

S-Function の依存するファイルのフォルダーが、S-Function を動的に読み込める実行可能ファイルの含まれるフォルダーではない場合、ツールを使用して S-Function に sFunction_makecfg.m または rtwmakecfg.m ファイルを生成します。ファイルを生成することで、S-Function を含むモデルを作成するときにそれらの依存関係が維持されます。たとえば、カスタム ターゲットなどいくつかの用途では、ファイルをターゲット特有の場所に配置する可能性もあります。ビルド プロセスは、S-Function が動的に読み込める実行可能ファイルと同じフォルダーにある sFunction_makecfg.m または rtwmakecfg.m を探して、そのファイル内の関数を呼び出します。

詳細については、Integrate C Functions Using Legacy Code Toolを参照してください。

コード生成のためのインライン化 S-Function ファイルの生成

S-Function を使用するモデルのコードを生成するには、お使いのアプリケーションのコード生成要件に応じて、次のいずれかを実行します。

  • インライン化 S-Function に 1 つの .cpp ファイルを生成する。レガシ コード ツールのデータ構造体で、既存の C 関数から S-Function ソース ファイルを生成する前に、Options.singleCPPMexFile フィールドの値を true に設定する。以下に例を示します。

    def.Options.singleCPPMexFile = true;
    legacy_code('sfcn_cmex_generate', def);

  • インライン化 S-Function にソース ファイルと TLC ブロック ファイルを生成する。以下に例を示します。

    def.Options.singleCPPMexFile = false;
    legacy_code('sfcn_cmex_generate', def);
    legacy_code('sfcn_tlc_generate', def);

singleCPPMexFile の制約

以下の場合は、singleCPPMexFile フィールドを true に設定できません。

  • Options.language='C++'

  • 次の Simulink オブジェクトのいずれかを使用して、IsAlias プロパティを true に設定する場合

    • Simulink.Bus

    • Simulink.AliasType

    • Simulink.NumericType

  • レガシ コード ツールの関数の仕様で、状態引数としてスカラー作業データを表現するための void* または void** を含む場合

  • レガシ コード ツール構造体の HeaderFiles フィールドで、複数のヘッダー ファイルを指定する場合

レガシ関数へのコード スタイル設定の適用

コード スタイルのモデル コンフィギュレーション パラメーターをレガシ関数に適用するには、次の手順を実行します。

  1. レガシ コード ツールのデータ構造体を初期化します。以下に例を示します。

    def = legacy_code('initialize');
    
  2. データ構造体で、Options.singleCPPMexFile フィールドの値を true に設定します。次に例を示します。

    def.Options.singleCPPMexFile = true;

設定を確認するには、次を入力します。

def.Options.singleCPPMexFile

singleCPPMexFile の制約

以下の場合は、singleCPPMexFile フィールドを true に設定できません。

  • Options.language='C++'

  • 次の Simulink オブジェクトのいずれかを使用して、IsAlias プロパティを true に設定する場合

    • Simulink.Bus

    • Simulink.AliasType

    • Simulink.NumericType

  • レガシ コード ツールの関数の仕様で、状態引数としてスカラー作業データを表現するための void* または void** を含む場合

  • レガシ コード ツール構造体の HeaderFiles フィールドで、複数のヘッダー ファイルを指定する場合

異なる場所にあるファイルの依存関係への対処

既定の設定では、レガシ コード ツールは、S-Function が依存するファイルは、動的に読み込むことができる、その S-Function の実行可能ファイルと同じフォルダー内に存在していると仮定します。S-Function がそれ以外の場所にあるファイルに依存しており、テンプレート makefile ビルド プロセスを使用する場合は、その S-Function について sFunction_makecfg.m または rtwmakecfg.m ファイルを生成します。たとえば、レガシ コード ツール データ構造体がパス名としてコンパイルのリソースを定義するような場合に、このファイルを生成します。

sFunction_makecfg.m または rtwmakecfg.m ファイルを生成するには、'sfcn_makecfg_generate' または 'rtwmakecfg_generate' を最初の引数とし、レガシ コード ツール データ構造体の名前を 2 番目の引数として、関数 legacy_code を呼び出します。次に例を示します。

legacy_code('sfcn_makecfg_generate', lct_spec);

同じフォルダー内の複数の登録ファイルを使用して、関数 legacy_code の単一の呼び出しでファイルごとに S-Function を生成する場合は、'sfcn_makecfg_generate' または 'rtwmakecfg_generate' を指定する関数 legacy_code の呼び出しがすべての登録ファイルに共通していなければなりません。詳細については、Handling Multiple Registration Filesを参照してください。

たとえば、レガシ コード ツール構造体の配列として defs を定義する場合は、'sfcn_makecfg_generate' で関数 legacy_code を 1 回呼び出します。

defs = [defs1(:);defs2(:);defs3(:)];
legacy_code('sfcn_makecfg_generate', defs);

詳細については、S-Function のビルド サポートを参照してください。

シミュレーションおよびコード生成のための S-Function の配布

レガシ コード ツールで S-Function を生成し、それを他のユーザーに配布することができます。シミュレーションやコードを生成するために S-Function を配布するには、次のファイルを共有します。

  • 登録ファイル

  • 動的な読み込みができるコンパイル済みの実行可能ファイル

  • TLC ブロック ファイル

  • sFunction_makecfg.m または rtwmakecfg.m ファイル

  • 生成された S-Function が依存するヘッダー、ソースおよびインクルード ファイル

これらの配布ファイルを使用するときは、次のようにします。

  • Simulink モデルで配布されたファイルを使用する前に、S-Function ファイルを格納するフォルダーを MATLAB® パスに追加。

  • レガシ コード ツール データ構造体によって、絶対パスやファイル変更の位置として必須ファイルが登録される場合は、sFunction_makecfg.m または rtwmakecfg.m ファイルを再び生成。

外部 C++ オブジェクトの統合

レガシ コード ツールは、C++ 関数とインターフェイスで接続することができますが、C++ オブジェクトとは接続できません。前の例を開始点として使用し、この制限を回避する方法の例を示します。

  • 新しいファイル adder_cpp.hppadder のクラス定義を変更します。新しい adder オブジェクトの動的な割り当て、メソッド add_one() の呼び出し、割り当てられたメモリの解放を行う 3 つの新しいマクロを追加します。それぞれのマクロは、adder オブジェクトへのポインターを受け取ります。レガシ コード ツールによって呼び出される各関数は C 言語のようなシグネチャをもたなければならないため、ポインターはキャッシュされて void* として渡されます。その後マクロ内で明示的に adder* にキャストしなければなりません。adder の新しいクラス定義を次に示します。

    #ifndef _ADDER_CPP_
    #define _ADDER_CPP_
    
    class adder {
    private:
    	int int_state;
    public:
    	adder(): int_state(0) {};
    	int add_one(int increment);
    	int get_val() {return int_state;};
    };
    
    // Method wrappers implemented as macros
    #define createAdder(work1) \
        *(work1) = new adder
    
    #define deleteAdder(work1) \
        delete(static_cast<adder*>(*(work1)))
    
    #define adderOutput(work1, u1) \
        (static_cast<adder*> ((work1)))->add_one(u1)
    
    #endif /* _ADDER_CPP_ */
  • adder_cpp.cpp を更新します。クラスの変更に伴い、1 つのグローバルなインスタンスの代わりに、生成された各 S-Function が固有の adder オブジェクトを管理します。

    #include "adder_cpp.hpp"
    
    int adder::add_one(int increment)
    {
    	int_state += increment;
        return int_state;
    }
  • 次の変更によって rtwdemo_sfun_adder_cpp.cpp を更新します。

    • StartFcnSpec は、新しい adder オブジェクトを割り当ててポインターをキャッシュするマクロを呼び出します。

      def.StartFcnSpec  = 'createAdder(void **work1)';
      
    • OutputFcnSpec は、メソッド add_one() を呼び出してその S-Function 固有の adder ポインター オブジェクトを提供するマクロを呼び出します。

      def.OutputFcnSpec = 'int32 y1 = adderOutput(void *work1, int32 u1)';
    • TerminateFcnSpec は、メモリを解放するマクロを呼び出します。

      def.TerminateFcnSpec = 'deleteAdder(void **work1)';

レガシ コード ツールの例

値またはアドレスによって入力引数を渡す外部 C 関数の統合

この例では、レガシ コード ツールを使用して、値またはアドレスによって入力引数を渡すレガシ C 関数を統合する方法を示します。

レガシ コード ツールでは以下が可能です。

  • レガシ関数の仕様を提供する。

  • シミュレーション中にレガシ コードを呼び出す C-MEX S-Function を生成する。

  • 生成された S-Function をシミュレーション向けにコンパイルし、ビルドする。

  • モデルの生成コードでレガシ コードを呼び出す方法を指定する TLC ブロック ファイルとオプションの rtwmakecfg.m ファイルを生成する。

レガシ関数の仕様の提供

レガシ コード ツールの関数では、特定のデータ構造体または構造体配列を引数として使用します。このデータ構造体は、最初の入力として 'initialize' を使用する関数 legacy_code() を呼び出すことで初期化できます。構造体の初期化後、統合されるレガシ コードに対応する値に、構造体のプロパティを割り当てます。プロパティの詳細なヘルプは、legacy_code('help') を呼び出してください。この例で呼び出されるレガシ関数のプロトタイプは以下のとおりです。

  • FLT filterV1(const FLT signal, const FLT prevSignal, const FLT gain)

  • FLT filterV2(const FLT* signal, const FLT prevSignal, const FLT gain)

FLT は、float に対する typedef です。レガシ ソース コードは、ファイル your_types.hmyfilter.hfilterV1.c、および filterV2.c にあります。

2 つの構造体で定義されている OutputFcnSpec に違いがあることに注意してください。1 番目のケースでは、1 番目の入力引数が値によって渡されるように指定されています。これに対し、2 番目のケースでは、ポインターによって渡されるように指定されています。

defs = [];

% rtwdemo_sfun_filterV1
def = legacy_code('initialize');
def.SFunctionName = 'rtwdemo_sfun_filterV1';
def.OutputFcnSpec = 'single y1 = filterV1(single u1, single u2, single p1)';
def.HeaderFiles   = {'myfilter.h'};
def.SourceFiles   = {'filterV1.c'};
def.IncPaths      = {'rtwdemo_lct_src'};
def.SrcPaths      = {'rtwdemo_lct_src'};
defs = [defs; def];

% rtwdemo_sfun_filterV2
def = legacy_code('initialize');
def.SFunctionName = 'rtwdemo_sfun_filterV2';
def.OutputFcnSpec = 'single y1 = filterV2(single u1[1], single u2, single p1)';
def.HeaderFiles   = {'myfilter.h'};
def.SourceFiles   = {'filterV2.c'};
def.IncPaths      = {'rtwdemo_lct_src'};
def.SrcPaths      = {'rtwdemo_lct_src'};
defs = [defs; def];

シミュレーション用の S-Function の生成

入力引数 'defs' によって示される説明に従って C-MEX S-Function を生成するために、最初の入力を 'sfcn_cmex_generate' に設定して関数 legacy_code() を再び呼び出します。この S-Function により、シミュレーションでレガシ関数が呼び出されます。S-Function のソース コードは、ファイル rtwdemo_sfun_filterV1.crtwdemo_sfun_filterV2.c にあります。

legacy_code('sfcn_cmex_generate', defs);

生成された S-Function のシミュレーション向けのコンパイル

C-MEX S-Function ソース ファイルの生成後、Simulink® を使用したシミュレーション用に S-Function をコンパイルするために、最初の入力を 'compile' に設定して関数 legacy_code() を再び呼び出します。

legacy_code('compile', defs);
### Start Compiling rtwdemo_sfun_filterV1
    mex('-I/mathworks/devel/bat/Bdoc20b/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src', '-I/tmp/Bdoc20b_1465442_59938/tp8eb0d42c/ex19632214', '-c', '-outdir', '/tmp/Bdoc20b_1465442_59938/tp02efb0a6_0590_4450_80d2_68d078f139ba', '/mathworks/devel/bat/Bdoc20b/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src/filterV1.c')
Building with 'gcc'.
MEX completed successfully.
    mex('rtwdemo_sfun_filterV1.c', '-I/mathworks/devel/bat/Bdoc20b/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src', '-I/tmp/Bdoc20b_1465442_59938/tp8eb0d42c/ex19632214', '/tmp/Bdoc20b_1465442_59938/tp02efb0a6_0590_4450_80d2_68d078f139ba/filterV1.o')
Building with 'gcc'.
MEX completed successfully.
### Finish Compiling rtwdemo_sfun_filterV1
### Exit

### Start Compiling rtwdemo_sfun_filterV2
    mex('-I/mathworks/devel/bat/Bdoc20b/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src', '-I/tmp/Bdoc20b_1465442_59938/tp8eb0d42c/ex19632214', '-c', '-outdir', '/tmp/Bdoc20b_1465442_59938/tpfba35956_90bc_4567_9ac1_426335ea8221', '/mathworks/devel/bat/Bdoc20b/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src/filterV2.c')
Building with 'gcc'.
MEX completed successfully.
    mex('rtwdemo_sfun_filterV2.c', '-I/mathworks/devel/bat/Bdoc20b/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src', '-I/tmp/Bdoc20b_1465442_59938/tp8eb0d42c/ex19632214', '/tmp/Bdoc20b_1465442_59938/tpfba35956_90bc_4567_9ac1_426335ea8221/filterV2.o')
Building with 'gcc'.
MEX completed successfully.
### Finish Compiling rtwdemo_sfun_filterV2
### Exit

コード生成用の TLC ブロック ファイルの生成

S-Function をコンパイルしてシミュレーションで使用した後、最初の入力を 'sfcn_tlc_generate' に設定して関数 legacy_code() を再び呼び出し、TLC ブロック ファイルを生成することができます。このブロック ファイルで、モデルの生成コードでレガシ コードを呼び出す方法を指定します。TLC ブロック ファイルを生成せずに、S-Function を含むモデルのコードを生成しようとすると、コード生成に失敗します。S-Function の TLC ブロック ファイルは、rtwdemo_sfun_filterV1.tlc および rtwdemo_sfun_filterV2.tlc です。

legacy_code('sfcn_tlc_generate', defs);

コード生成用の rtwmakecfg.m ファイルの生成

TLC ブロック ファイルの作成後に、最初の入力を 'rtwmakecfg_generate' に設定して関数 legacy_code() を再び呼び出すことができます。これは、コード生成をサポートする rtwmakecfg.m ファイルを生成するためです。S-Function に必要なソース ファイルとヘッダー ファイルが S-Function と同じフォルダーになく、コード生成時に作成される makefile 内にこれらの依存関係を追加する場合は、この rtwmakecfg.m ファイルを生成してください。

legacy_code('rtwmakecfg_generate', defs);

生成された S-Function を呼び出すためのマスクされた S-Function ブロックの生成

C-MEX S-Function ソースのコンパイルが終了したら、最初の入力を 'slblock_generate' に設定して関数 legacy_code() を再び呼び出すことができます。これは、S-Function を呼び出すマスク済みの S-Function ブロックを生成するためです。このブロックはソフトウェアによって新しいモデルに配置されます。そこから、ブロックを既存のモデルにコピーできます。

legacy_code('slblock_generate', defs);

レガシ コードとの統合の表示

モデル rtwdemo_lct_filter は、モデルとレガシ コードとの統合を示しています。サブシステム TestFilter は、以前の出力値の保存に役立つ単位遅延と共に、生成された S-Function を介したレガシ C 関数の呼び出しに利用できます。

open_system('rtwdemo_lct_filter')
open_system('rtwdemo_lct_filter/TestFilter')
sim('rtwdemo_lct_filter')

戻り引数として出力引数を渡す外部 C 関数の統合

この例では、レガシ コード ツールを使用して、戻り引数として出力を渡すレガシ C 関数を統合する方法を示します。

レガシ コード ツールでは以下が可能です。

  • レガシ関数の仕様を提供する。

  • シミュレーション中にレガシ コードを呼び出す C-MEX S-Function を生成する。

  • 生成された S-Function をシミュレーション向けにコンパイルし、ビルドする。

  • モデルの生成コードでレガシ コードを呼び出す方法を指定する TLC ブロック ファイルとオプションの rtwmakecfg.m ファイルを生成する。

レガシ関数の仕様の提供

レガシ コード ツールの関数では、特定のデータ構造体または構造体配列を引数として使用します。このデータ構造体は、最初の入力として 'initialize' を使用する関数 legacy_code() を呼び出すことで初期化できます。構造体の初期化後、統合されるレガシ コードに対応する値に、構造体のプロパティを割り当てます。プロパティの詳細なヘルプは、legacy_code('help') を呼び出してください。この例で呼び出されるレガシ関数のプロトタイプは以下のとおりです。

FLT gainScalar(const FLT in, const FLT gain)

FLT は、float に対する typedef です。レガシ ソース コードは、ファイル your_types.hgain.h、および gainScalar.c にあります。

% rtwdemo_sfun_gain_scalar
def = legacy_code('initialize');
def.SFunctionName = 'rtwdemo_sfun_gain_scalar';
def.OutputFcnSpec = 'single y1 = gainScalar(single u1, single p1)';
def.HeaderFiles   = {'gain.h'};
def.SourceFiles   = {'gainScalar.c'};
def.IncPaths      = {'rtwdemo_lct_src'};
def.SrcPaths      = {'rtwdemo_lct_src'};

シミュレーション用の S-Function の生成

入力引数 'def' によって提供される記述に従って C-MEX S-Function を生成するために、最初の入力を 'sfcn_cmex_generate' に設定して関数 legacy_code() を再び呼び出します。この S-Function により、シミュレーション中にレガシ関数が呼び出されます。S-Function のソース コードは、ファイル rtwdemo_sfun_gain_scalar.c にあります。

legacy_code('sfcn_cmex_generate', def);

生成された S-Function のシミュレーション向けのコンパイル

C-MEX S-Function ソース ファイルの生成後、Simulink® を使用したシミュレーション用に S-Function をコンパイルするために、最初の入力を 'compile' に設定して関数 legacy_code() を再び呼び出します。

legacy_code('compile', def);
### Start Compiling rtwdemo_sfun_gain_scalar
    mex('-I/mathworks/devel/bat/Bdoc20b/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src', '-I/tmp/Bdoc20b_1465442_59938/tp8eb0d42c/ex09148220', '-c', '-outdir', '/tmp/Bdoc20b_1465442_59938/tp26fab0e9_aca8_4057_9e23_e3cb99d77f01', '/mathworks/devel/bat/Bdoc20b/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src/gainScalar.c')
Building with 'gcc'.
MEX completed successfully.
    mex('rtwdemo_sfun_gain_scalar.c', '-I/mathworks/devel/bat/Bdoc20b/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src', '-I/tmp/Bdoc20b_1465442_59938/tp8eb0d42c/ex09148220', '/tmp/Bdoc20b_1465442_59938/tp26fab0e9_aca8_4057_9e23_e3cb99d77f01/gainScalar.o')
Building with 'gcc'.
MEX completed successfully.
### Finish Compiling rtwdemo_sfun_gain_scalar
### Exit

コード生成用の TLC ブロック ファイルの生成

S-Function をコンパイルしてシミュレーションで使用した後、最初の入力を 'sfcn_tlc_generate' に設定して関数 legacy_code() を再び呼び出し、TLC ブロック ファイルを生成することができます。モデルの生成コードでレガシ コードを呼び出す方法を、ブロック ファイルで指定します。TLC ブロック ファイルを生成せずに、S-Function を含むモデルのコードを生成しようとすると、コード生成に失敗します。S-Function の TLC ブロック ファイルは、rtwdemo_sfun_gain_scalar.tlc です。

legacy_code('sfcn_tlc_generate', def);

コード生成用の rtwmakecfg.m ファイルの生成

TLC ブロック ファイルの作成後に、最初の入力を 'rtwmakecfg_generate' に設定して関数 legacy_code() を再び呼び出すことができます。これは、コード生成をサポートする rtwmakecfg.m ファイルを生成するためです。S-Function に必要なソース ファイルとヘッダー ファイルが S-Function と同じフォルダーになく、コード生成時に作成される makefile 内にこれらの依存関係を追加する場合は、この rtwmakecfg.m ファイルを生成してください。

legacy_code('rtwmakecfg_generate', def);

生成された S-Function を呼び出すためのマスクされた S-Function ブロックの生成

C-MEX S-Function ソースのコンパイルが終了したら、最初の入力を 'slblock_generate' に設定して関数 legacy_code() を再び呼び出すことができます。これは、S-Function を呼び出すマスク済みの S-Function ブロックを生成するためです。このブロックはソフトウェアによって新しいモデルに配置されます。そこから、ブロックを既存のモデルにコピーできます。

legacy_code('slblock_generate', def);

レガシ コードとの統合の表示

モデル rtwdemo_lct_gain は、モデルとレガシ コードとの統合を示しています。サブシステム TestGain は、生成された S-Function を介したレガシ C 関数の呼び出しに利用できます。

open_system('rtwdemo_lct_gain')
open_system('rtwdemo_lct_gain/TestGain')
sim('rtwdemo_lct_gain')

外部 C++ オブジェクト メソッドの統合

レガシ コード ツールを使用して、レガシ C++ オブジェクト メソッドを統合します。

レガシ コード ツールでは以下が可能です。

  • レガシ関数の仕様を提供する。

  • シミュレーション中にレガシ コードを呼び出す C++ MEX S-Function を生成する。

  • 生成された S-Function をシミュレーション向けにコンパイルし、ビルドする。

  • コード生成時にレガシ コードを呼び出すブロック TLC ファイルとオプションの rtwmakecfg.m ファイルを生成する。

レガシ関数の仕様の提供

レガシ コード ツールに含まれる関数は、特定のデータ構造体または構造体配列を引数として使用します。このデータ構造体は、最初の入力として initialize を使用する関数 legacy_code() を呼び出すことで初期化されます。構造体の初期化後、統合されるレガシ コードに対応する値に、構造体のプロパティを割り当てます。プロパティの詳細なヘルプは、legacy_code('help') を呼び出してください。この例のレガシ C++ クラスの定義は以下のとおりです。

class adder {
  private:
      int int_state;
  public:
      adder();
      int add_one(int increment);
      int get_val();
};

レガシ ソース コードは、ファイル adder_cpp.hadder_cpp.cpp にあります。

% rtwdemo_sfun_adder_cpp
def = legacy_code('initialize');
def.SFunctionName = 'rtwdemo_sfun_adder_cpp';
def.StartFcnSpec  = 'createAdder()';
def.OutputFcnSpec = 'int32 y1 = adderOutput(int32 u1)';
def.TerminateFcnSpec = 'deleteAdder()';
def.HeaderFiles   = {'adder_cpp.h'};
def.SourceFiles   = {'adder_cpp.cpp'};
def.IncPaths      = {'rtwdemo_lct_src'};
def.SrcPaths      = {'rtwdemo_lct_src'};
def.Options.language = 'C++';
def.Options.useTlcWithAccel = false;

シミュレーション用の S-Function の生成

入力引数 'def' によって提供される記述に従って C-MEX S-Function を生成するために、最初の入力を 'sfcn_cmex_generate' に設定して関数 legacy_code() を再び呼び出します。この S-Function により、シミュレーション中にレガシ関数が呼び出されます。S-Function のソース コードは、ファイル rtwdemo_sfun_adder_cpp.cpp にあります。

legacy_code('sfcn_cmex_generate', def);

生成された S-Function のシミュレーション向けのコンパイル

C-MEX S-Function ソース ファイルの生成後、Simulink® を使用したシミュレーション用に S-Function をコンパイルするために、最初の入力を 'compile' に設定して関数 legacy_code() を再び呼び出します。

legacy_code('compile', def);
### Start Compiling rtwdemo_sfun_adder_cpp
    mex('-I/mathworks/devel/bat/Bdoc20b/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src', '-I/tmp/Bdoc20b_1465442_60413/tp02da355b/ex06428671', '-c', '-outdir', '/tmp/Bdoc20b_1465442_60413/tp517bc881_295f_4182_9278_c25a3baed708', '/mathworks/devel/bat/Bdoc20b/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src/adder_cpp.cpp')
Building with 'g++'.
MEX completed successfully.
    mex('rtwdemo_sfun_adder_cpp.cpp', '-I/mathworks/devel/bat/Bdoc20b/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src', '-I/tmp/Bdoc20b_1465442_60413/tp02da355b/ex06428671', '-cxx', '/tmp/Bdoc20b_1465442_60413/tp517bc881_295f_4182_9278_c25a3baed708/adder_cpp.o')
Building with 'g++'.
MEX completed successfully.
### Finish Compiling rtwdemo_sfun_adder_cpp
### Exit

コード生成用の TLC ブロック ファイルの生成

S-Function をコンパイルしてシミュレーションで使用した後、関数 legacy_code() を再び呼び出すことができます。最初の入力を 'sfcn_tlc_generate' に設定して、Simulink® Coder™ を介したコード生成をサポートする TLC ブロック ファイルを生成します。TLC ブロック ファイルを作成せずに、S-Function を含むモデルのコードを生成しようとすると、コード生成に失敗します。S-Function の TLC ブロック ファイルは、rtwdemo_sfun_adder_cpp.tlc です。

legacy_code('sfcn_tlc_generate', def);

コード生成用の rtwmakecfg.m ファイルの生成

TLC ブロック ファイルを作成した後、関数 legacy_code() を再び呼び出すことができます。最初の入力を 'rtwmakecfg_generate' に設定して、Simulink® Coder™ を介したコード生成をサポートする rtwmakecfg.m ファイルを生成します。S-Function に必要なソース ファイルとヘッダー ファイルが S-Function と同じフォルダーになく、コード生成時に作成される makefile 内にこれらの依存関係を追加する場合は、この rtwmakecfg.m ファイルを生成してください。

legacy_code('rtwmakecfg_generate', def);

生成された S-Function を呼び出すためのマスクされた S-Function ブロックの生成

C-MEX S-Function ソースのコンパイルが終了したら、関数 legacy_code() を再び呼び出すことができます。最初の入力を 'slblock_generate' に設定して、その S-Function を呼び出すように設定されたマスク済みの S-Function ブロックを生成します。このブロックはソフトウェアによって新しいモデルに配置されます。そのブロックを既存のモデルにコピーできます。

% legacy_code('slblock_generate', def);

レガシ コードとの統合の表示

モデル rtwdemo_lct_cpp は、レガシ コードとの統合を示しています。

open_system('rtwdemo_lct_cpp')
sim('rtwdemo_lct_cpp')

固定小数点データ型のパラメーターとして入出力引数を渡す外部 C 関数の統合

レガシ コード ツールを使用して、固定小数点データ型のパラメーターによって入力と出力を渡すレガシ C 関数を統合します。

レガシ コード ツールでは以下が可能です。

  • レガシ関数の仕様を提供する。

  • シミュレーション中にレガシ コードを呼び出す C-MEX S-Function を生成する。

  • 生成された S-Function をシミュレーション向けにコンパイルし、ビルドする。

  • モデルの生成コードでレガシ コードを呼び出す方法を指定する TLC ブロック ファイルとオプションの rtwmakecfg.m ファイルを生成する。

レガシ関数の仕様の提供

レガシ コード ツールの関数では、特定のデータ構造体または構造体配列を引数として使用します。このデータ構造体は、最初の入力として 'initialize' を使用する関数 legacy_code() を呼び出すことで初期化できます。構造体の初期化後、統合されるレガシ コードに対応する値に、構造体のプロパティを割り当てます。プロパティの詳細なヘルプは、legacy_code('help') を呼び出してください。この例で呼び出されるレガシ関数のプロトタイプは以下のとおりです。

myFixpt timesS16(const myFixpt in1, const myFixpt in2, const uint8_T fracLength)

myFixpt は論理的には固定小数点データ型で、物理的には 16 ビット整数に対する typedef です。

myFixpt = Simulink.NumericType;
myFixpt.DataTypeMode = 'Fixed-point: binary point scaling';
myFixpt.Signed = true;
myFixpt.WordLength = 16;
myFixpt.FractionLength = 10;
myFixpt.IsAlias = true;
myFixpt.HeaderFile = 'timesFixpt.h';

レガシ ソース コードは、ファイル timesFixpt.htimesS16.c にあります。

% rtwdemo_sfun_gain_fixpt
def = legacy_code('initialize');
def.SFunctionName = 'rtwdemo_sfun_gain_fixpt';
def.OutputFcnSpec = 'myFixpt y1 = timesS16(myFixpt u1, myFixpt p1, uint8 p2)';
def.HeaderFiles   = {'timesFixpt.h'};
def.SourceFiles   = {'timesS16.c'};
def.IncPaths      = {'rtwdemo_lct_src'};
def.SrcPaths      = {'rtwdemo_lct_src'};

シミュレーション用の S-Function の生成

入力引数 'def' によって提供される記述に従って C-MEX S-Function を生成するために、最初の入力を 'sfcn_cmex_generate' に設定して関数 legacy_code() を再び呼び出します。この S-Function により、シミュレーション中にレガシ関数が呼び出されます。S-Function のソース コードは、ファイル rtwdemo_sfun_gain_fixpt.c にあります。

legacy_code('sfcn_cmex_generate', def);

生成された S-Function のシミュレーション向けのコンパイル

C-MEX S-Function ソース ファイルの生成後、Simulink® を使用したシミュレーション用に S-Function をコンパイルするために、最初の入力を 'compile' に設定して関数 legacy_code() を再び呼び出します。

legacy_code('compile', def);
### Start Compiling rtwdemo_sfun_gain_fixpt
    mex('-I/mathworks/devel/bat/Bdoc20b/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src', '-I/tmp/Bdoc20b_1465442_59938/tp8eb0d42c/ex05928773', '-c', '-outdir', '/tmp/Bdoc20b_1465442_59938/tp644ad607_18ab_4194_b113_c281e4a6b524', '/mathworks/devel/bat/Bdoc20b/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src/timesS16.c')
Building with 'gcc'.
MEX completed successfully.
    mex('rtwdemo_sfun_gain_fixpt.c', '-I/mathworks/devel/bat/Bdoc20b/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src', '-I/tmp/Bdoc20b_1465442_59938/tp8eb0d42c/ex05928773', '/tmp/Bdoc20b_1465442_59938/tp644ad607_18ab_4194_b113_c281e4a6b524/timesS16.o')
Building with 'gcc'.
MEX completed successfully.
### Finish Compiling rtwdemo_sfun_gain_fixpt
### Exit

コード生成用の TLC ブロック ファイルの生成

S-Function をコンパイルしてシミュレーションで使用した後、関数 legacy_code() を再び呼び出すことができます。最初の入力を 'sfcn_tlc_generate' に設定して、TLC ブロック ファイルを生成します。モデルの生成コードでレガシ コードを呼び出す方法を、ブロック ファイルで指定します。TLC ブロック ファイルを生成せずに、S-Function を含むモデルのコードを生成しようとすると、コード生成に失敗します。S-Function の TLC ブロック ファイルは、rtwdemo_sfun_gain_fixpt.tlc です。

legacy_code('sfcn_tlc_generate', def);

コード生成用の rtwmakecfg.m ファイルの生成

TLC ブロック ファイルを作成した後、関数 legacy_code() を再び呼び出すことができます。最初の入力を 'rtwmakecfg_generate' に設定して、コード生成をサポートする rtwmakecfg.m ファイルを生成します。S-Function に必要なソース ファイルとヘッダー ファイルが S-Function と同じフォルダーになく、コード生成時に作成される makefile 内にこれらの依存関係を追加する場合は、この rtwmakecfg.m ファイルを生成してください。

legacy_code('rtwmakecfg_generate', def);

生成された S-Function を呼び出すためのマスクされた S-Function ブロックの生成

C-MEX S-Function ソースのコンパイルが終了したら、関数 legacy_code() を再び呼び出すことができます。最初の入力を 'slblock_generate' に設定して、その S-Function を呼び出すマスク済みの S-Function ブロックを生成します。このブロックはソフトウェアによって新しいモデルに配置されます。そのブロックを既存のモデルにコピーできます。

legacy_code('slblock_generate', def);

レガシ コードとの統合の表示

モデル rtwdemo_lct_fixpt_params は、レガシ コードとのモデルの統合を示しています。サブシステム TestFixpt は、生成された S-Function を介したレガシ C 関数の呼び出しに利用できます。

open_system('rtwdemo_lct_fixpt_params')
open_system('rtwdemo_lct_fixpt_params/TestFixpt')
sim('rtwdemo_lct_fixpt_params')

固定小数点データ型の信号として入出力引数を渡す外部 C 関数の統合

この例では、レガシ コード ツールを使用して、固定小数点データ型のパラメーターによって入力と出力を渡すレガシ C 関数を統合する方法を示します。

レガシ コード ツールでは以下が可能です。

  • レガシ関数の仕様を提供する。

  • シミュレーション中にレガシ コードを呼び出す C-MEX S-Function を生成する。

  • 生成された S-Function をシミュレーション向けにコンパイルし、ビルドする。

  • モデルの生成コードでレガシ コードを呼び出す方法を指定する TLC ブロック ファイルとオプションの rtwmakecfg.m ファイルを生成する。

レガシ関数の仕様の提供

レガシ コード ツールの関数では、特定のデータ構造体または構造体配列を引数として使用します。このデータ構造体は、最初の入力として 'initialize' を使用する関数 legacy_code() を呼び出すことで初期化できます。構造体の初期化後、統合されるレガシ コードに対応する値に、構造体のプロパティを割り当てます。プロパティの詳細なヘルプは、legacy_code('help') を呼び出してください。この例で呼び出されるレガシ関数のプロトタイプは以下のとおりです。

myFixpt timesS16(const myFixpt in1, const myFixpt in2, const uint8_T fracLength)

myFixpt は論理的には固定小数点データ型で、物理的には 16 ビット整数に対する typedef です。

myFixpt = Simulink.NumericType;
myFixpt.DataTypeMode = 'Fixed-point: binary point scaling';
myFixpt.Signed = true;
myFixpt.WordLength = 16;
myFixpt.FractionLength = 10;
myFixpt.IsAlias = true;
myFixpt.HeaderFile = 'timesFixpt.h';

レガシ ソース コードは、ファイル timesFixpt.htimesS16.c にあります。

% rtwdemo_sfun_times_s16
def = legacy_code('initialize');
def.SFunctionName = 'rtwdemo_sfun_times_s16';
def.OutputFcnSpec = 'myFixpt y1 = timesS16(myFixpt u1, myFixpt u2, uint8 p1)';
def.HeaderFiles   = {'timesFixpt.h'};
def.SourceFiles   = {'timesS16.c'};
def.IncPaths      = {'rtwdemo_lct_src'};
def.SrcPaths      = {'rtwdemo_lct_src'};

シミュレーション用の S-Function の生成

入力引数 'def' によって提供される記述に従って C-MEX S-Function を生成するために、最初の入力を 'sfcn_cmex_generate' に設定して関数 legacy_code() を再び呼び出します。この S-Function により、シミュレーション中にレガシ関数が呼び出されます。S-Function のソース コードは、ファイル rtwdemo_sfun_times_s16.c にあります。

legacy_code('sfcn_cmex_generate', def);

生成された S-Function のシミュレーション向けのコンパイル

C-MEX S-Function ソース ファイルの生成後、Simulink® を使用したシミュレーション用に S-Function をコンパイルするために、最初の入力を 'compile' に設定して関数 legacy_code() を再び呼び出します。

legacy_code('compile', def);
### Start Compiling rtwdemo_sfun_times_s16
    mex('-I/mathworks/devel/bat/Bdoc20b/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src', '-I/tmp/Bdoc20b_1465442_59938/tp8eb0d42c/ex96454812', '-c', '-outdir', '/tmp/Bdoc20b_1465442_59938/tpfeed7570_b6a2_4dda_9ed9_f9be620d2fa9', '/mathworks/devel/bat/Bdoc20b/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src/timesS16.c')
Building with 'gcc'.
MEX completed successfully.
    mex('rtwdemo_sfun_times_s16.c', '-I/mathworks/devel/bat/Bdoc20b/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src', '-I/tmp/Bdoc20b_1465442_59938/tp8eb0d42c/ex96454812', '/tmp/Bdoc20b_1465442_59938/tpfeed7570_b6a2_4dda_9ed9_f9be620d2fa9/timesS16.o')
Building with 'gcc'.
MEX completed successfully.
### Finish Compiling rtwdemo_sfun_times_s16
### Exit

コード生成用の TLC ブロック ファイルの生成

S-Function をコンパイルしてシミュレーションで使用した後、最初の入力を 'sfcn_tlc_generate' に設定して関数 legacy_code() を再び呼び出し、TLC ブロック ファイルを生成することができます。モデルの生成コードでレガシ コードを呼び出す方法を、ブロック ファイルで指定します。TLC ブロック ファイルを生成せずに、S-Function を含むモデルのコードを生成しようとすると、コード生成に失敗します。S-Function の TLC ブロック ファイルは、rtwdemo_sfun_times_s16.tlc です。

legacy_code('sfcn_tlc_generate', def);

コード生成用の rtwmakecfg.m ファイルの生成

TLC ブロック ファイルの作成後に、最初の入力を 'rtwmakecfg_generate' に設定して関数 legacy_code() を再び呼び出すことができます。これは、コード生成をサポートする rtwmakecfg.m ファイルを生成するためです。S-Function に必要なソース ファイルとヘッダー ファイルが S-Function と同じフォルダーになく、コード生成時に作成される makefile 内にこれらの依存関係を追加する場合は、この rtwmakecfg.m ファイルを生成してください。

legacy_code('rtwmakecfg_generate', def);

生成された S-Function を呼び出すためのマスクされた S-Function ブロックの生成

C-MEX S-Function ソースのコンパイルが終了したら、最初の入力を 'slblock_generate' に設定して関数 legacy_code() を再び呼び出すことができます。これは、S-Function を呼び出すマスク済みの S-Function ブロックを生成するためです。このブロックはソフトウェアによって新しいモデルに配置されます。そこから、ブロックを既存のモデルにコピーできます。

legacy_code('slblock_generate', def);

モデルとレガシ コードとの統合の表示

モデル rtwdemo_lct_fixpt_signals は、モデルとレガシ コードとの統合を示しています。サブシステム TestFixpt は、生成された S-Function を介したレガシ C 関数の呼び出しに利用できます。

open_system('rtwdemo_lct_fixpt_signals')
open_system('rtwdemo_lct_fixpt_signals/TestFixpt')
sim('rtwdemo_lct_fixpt_signals')

特定インスタンスの永続的なメモリをもつ外部 C 関数の統合

レガシ コード ツールを使用してインスタンス固有の永続的なメモリを使用するレガシ C 関数を統合します。

レガシ コード ツールでは以下が可能です。

  • レガシ関数の仕様を提供する。

  • シミュレーション中にレガシ コードを呼び出す C-MEX S-Function を生成する。

  • 生成された S-Function をシミュレーション向けにコンパイルし、ビルドする。

  • モデルの生成コードでレガシ コードを呼び出す方法を指定する TLC ブロック ファイルとオプションの rtwmakecfg.m ファイルを生成する。

レガシ関数の仕様の提供

レガシ コード ツールの関数では、特定のデータ構造体または構造体配列を引数として使用します。このデータ構造体は、最初の入力として 'initialize' を使用する関数 legacy_code() を呼び出すことで初期化できます。構造体の初期化後、統合されるレガシ コードに対応する値に、構造体のプロパティを割り当てます。プロパティの詳細なヘルプは、legacy_code('help') を呼び出してください。この例で呼び出されるレガシ関数のプロトタイプは以下のとおりです。

void memory_bus_init(COUNTERBUS *mem, int32_T upper_sat, int32_T lower_sat);

void memory_bus_step(COUNTERBUS *input, COUNTERBUS *mem, COUNTERBUS *output);

mem は、1 積分ステップ遅れを適用するための、インスタンス固有の永続的なメモリです。COUNTERBUS は、counterbus.h で定義されている struct typedef であり、ベース ワークスペース内で Simulink.Bus オブジェクトによって実装されます。レガシ ソース コードは、ファイル memory_bus.hmemory_bus.c にあります。

evalin('base','load rtwdemo_lct_data.mat')

% rtwdemo_sfun_work
def = legacy_code('initialize');
def.SFunctionName = 'rtwdemo_sfun_work';
def.InitializeConditionsFcnSpec = ...
    'void memory_bus_init(COUNTERBUS work1[1], int32 p1, int32 p2)';
def.OutputFcnSpec = ...
    'void memory_bus_step(COUNTERBUS u1[1], COUNTERBUS work1[1], COUNTERBUS y1[1])';
def.HeaderFiles   = {'memory_bus.h'};
def.SourceFiles   = {'memory_bus.c'};
def.IncPaths      = {'rtwdemo_lct_src'};
def.SrcPaths      = {'rtwdemo_lct_src'};

シミュレーション用の S-Function の生成

入力引数 'def' によって提供される記述に従って C-MEX S-Function を生成するために、最初の入力を 'sfcn_cmex_generate' に設定して関数 legacy_code() を再び呼び出します。この S-Function により、シミュレーション中にレガシ関数が呼び出されます。S-Function のソース コードは、ファイル rtwdemo_sfun_work.c にあります。

legacy_code('sfcn_cmex_generate', def);

生成された S-Function のシミュレーション向けのコンパイル

C-MEX S-Function ソース ファイルの生成後、Simulink® を使用したシミュレーション用に S-Function をコンパイルするために、最初の入力を 'compile' に設定して関数 legacy_code() を再び呼び出します。

legacy_code('compile', def);
### Start Compiling rtwdemo_sfun_work
    mex('-I/mathworks/devel/bat/Bdoc20b/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src', '-I/tmp/Bdoc20b_1465442_59938/tp8eb0d42c/ex38707886', '-c', '-outdir', '/tmp/Bdoc20b_1465442_59938/tp1d9f1305_b2ae_4295_8ed0_4ed5967afc8b', '/mathworks/devel/bat/Bdoc20b/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src/memory_bus.c')
Building with 'gcc'.
MEX completed successfully.
    mex('rtwdemo_sfun_work.c', '-I/mathworks/devel/bat/Bdoc20b/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src', '-I/tmp/Bdoc20b_1465442_59938/tp8eb0d42c/ex38707886', '/tmp/Bdoc20b_1465442_59938/tp1d9f1305_b2ae_4295_8ed0_4ed5967afc8b/memory_bus.o')
Building with 'gcc'.
MEX completed successfully.
### Finish Compiling rtwdemo_sfun_work
### Exit

コード生成用の TLC ブロック ファイルの生成

S-Function をコンパイルしてシミュレーションで使用した後、最初の入力を 'sfcn_tlc_generate' に設定して関数 legacy_code() を再び呼び出し、TLC ブロック ファイルを生成することができます。モデルの生成コードでレガシ コードを呼び出す方法を、ブロック ファイルで指定します。TLC ブロック ファイルを生成せずに、S-Function を含むモデルのコードを生成しようとすると、コード生成に失敗します。S-Function の TLC ブロック ファイルは、rtwdemo_sfun_work.tlc です。

legacy_code('sfcn_tlc_generate', def);

コード生成用の rtwmakecfg.m ファイルの生成

TLC ブロック ファイルの作成後に、最初の入力を 'rtwmakecfg_generate' に設定して関数 legacy_code() を再び呼び出すことができます。これは、コード生成をサポートする rtwmakecfg.m ファイルを生成するためです。S-Function に必要なソース ファイルとヘッダー ファイルが S-Function と同じフォルダーになく、コード生成時に作成される makefile 内にこれらの依存関係を追加する場合は、この rtwmakecfg.m ファイルを生成してください。

legacy_code('rtwmakecfg_generate', def);

生成された S-Function を呼び出すためのマスクされた S-Function ブロックの生成

C-MEX S-Function ソースのコンパイルが終了したら、最初の入力を 'slblock_generate' に設定して関数 legacy_code() を再び呼び出すことができます。これは、S-Function を呼び出すマスク済みの S-Function ブロックを生成するためです。このブロックはソフトウェアによって新しいモデルに配置されます。そこから、ブロックを既存のモデルにコピーできます。

legacy_code('slblock_generate', def);

モデルとレガシ コードとの統合の表示

モデル rtwdemo_lct_work は、モデルとレガシ コードとの統合を示しています。サブシステム memory_bus は、レガシ C 関数の呼び出しに利用できます。

open_system('rtwdemo_lct_work')
open_system('rtwdemo_lct_work/memory_bus')
sim('rtwdemo_lct_work')

構造体の引数を使用する外部 C 関数の統合

レガシ コード ツールを使用して、レガシ C 関数と Simulink® バスを使用する構造体の引数を統合します。

レガシ コード ツールでは以下が可能です。

  • レガシ関数の仕様を提供する。

  • シミュレーション中にレガシ コードを呼び出す C-MEX S-Function を生成する。

  • 生成された S-Function をシミュレーション向けにコンパイルし、ビルドする。

  • モデルの生成コードでレガシ コードを呼び出す方法を指定する TLC ブロック ファイルとオプションの rtwmakecfg.m ファイルを生成する。

レガシ関数の仕様の提供

レガシ コード ツールの関数では、特定のデータ構造体または構造体配列を引数として使用します。このデータ構造体は、最初の入力として 'initialize' を使用する関数 legacy_code() を呼び出すことで初期化できます。構造体の初期化後、統合されるレガシ コードに対応する値に、構造体のプロパティを割り当てます。プロパティの詳細なヘルプは、legacy_code('help') を呼び出してください。この例で呼び出されるレガシ関数のプロトタイプは以下のとおりです。

counterbusFcn(COUNTERBUS *u1, int32_T u2, COUNTERBUS *y1, int32_T *y2)

COUNTERBUS は、counterbus.h で定義されている struct typedef であり、ベース ワークスペース内で Simulink.Bus オブジェクトによって実装されます。レガシ ソース コードは、ファイル counterbus.hcounterbus.c にあります。

evalin('base','load rtwdemo_lct_data.mat')

% rtwdemo_sfun_counterbus
def = legacy_code('initialize');
def.SFunctionName = 'rtwdemo_sfun_counterbus';
def.OutputFcnSpec = ...
    'void counterbusFcn(COUNTERBUS u1[1], int32 u2, COUNTERBUS y1[1], int32 y2[1])';
def.HeaderFiles   = {'counterbus.h'};
def.SourceFiles   = {'counterbus.c'};
def.IncPaths      = {'rtwdemo_lct_src'};
def.SrcPaths      = {'rtwdemo_lct_src'};

シミュレーション用の S-Function の生成

入力引数 'def' によって提供される記述に従って C-MEX S-Function を生成するために、最初の入力を 'sfcn_cmex_generate' に設定して関数 legacy_code() を再び呼び出します。この S-Function により、シミュレーション中にレガシ関数が呼び出されます。S-Function のソース コードは、ファイル rtwdemo_sfun_counterbus.c にあります。

legacy_code('sfcn_cmex_generate', def);

生成された S-Function のシミュレーション向けのコンパイル

C-MEX S-Function ソース ファイルの生成後、Simulink® を使用したシミュレーション用に S-Function をコンパイルするために、最初の入力を 'compile' に設定して関数 legacy_code() を再び呼び出します。

legacy_code('compile', def);
### Start Compiling rtwdemo_sfun_counterbus
    mex('-I/mathworks/devel/bat/Bdoc20b/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src', '-I/tmp/Bdoc20b_1465442_59938/tp8eb0d42c/ex90330074', '-c', '-outdir', '/tmp/Bdoc20b_1465442_59938/tp88a0b857_3a1a_42fe_bfde_4dfa484637a0', '/mathworks/devel/bat/Bdoc20b/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src/counterbus.c')
Building with 'gcc'.
MEX completed successfully.
    mex('rtwdemo_sfun_counterbus.c', '-I/mathworks/devel/bat/Bdoc20b/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src', '-I/tmp/Bdoc20b_1465442_59938/tp8eb0d42c/ex90330074', '/tmp/Bdoc20b_1465442_59938/tp88a0b857_3a1a_42fe_bfde_4dfa484637a0/counterbus.o')
Building with 'gcc'.
MEX completed successfully.
### Finish Compiling rtwdemo_sfun_counterbus
### Exit

コード生成用の TLC ブロック ファイルの生成

S-Function をコンパイルしてシミュレーションで使用した後、最初の入力を 'sfcn_tlc_generate' に設定して関数 legacy_code() を再び呼び出し、TLC ブロック ファイルを生成することができます。モデルの生成コードでレガシ コードを呼び出す方法を、ブロック ファイルで指定します。TLC ブロック ファイルを生成せずに、S-Function を含むモデルのコードを生成しようとすると、コード生成に失敗します。S-Function の TLC ブロック ファイルは、rtwdemo_sfun_counterbus.tlc です。

legacy_code('sfcn_tlc_generate', def);

コード生成用の rtwmakecfg.m ファイルの生成

TLC ブロック ファイルの作成後に、最初の入力を 'rtwmakecfg_generate' に設定して関数 legacy_code() を再び呼び出すことができます。これは、コード生成をサポートする rtwmakecfg.m ファイルを生成するためです。S-Function に必要なソース ファイルとヘッダー ファイルが S-Function と同じフォルダーになく、コード生成時に作成される makefile 内にこれらの依存関係を追加する場合は、この rtwmakecfg.m ファイルを生成してください。

legacy_code('rtwmakecfg_generate', def);

生成された S-Function を呼び出すためのマスクされた S-Function ブロックの生成

C-MEX S-Function ソースのコンパイルが終了したら、最初の入力を 'slblock_generate' に設定して関数 legacy_code() を再び呼び出すことができます。これは、S-Function を呼び出すマスク済みの S-Function ブロックを生成するためです。このブロックはソフトウェアによって新しいモデルに配置されます。そこから、ブロックを既存のモデルにコピーできます。

legacy_code('slblock_generate', def);

モデルとレガシ コードとの統合の表示

モデル rtwdemo_lct_bus は、モデルとレガシ コードとの統合を示しています。サブシステム TestCounter は、レガシ C 関数の呼び出しに利用できます。

open_system('rtwdemo_lct_bus')
open_system('rtwdemo_lct_bus/TestCounter')
sim('rtwdemo_lct_bus')

複素数データの信号として入出力引数を渡す外部 C 関数の統合

レガシ コード ツールを使用して複素数信号を使用するレガシ C 関数を統合します。

レガシ コード ツールでは以下が可能です。

  • レガシ関数の仕様を提供する。

  • シミュレーション中にレガシ コードを呼び出す C-MEX S-Function を生成する。

  • 生成された S-Function をシミュレーション向けにコンパイルし、ビルドする。

  • モデルの生成コードでレガシ コードを呼び出す方法を指定する TLC ブロック ファイルとオプションの rtwmakecfg.m ファイルを生成する。

レガシ関数の仕様の提供

レガシ コード ツールの関数では、特定のデータ構造体または構造体配列を引数として使用します。このデータ構造体は、最初の入力として 'initialize' を使用する関数 legacy_code() を呼び出すことで初期化できます。構造体の初期化後、統合されるレガシ コードに対応する値に、構造体のプロパティを割り当てます。プロパティの詳細なヘルプは、legacy_code('help') を呼び出してください。この例で呼び出されるレガシ関数のプロトタイプは以下のとおりです。

void cplx_gain(creal_T *input, creal_T *gain, creal_T *output);

creal_T は、double の複素表現です。レガシ ソース コードは、ファイル cplxgain.hcplxgain.c にあります。

% rtwdemo_sfun_gain_scalar
def = legacy_code('initialize');
def.SFunctionName = 'rtwdemo_sfun_cplx_gain';
def.OutputFcnSpec = ...
    ['void cplx_gain(complex<double> u1[1], '...
    'complex<double> p1[1], complex<double> y1[1])'];
def.HeaderFiles   = {'cplxgain.h'};
def.SourceFiles   = {'cplxgain.c'};
def.IncPaths      = {'rtwdemo_lct_src'};
def.SrcPaths      = {'rtwdemo_lct_src'};

シミュレーション用の S-Function の生成

入力引数 'def' によって提供される記述に従って C-MEX S-Function を生成するために、最初の入力を 'sfcn_cmex_generate' に設定して関数 legacy_code() を再び呼び出します。この S-Function により、シミュレーション中にレガシ関数が呼び出されます。S-Function のソース コードは、ファイル rtwdemo_sfun_cplx_gain.c にあります。

legacy_code('sfcn_cmex_generate', def);

生成された S-Function のシミュレーション向けのコンパイル

C-MEX S-Function ソース ファイルの生成後、Simulink® を使用したシミュレーション用に S-Function をコンパイルするために、最初の入力を 'compile' に設定して関数 legacy_code() を再び呼び出します。

legacy_code('compile', def);
### Start Compiling rtwdemo_sfun_cplx_gain
    mex('-I/mathworks/devel/bat/Bdoc20b/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src', '-I/tmp/Bdoc20b_1465442_59938/tp8eb0d42c/ex97344681', '-c', '-outdir', '/tmp/Bdoc20b_1465442_59938/tp1dd24d36_0084_42a3_8810_2e34ae9e5dea', '/mathworks/devel/bat/Bdoc20b/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src/cplxgain.c')
Building with 'gcc'.
MEX completed successfully.
    mex('rtwdemo_sfun_cplx_gain.c', '-I/mathworks/devel/bat/Bdoc20b/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src', '-I/tmp/Bdoc20b_1465442_59938/tp8eb0d42c/ex97344681', '/tmp/Bdoc20b_1465442_59938/tp1dd24d36_0084_42a3_8810_2e34ae9e5dea/cplxgain.o')
Building with 'gcc'.
MEX completed successfully.
### Finish Compiling rtwdemo_sfun_cplx_gain
### Exit

コード生成用の TLC ブロック ファイルの生成

S-Function をコンパイルしてシミュレーションで使用した後、最初の入力を 'sfcn_tlc_generate' に設定して関数 legacy_code() を再び呼び出し、TLC ブロック ファイルを生成することができます。モデルの生成コードでレガシ コードを呼び出す方法を、ブロック ファイルで指定します。TLC ブロック ファイルを生成せずに、S-Function を含むモデルのコードを生成しようとすると、コード生成に失敗します。S-Function の TLC ブロック ファイルは、rtwdemo_sfun_cplx_gain.tlc です。

legacy_code('sfcn_tlc_generate', def);

コード生成用の rtwmakecfg.m ファイルの生成

TLC ブロック ファイルの作成後に、最初の入力を 'rtwmakecfg_generate' に設定して関数 legacy_code() を再び呼び出すことができます。これは、コード生成をサポートする rtwmakecfg.m ファイルを生成するためです。S-Function に必要なソース ファイルとヘッダー ファイルが S-Function と同じフォルダーになく、コード生成時に作成される makefile 内にこれらの依存関係を追加する場合は、この rtwmakecfg.m ファイルを生成してください。

legacy_code('rtwmakecfg_generate', def);

生成された S-Function を呼び出すためのマスクされた S-Function ブロックの生成

C-MEX S-Function ソースのコンパイルが終了したら、最初の入力を 'slblock_generate' に設定して関数 legacy_code() を再び呼び出すことができます。これは、S-Function を呼び出すマスク済みの S-Function ブロックを生成するためです。このブロックはソフトウェアによって新しいモデルに配置されます。そこから、ブロックを既存のモデルにコピーできます。

legacy_code('slblock_generate', def);

モデルとレガシ コードとの統合の表示

モデル rtwdemo_lct_cplxgain は、モデルとレガシ コードとの統合を示しています。サブシステム complex_gain は、生成された S-Function を介したレガシ C 関数の呼び出しに利用できます。

if isempty(find_system('SearchDepth',0,'Name','rtwdemo_lct_cplxgain'))
    open_system('rtwdemo_lct_cplxgain')
    open_system('rtwdemo_lct_cplxgain/complex_gain')
    sim('rtwdemo_lct_cplxgain')
end

次元を継承した引数を渡す外部 C 関数の統合

この例では、レガシ コード ツールを使用して、その引数に次元が継承されているレガシ C 関数を統合する方法を説明します。

レガシ コード ツールでは以下が可能です。

  • レガシ関数の仕様を提供する。

  • シミュレーション中にレガシ コードを呼び出す C-MEX S-Function を生成する。

  • 生成された S-Function をシミュレーション向けにコンパイルし、ビルドする。

  • モデルの生成コードでレガシ コードを呼び出す方法を指定する TLC ブロック ファイルとオプションの rtwmakecfg.m ファイルを生成する。

レガシ関数の仕様の提供

レガシ コード ツールの関数では、特定のデータ構造体または構造体配列を引数として使用します。このデータ構造体は、最初の入力として 'initialize' を使用する関数 legacy_code() を呼び出すことで初期化できます。構造体の初期化後、統合されるレガシ コードに対応する値に、構造体のプロパティを割り当てます。プロパティの詳細なヘルプは、legacy_code('help') を呼び出してください。この例で呼び出されるレガシ関数のプロトタイプは以下のとおりです。

  • void mat_add(real_T *u1, real_T *u2, int32_T nbRows, int32_T nbCols, real_T *y1)

  • void mat_mult(real_T *u1, real_T *u2, int32_T nbRows1, int32_T nbCols1, int32_T nbCols2, real_T *y1)

real_T は double に対する typedef で、int32_T は 32 ビット整数に対する typedef です。レガシ ソース コードは、ファイル mat_ops.hmat_ops.c にあります。

defs = [];

% rtwdemo_sfun_mat_add
def = legacy_code('initialize');
def.SFunctionName = 'rtwdemo_sfun_mat_add';
def.OutputFcnSpec = ['void mat_add(double u1[][], double u2[][], ' ...
                   'int32 u3, int32 u4, double y1[size(u1,1)][size(u1,2)])'];
def.HeaderFiles   = {'mat_ops.h'};
def.SourceFiles   = {'mat_ops.c'};
def.IncPaths      = {'rtwdemo_lct_src'};
def.SrcPaths      = {'rtwdemo_lct_src'};
defs = [defs; def];

% rtwdemo_sfun_mat_mult
def = legacy_code('initialize');
def.SFunctionName = 'rtwdemo_sfun_mat_mult';
def.OutputFcnSpec =  ['void mat_mult(double u1[p1][p2], double u2[p2][p3], '...
                   'int32 p1, int32 p2, int32 p3, double y1[p1][p3])'];
def.HeaderFiles   = {'mat_ops.h'};
def.SourceFiles   = {'mat_ops.c'};
def.IncPaths      = {'rtwdemo_lct_src'};
def.SrcPaths      = {'rtwdemo_lct_src'};
defs = [defs; def];

シミュレーション用の S-Function の生成

入力引数 'defs' によって示される説明に従って C-MEX S-Function を生成するために、最初の入力を 'sfcn_cmex_generate' に設定して関数 legacy_code() を再び呼び出します。この S-Function により、シミュレーション中にレガシ関数が呼び出されます。S-Function のソース コードは、ファイル rtwdemo_sfun_mat_add.crtwdemo_sfun_mat_mult.c にあります。

legacy_code('sfcn_cmex_generate', defs);

生成された S-Function のシミュレーション向けのコンパイル

C-MEX S-Function ソース ファイルの生成後、Simulink® を使用したシミュレーション用に S-Function をコンパイルするために、最初の入力を 'compile' に設定して関数 legacy_code() を再び呼び出します。

legacy_code('compile', defs);
### Start Compiling rtwdemo_sfun_mat_add
    mex('-I/mathworks/devel/bat/Bdoc20b/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src', '-I/tmp/Bdoc20b_1465442_59938/tp8eb0d42c/ex89794148', '-c', '-outdir', '/tmp/Bdoc20b_1465442_59938/tp6b8a7cec_1174_4c44_adfc_ea1bc26c0e4d', '/mathworks/devel/bat/Bdoc20b/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src/mat_ops.c')
Building with 'gcc'.
MEX completed successfully.
    mex('rtwdemo_sfun_mat_add.c', '-I/mathworks/devel/bat/Bdoc20b/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src', '-I/tmp/Bdoc20b_1465442_59938/tp8eb0d42c/ex89794148', '/tmp/Bdoc20b_1465442_59938/tp6b8a7cec_1174_4c44_adfc_ea1bc26c0e4d/mat_ops.o')
Building with 'gcc'.
MEX completed successfully.
### Finish Compiling rtwdemo_sfun_mat_add
### Exit

### Start Compiling rtwdemo_sfun_mat_mult
    mex('-I/mathworks/devel/bat/Bdoc20b/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src', '-I/tmp/Bdoc20b_1465442_59938/tp8eb0d42c/ex89794148', '-c', '-outdir', '/tmp/Bdoc20b_1465442_59938/tpb31b9957_2204_43e5_98de_07ed4700ce46', '/mathworks/devel/bat/Bdoc20b/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src/mat_ops.c')
Building with 'gcc'.
MEX completed successfully.
    mex('rtwdemo_sfun_mat_mult.c', '-I/mathworks/devel/bat/Bdoc20b/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src', '-I/tmp/Bdoc20b_1465442_59938/tp8eb0d42c/ex89794148', '/tmp/Bdoc20b_1465442_59938/tpb31b9957_2204_43e5_98de_07ed4700ce46/mat_ops.o')
Building with 'gcc'.
MEX completed successfully.
### Finish Compiling rtwdemo_sfun_mat_mult
### Exit

コード生成用の TLC ブロック ファイルの生成

S-Function をコンパイルしてシミュレーションで使用した後、最初の入力を 'sfcn_tlc_generate' に設定して関数 legacy_code() を再び呼び出し、TLC ブロック ファイルを生成することができます。このブロック ファイルで、モデルの生成コードでレガシ コードを呼び出す方法を指定します。TLC ブロック ファイルを生成せずに、S-Function を含むモデルのコードを生成しようとすると、コード生成に失敗します。S-Function の TLC ブロック ファイルは、rtwdemo_sfun_mat_add.tlc および rtwdemo_sfun_mat_mult.tlc です。

legacy_code('sfcn_tlc_generate', defs);

コード生成用の rtwmakecfg.m ファイルの生成

TLC ブロック ファイルの作成後に、最初の入力を 'rtwmakecfg_generate' に設定して関数 legacy_code() を再び呼び出すことができます。これは、コード生成をサポートする rtwmakecfg.m ファイルを生成するためです。S-Function に必要なソース ファイルとヘッダー ファイルが S-Function と同じフォルダーになく、コード生成時に作成される makefile 内にこれらの依存関係を追加する場合は、この rtwmakecfg.m ファイルを生成してください。

legacy_code('rtwmakecfg_generate', defs);

生成された S-Function を呼び出すためのマスクされた S-Function ブロックの生成

C-MEX S-Function ソースのコンパイルが終了したら、最初の入力を 'slblock_generate' に設定して関数 legacy_code() を再び呼び出すことができます。これは、S-Function を呼び出すマスク済みの S-Function ブロックを生成するためです。このブロックはソフトウェアによって新しいモデルに配置されます。そこから、ブロックを既存のモデルにコピーできます。

legacy_code('slblock_generate', defs);

レガシ コードとの統合の表示

モデル rtwdemo_lct_inherit_dims は、モデルとレガシ コードとの統合を示しています。サブシステム TestMatOps は、以前の出力値の保存に役立つ単位遅延と共に、レガシの C 関数の呼び出しに利用できます。

open_system('rtwdemo_lct_inherit_dims')
open_system('rtwdemo_lct_inherit_dims/TestMatOps')
sim('rtwdemo_lct_inherit_dims')

多次元信号として引数を渡す外部 C 関数の統合

この例では、レガシ コード ツールを使用して、多次元信号をもつレガシ C 関数を統合する方法を示します。

レガシ コード ツールでは以下が可能です。

  • レガシ関数の仕様を提供する。

  • シミュレーション中にレガシ コードを呼び出す C-MEX S-Function を生成する。

  • 生成された S-Function をシミュレーション向けにコンパイルし、ビルドする。

  • モデルの生成コードでレガシ コードを呼び出す方法を指定する TLC ブロック ファイルとオプションの rtwmakecfg.m ファイルを生成する。

レガシ関数の仕様の提供

レガシ コード ツールの関数では、特定のデータ構造体または構造体配列を引数として使用します。このデータ構造体は、最初の入力として 'initialize' を使用する関数 legacy_code() を呼び出すことで初期化できます。構造体の初期化後、統合されるレガシ コードに対応する値に、構造体のプロパティを割り当てます。プロパティの詳細なヘルプは、legacy_code('help') を呼び出してください。この例で呼び出されるレガシ関数のプロトタイプは以下のとおりです。

void array3d_add(real_T *y1, real_T *u1, real_T *u2, int32_T nbRows, int32_T nbCols, int32_T nbPages);

real_T は double に対する typedef で、int32_T は 32 ビット整数に対する typedef です。レガシ ソース コードは、ファイル ndarray_ops.hndarray_ops.c にあります。

% rtwdemo_sfun_ndarray_add
def = legacy_code('initialize');
def.SFunctionName = 'rtwdemo_sfun_ndarray_add';
def.OutputFcnSpec =...
    ['void array3d_add(double y1[size(u1,1)][size(u1,2)][size(u1,3)], ',...
    'double u1[][][], double u2[][][], ' ...
    'int32 size(u1,1), int32 size(u1,2), int32 size(u1,3))'];
def.HeaderFiles   = {'ndarray_ops.h'};
def.SourceFiles   = {'ndarray_ops.c'};
def.IncPaths      = {'rtwdemo_lct_src'};
def.SrcPaths      = {'rtwdemo_lct_src'};

y1 は、3 次元入力信号 u1 と同じ次元の 3 次元出力信号です。レガシ関数に渡される最後の 3 つの引数は、3 次元入力信号 u1 の各次元における要素の数に相当します。

シミュレーション用の S-Function の生成

入力引数 'def' によって提供される記述に従って C-MEX S-Function を生成するために、最初の入力を 'sfcn_cmex_generate' に設定して関数 legacy_code() を再び呼び出します。この S-Function により、シミュレーション中にレガシ関数が呼び出されます。S-Function のソース コードは、ファイル rtwdemo_sfun_ndarray_add.c にあります。

legacy_code('sfcn_cmex_generate', def);

生成された S-Function のシミュレーション向けのコンパイル

C-MEX S-Function ソース ファイルの生成後、Simulink® を使用したシミュレーション用に S-Function をコンパイルするために、最初の入力を 'compile' に設定して関数 legacy_code() を再び呼び出します。

legacy_code('compile', def);
### Start Compiling rtwdemo_sfun_ndarray_add
    mex('-I/mathworks/devel/bat/Bdoc20b/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src', '-I/tmp/Bdoc20b_1465442_50501/tpa56c3ced/ex14927435', '-c', '-outdir', '/tmp/Bdoc20b_1465442_50501/tpd03f25b7_ed71_4ebc_9757_a9987b30fce3', '/mathworks/devel/bat/Bdoc20b/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src/ndarray_ops.c')
Building with 'gcc'.
MEX completed successfully.
    mex('rtwdemo_sfun_ndarray_add.c', '-I/mathworks/devel/bat/Bdoc20b/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src', '-I/tmp/Bdoc20b_1465442_50501/tpa56c3ced/ex14927435', '/tmp/Bdoc20b_1465442_50501/tpd03f25b7_ed71_4ebc_9757_a9987b30fce3/ndarray_ops.o')
Building with 'gcc'.
MEX completed successfully.
### Finish Compiling rtwdemo_sfun_ndarray_add
### Exit

コード生成用の TLC ブロック ファイルの生成

S-Function をコンパイルしてシミュレーションで使用した後、最初の入力を 'sfcn_tlc_generate' に設定して関数 legacy_code() を再び呼び出し、TLC ブロック ファイルを生成することができます。モデルの生成コードでレガシ コードを呼び出す方法を、ブロック ファイルで指定します。TLC ブロック ファイルを生成せずに、S-Function を含むモデルのコードを生成しようとすると、コード生成に失敗します。S-Function の TLC ブロック ファイルは、rtwdemo_sfun_ndarray_add.tlc です。

legacy_code('sfcn_tlc_generate', def);

コード生成用の rtwmakecfg.m ファイルの生成

TLC ブロック ファイルの作成後に、最初の入力を 'rtwmakecfg_generate' に設定して関数 legacy_code() を再び呼び出すことができます。これは、コード生成をサポートする rtwmakecfg.m ファイルを生成するためです。S-Function に必要なソース ファイルとヘッダー ファイルが S-Function と同じフォルダーになく、コード生成時に作成される makefile 内にこれらの依存関係を追加する場合は、この rtwmakecfg.m ファイルを生成してください。

legacy_code('rtwmakecfg_generate', def);

生成された S-Function を呼び出すためのマスクされた S-Function ブロックの生成

C-MEX S-Function ソースのコンパイルが終了したら、最初の入力を 'slblock_generate' に設定して関数 legacy_code() を再び呼び出すことができます。これは、S-Function を呼び出すマスク済みの S-Function ブロックを生成するためです。このブロックはソフトウェアによって新しいモデルに配置されます。そこから、ブロックを既存のモデルにコピーできます。

legacy_code('slblock_generate', def);

レガシ コードとの統合の表示

モデル rtwdemo_lct_ndarray は、モデルとレガシ コードとの統合を示しています。サブシステム ndarray_add は、レガシ C 関数の呼び出しに利用できます。

open_system('rtwdemo_lct_ndarray')
open_system('rtwdemo_lct_ndarray/ndarray_add')
sim('rtwdemo_lct_ndarray')

開始アクションと終了アクションを実装する外部 C 関数の統合

レガシ コード ツールを使用して、開始アクションと終了アクションをもつレガシ C 関数を統合します。

レガシ コード ツールでは以下が可能です。

  • レガシ関数の仕様を提供する。

  • シミュレーション中にレガシ コードを呼び出す C-MEX S-Function を生成する。

  • 生成された S-Function をシミュレーション向けにコンパイルし、ビルドする。

  • モデルの生成コードでレガシ コードを呼び出す方法を指定する TLC ブロック ファイルとオプションの rtwmakecfg.m ファイルを生成する。

レガシ関数の仕様の提供

レガシ コード ツールの関数では、特定のデータ構造体または構造体配列を引数として使用します。このデータ構造体は、最初の入力として 'initialize' を使用する関数 legacy_code() を呼び出すことで初期化できます。構造体の初期化後、統合されるレガシ コードに対応する値に、構造体のプロパティを割り当てます。プロパティの詳細なヘルプは、legacy_code('help') を呼び出してください。この例で呼び出されるレガシ関数のプロトタイプは以下のとおりです。

  • void initFaultCounter(unsigned int *counter)

  • void openLogFile(void **fid)

  • void incAndLogFaultCounter(void *fid, unsigned int *counter, double time)

  • void closeLogFile(void **fid)

レガシ ソース コードは、ファイル your_types.hfault.h、および fault.c にあります。

% rtwdemo_sfun_fault
def = legacy_code('initialize');
def.SFunctionName = 'rtwdemo_sfun_fault';
def.InitializeConditionsFcnSpec  = 'initFaultCounter(uint32 work2[1])';
def.StartFcnSpec                 = 'openLogFile(void **work1)';
def.OutputFcnSpec                = ...
    'incAndLogFaultCounter(void *work1, uint32 work2[1], double u1)';
def.TerminateFcnSpec             = 'closeLogFile(void **work1)';
def.HeaderFiles                  = {'fault.h'};
def.SourceFiles                  = {'fault.c'};
def.IncPaths                     = {'rtwdemo_lct_src'};
def.SrcPaths                     = {'rtwdemo_lct_src'};
def.Options.useTlcWithAccel      = false;

シミュレーション用の S-Function の生成

入力引数 'def' によって提供される記述に従って C-MEX S-Function を生成するために、最初の入力を 'sfcn_cmex_generate' に設定して関数 legacy_code() を再び呼び出します。この S-Function により、シミュレーション中にレガシ関数が呼び出されます。S-Function のソース コードは、ファイル rtwdemo_sfun_fault.c にあります。

legacy_code('sfcn_cmex_generate', def);

生成された S-Function のシミュレーション向けのコンパイル

C-MEX S-Function ソース ファイルの生成後、Simulink® を使用したシミュレーション用に S-Function をコンパイルするために、最初の入力を 'compile' に設定して関数 legacy_code() を再び呼び出します。

legacy_code('compile', def);
### Start Compiling rtwdemo_sfun_fault
    mex('-I/mathworks/devel/bat/Bdoc20b/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src', '-I/tmp/Bdoc20b_1465442_50501/tpa56c3ced/ex46254423', '-c', '-outdir', '/tmp/Bdoc20b_1465442_50501/tp48618372_776a_4afe_8b3a_e2584433cfd0', '/mathworks/devel/bat/Bdoc20b/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src/fault.c')
Building with 'gcc'.
MEX completed successfully.
    mex('rtwdemo_sfun_fault.c', '-I/mathworks/devel/bat/Bdoc20b/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src', '-I/tmp/Bdoc20b_1465442_50501/tpa56c3ced/ex46254423', '/tmp/Bdoc20b_1465442_50501/tp48618372_776a_4afe_8b3a_e2584433cfd0/fault.o')
Building with 'gcc'.
MEX completed successfully.
### Finish Compiling rtwdemo_sfun_fault
### Exit

コード生成用の TLC ブロック ファイルの生成

S-Function をコンパイルしてシミュレーションで使用した後、最初の入力を 'sfcn_tlc_generate' に設定して関数 legacy_code() を再び呼び出し、TLC ブロック ファイルを生成することができます。モデルの生成コードでレガシ コードを呼び出す方法を、ブロック ファイルで指定します。TLC ブロック ファイルを生成せずに、S-Function を含むモデルのコードを生成しようとすると、コード生成に失敗します。S-Function の TLC ブロック ファイルは、rtwdemo_sfun_fault.tlc です。

legacy_code('sfcn_tlc_generate', def);

コード生成用の rtwmakecfg.m ファイルの生成

TLC ブロック ファイルの作成後に、最初の入力を 'rtwmakecfg_generate' に設定して関数 legacy_code() を再び呼び出すことができます。これは、コード生成をサポートする rtwmakecfg.m ファイルを生成するためです。S-Function に必要なソース ファイルとヘッダー ファイルが S-Function と同じフォルダーになく、コード生成時に作成される makefile 内にこれらの依存関係を追加する場合は、この rtwmakecfg.m ファイルを生成してください。

legacy_code('rtwmakecfg_generate', def);

生成された S-Function を呼び出すためのマスクされた S-Function ブロックの生成

C-MEX S-Function ソースのコンパイルが終了したら、最初の入力を 'slblock_generate' に設定して関数 legacy_code() を再び呼び出すことができます。これは、S-Function を呼び出すマスク済みの S-Function ブロックを生成するためです。このブロックはソフトウェアによって新しいモデルに配置されます。そこから、ブロックを既存のモデルにコピーできます。

legacy_code('slblock_generate', def);

レガシ コードとの統合の表示

モデル rtwdemo_lct_start_term は、モデルとレガシ コードとの統合を示しています。サブシステム TestFixpt は、レガシ C 関数の呼び出しに利用できます。スコープは、関数の出力と組み込み Simulink® Product ブロックの出力を比較します。その結果は同じになります。

open_system('rtwdemo_lct_start_term')
open_system('rtwdemo_lct_start_term/TestFault')
sim('rtwdemo_lct_start_term')

N 次元のテーブル ルックアップを実装する外部 C 関数の統合

レガシ コード ツールを使用して、N 次元のテーブル ルックアップを実装するレガシ C 関数を統合します。

レガシ コード ツールでは以下が可能です。

  • レガシ関数の仕様を提供する。

  • シミュレーション中にレガシ コードを呼び出す C-MEX S-Function を生成する。

  • 生成された S-Function をシミュレーション向けにコンパイルし、ビルドする。

  • モデルの生成コードでレガシ コードを呼び出す方法を指定する TLC ブロック ファイルとオプションの rtwmakecfg.m ファイルを生成する。

レガシ関数の仕様の提供

レガシ コード ツールの関数では、特定のデータ構造体または構造体配列を引数として使用します。このデータ構造体は、最初の入力として 'initialize' を使用する関数 legacy_code() を呼び出すことで初期化できます。構造体の初期化後、統合されるレガシ コードに対応する値に、構造体のプロパティを割り当てます。プロパティの詳細なヘルプは、legacy_code('help') を呼び出してください。この例で呼び出されるレガシ関数のプロトタイプは以下のとおりです。

FLT directLookupTableND(const FLT *tableND, const UINT32 nbDims, const UINT32 *tableDims, const UINT32 *tableIdx)

FLT は float に対する typedef で、UINT32 は符号なし int32 に対する typedef です。レガシ ソース コードは、ファイル your_types.hlookupTable.h および directLookupTableND.c にあります。

defs = [];
evalin('base','load rtwdemo_lct_data.mat')

% rtwdemo_sfun_dlut3D
def = legacy_code('initialize');
def.SFunctionName = 'rtwdemo_sfun_dlut3D';
def.OutputFcnSpec = 'single y1 = DirectLookupTable3D(single p1[][][], uint32 p2[3], uint32 u1[3])';
def.HeaderFiles   = {'lookupTable.h'};
def.SourceFiles   = {'directLookupTableND.c'};
def.IncPaths      = {'rtwdemo_lct_src'};
def.SrcPaths      = {'rtwdemo_lct_src'};
defs = [defs; def];

% rtwdemo_sfun_dlut4D
def = legacy_code('initialize');
def.SFunctionName = 'rtwdemo_sfun_dlut4D';
def.OutputFcnSpec = 'single y1 = DirectLookupTable4D(single p1[][][][], uint32 p2[4], uint32 u1[4])';
def.HeaderFiles   = {'lookupTable.h'};
def.SourceFiles   = {'directLookupTableND.c'};
def.IncPaths      = {'rtwdemo_lct_src'};
def.SrcPaths      = {'rtwdemo_lct_src'};
defs = [defs; def];

シミュレーション用の S-Function の生成

入力引数 'defs' によって示される説明に従って C-MEX S-Function を生成するために、関数 legacy_code() を再び呼び出します。最初の入力は 'sfcn_cmex_generate' に設定します。この S-Function により、シミュレーション中にレガシ関数が呼び出されます。S-Function のソース コードは、ファイル rtwdemo_sfun_dlut3D.crtwdemo_sfun_dlut4D.c にあります。

legacy_code('sfcn_cmex_generate', defs);

生成された S-Function のシミュレーション向けのコンパイル

C-MEX S-Function ソース ファイルの生成後、Simulink® を使用したシミュレーション用に S-Function をコンパイルするために、関数 legacy_code() を再び呼び出します。最初の入力は 'compile' に設定します。

legacy_code('compile', defs);
### Start Compiling rtwdemo_sfun_dlut3D
    mex('-I/mathworks/devel/bat/Bdoc20b/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src', '-I/tmp/Bdoc20b_1465442_50501/tpa56c3ced/ex19426386', '-c', '-outdir', '/tmp/Bdoc20b_1465442_50501/tpc801ab37_411a_443d_9cae_c78fff19e554', '/mathworks/devel/bat/Bdoc20b/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src/directLookupTableND.c')
Building with 'gcc'.
MEX completed successfully.
    mex('rtwdemo_sfun_dlut3D.c', '-I/mathworks/devel/bat/Bdoc20b/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src', '-I/tmp/Bdoc20b_1465442_50501/tpa56c3ced/ex19426386', '/tmp/Bdoc20b_1465442_50501/tpc801ab37_411a_443d_9cae_c78fff19e554/directLookupTableND.o')
Building with 'gcc'.
MEX completed successfully.
### Finish Compiling rtwdemo_sfun_dlut3D
### Exit

### Start Compiling rtwdemo_sfun_dlut4D
    mex('-I/mathworks/devel/bat/Bdoc20b/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src', '-I/tmp/Bdoc20b_1465442_50501/tpa56c3ced/ex19426386', '-c', '-outdir', '/tmp/Bdoc20b_1465442_50501/tp50e2bd81_d9d6_485f_93e3_cc7c7dc64f16', '/mathworks/devel/bat/Bdoc20b/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src/directLookupTableND.c')
Building with 'gcc'.
MEX completed successfully.
    mex('rtwdemo_sfun_dlut4D.c', '-I/mathworks/devel/bat/Bdoc20b/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src', '-I/tmp/Bdoc20b_1465442_50501/tpa56c3ced/ex19426386', '/tmp/Bdoc20b_1465442_50501/tp50e2bd81_d9d6_485f_93e3_cc7c7dc64f16/directLookupTableND.o')
Building with 'gcc'.
MEX completed successfully.
### Finish Compiling rtwdemo_sfun_dlut4D
### Exit

コード生成用の TLC ブロック ファイルの生成

S-Function をコンパイルしてシミュレーションで使用した後、関数 legacy_code() を再び呼び出すことができます。最初の入力を 'sfcn_tlc_generate' に設定して、TLC ブロック ファイルを生成します。このブロック ファイルで、モデルの生成コードでレガシ コードを呼び出す方法を指定します。TLC ブロック ファイルを生成せずに、S-Function を含むモデルのコードを生成しようとすると、コード生成に失敗します。S-Function の TLC ブロック ファイルは、rtwdemo_sfun_dlut3D.tlc および rtwdemo_sfun_dlut4D.tlc です。

legacy_code('sfcn_tlc_generate', defs);

コード生成用の rtwmakecfg.m ファイルの生成

TLC ブロック ファイルを作成した後、関数 legacy_code() を再び呼び出すことができます。最初の入力を 'rtwmakecfg_generate' に設定して、コード生成をサポートする rtwmakecfg.m ファイルを生成します。S-Function に必要なソース ファイルとヘッダー ファイルが S-Function と同じフォルダーになく、コード生成時に作成される makefile 内にこれらの依存関係を追加する場合は、この rtwmakecfg.m ファイルを生成してください。

legacy_code('rtwmakecfg_generate', defs);

生成された S-Function を呼び出すためのマスクされた S-Function ブロックの生成

C-MEX S-Function ソースのコンパイルが終了したら、関数 legacy_code() を再び呼び出すことができます。最初の入力を 'slblock_generate' に設定して、その S-Function を呼び出すマスク済みの S-Function ブロックを生成します。このブロックはソフトウェアによって新しいモデルに配置されます。そのブロックを既存のモデルにコピーできます。

legacy_code('slblock_generate', defs);

レガシ コードとの統合の表示

モデル rtwdemo_lct_lut は、レガシ コードとのモデルの統合を示しています。サブシステム TestFixpt は、レガシ C 関数の呼び出しに利用できます。Display ブロックは、関数の出力と組み込み Simulink® Lookup ブロックの出力を比較します。その結果は同じになります。

open_system('rtwdemo_lct_lut')
open_system('rtwdemo_lct_lut/TestLut1')
sim('rtwdemo_lct_lut')

多次元信号として引数を渡す外部 C 関数の統合

この例では、レガシ コード ツールを使用して、多次元信号をもつレガシ C 関数を統合する方法を示します。

レガシ コード ツールでは以下が可能です。

  • レガシ関数の仕様を提供する。

  • シミュレーション中にレガシ コードを呼び出す C-MEX S-Function を生成する。

  • 生成された S-Function をシミュレーション向けにコンパイルし、ビルドする。

  • モデルの生成コードでレガシ コードを呼び出す方法を指定する TLC ブロック ファイルとオプションの rtwmakecfg.m ファイルを生成する。

レガシ関数の仕様の提供

レガシ コード ツールの関数では、特定のデータ構造体または構造体配列を引数として使用します。このデータ構造体は、最初の入力として 'initialize' を使用する関数 legacy_code() を呼び出すことで初期化できます。構造体の初期化後、統合されるレガシ コードに対応する値に、構造体のプロパティを割り当てます。プロパティの詳細なヘルプは、legacy_code('help') を呼び出してください。この例で呼び出されるレガシ関数のプロトタイプは以下のとおりです。

void array3d_add(real_T *y1, real_T *u1, real_T *u2, int32_T nbRows, int32_T nbCols, int32_T nbPages);

real_T は double に対する typedef で、int32_T は 32 ビット整数に対する typedef です。レガシ ソース コードは、ファイル ndarray_ops.hndarray_ops.c にあります。

% rtwdemo_sfun_ndarray_add
def = legacy_code('initialize');
def.SFunctionName = 'rtwdemo_sfun_ndarray_add';
def.OutputFcnSpec =...
    ['void array3d_add(double y1[size(u1,1)][size(u1,2)][size(u1,3)], ',...
    'double u1[][][], double u2[][][], ' ...
    'int32 size(u1,1), int32 size(u1,2), int32 size(u1,3))'];
def.HeaderFiles   = {'ndarray_ops.h'};
def.SourceFiles   = {'ndarray_ops.c'};
def.IncPaths      = {'rtwdemo_lct_src'};
def.SrcPaths      = {'rtwdemo_lct_src'};

y1 は、3 次元入力信号 u1 と同じ次元の 3 次元出力信号です。レガシ関数に渡される最後の 3 つの引数は、3 次元入力信号 u1 の各次元における要素の数に相当します。

シミュレーション用の S-Function の生成

入力引数 'def' によって提供される記述に従って C-MEX S-Function を生成するために、最初の入力を 'sfcn_cmex_generate' に設定して関数 legacy_code() を再び呼び出します。この S-Function により、シミュレーション中にレガシ関数が呼び出されます。S-Function のソース コードは、ファイル rtwdemo_sfun_ndarray_add.c にあります。

legacy_code('sfcn_cmex_generate', def);

生成された S-Function のシミュレーション向けのコンパイル

C-MEX S-Function ソース ファイルの生成後、Simulink® を使用したシミュレーション用に S-Function をコンパイルするために、最初の入力を 'compile' に設定して関数 legacy_code() を再び呼び出します。

legacy_code('compile', def);
### Start Compiling rtwdemo_sfun_ndarray_add
    mex('-I/mathworks/devel/bat/Bdoc20b/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src', '-I/tmp/Bdoc20b_1465442_50501/tpa56c3ced/ex14927435', '-c', '-outdir', '/tmp/Bdoc20b_1465442_50501/tpd03f25b7_ed71_4ebc_9757_a9987b30fce3', '/mathworks/devel/bat/Bdoc20b/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src/ndarray_ops.c')
Building with 'gcc'.
MEX completed successfully.
    mex('rtwdemo_sfun_ndarray_add.c', '-I/mathworks/devel/bat/Bdoc20b/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src', '-I/tmp/Bdoc20b_1465442_50501/tpa56c3ced/ex14927435', '/tmp/Bdoc20b_1465442_50501/tpd03f25b7_ed71_4ebc_9757_a9987b30fce3/ndarray_ops.o')
Building with 'gcc'.
MEX completed successfully.
### Finish Compiling rtwdemo_sfun_ndarray_add
### Exit

コード生成用の TLC ブロック ファイルの生成

S-Function をコンパイルしてシミュレーションで使用した後、最初の入力を 'sfcn_tlc_generate' に設定して関数 legacy_code() を再び呼び出し、TLC ブロック ファイルを生成することができます。モデルの生成コードでレガシ コードを呼び出す方法を、ブロック ファイルで指定します。TLC ブロック ファイルを生成せずに、S-Function を含むモデルのコードを生成しようとすると、コード生成に失敗します。S-Function の TLC ブロック ファイルは、rtwdemo_sfun_ndarray_add.tlc です。

legacy_code('sfcn_tlc_generate', def);

コード生成用の rtwmakecfg.m ファイルの生成

TLC ブロック ファイルの作成後に、最初の入力を 'rtwmakecfg_generate' に設定して関数 legacy_code() を再び呼び出すことができます。これは、コード生成をサポートする rtwmakecfg.m ファイルを生成するためです。S-Function に必要なソース ファイルとヘッダー ファイルが S-Function と同じフォルダーになく、コード生成時に作成される makefile 内にこれらの依存関係を追加する場合は、この rtwmakecfg.m ファイルを生成してください。

legacy_code('rtwmakecfg_generate', def);

生成された S-Function を呼び出すためのマスクされた S-Function ブロックの生成

C-MEX S-Function ソースのコンパイルが終了したら、最初の入力を 'slblock_generate' に設定して関数 legacy_code() を再び呼び出すことができます。これは、S-Function を呼び出すマスク済みの S-Function ブロックを生成するためです。このブロックはソフトウェアによって新しいモデルに配置されます。そこから、ブロックを既存のモデルにコピーできます。

legacy_code('slblock_generate', def);

レガシ コードとの統合の表示

モデル rtwdemo_lct_ndarray は、モデルとレガシ コードとの統合を示しています。サブシステム ndarray_add は、レガシ C 関数の呼び出しに利用できます。

open_system('rtwdemo_lct_ndarray')
open_system('rtwdemo_lct_ndarray/ndarray_add')
sim('rtwdemo_lct_ndarray')

指定、継承およびパラメーター化されたブロック サンプル時間をもつ外部 C 関数の統合

この例では、レガシ コード ツールを使用して、指定、継承およびパラメーター化された、ブロックのサンプル時間をもつレガシ C 関数を統合する方法を説明します。

レガシ コード ツールでは以下が可能です。

  • レガシ関数の仕様を提供する。

  • シミュレーション中にレガシ コードを呼び出す C-MEX S-Function を生成する。

  • 生成された S-Function をシミュレーション向けにコンパイルし、ビルドする。

  • モデルの生成コードでレガシ コードを呼び出す方法を指定する TLC ブロック ファイルとオプションの rtwmakecfg.m ファイルを生成する。

レガシ関数の仕様の提供

レガシ コード ツールの関数では、特定のデータ構造体または構造体配列を引数として使用します。このデータ構造体は、最初の入力として 'initialize' を使用する関数 legacy_code() を呼び出すことで初期化できます。構造体の初期化後、統合されるレガシ コードに対応する値に、構造体のプロパティを割り当てます。プロパティの詳細なヘルプは、legacy_code('help') を呼び出してください。この例で呼び出されるレガシ関数のプロトタイプは以下のとおりです。

FLT gainScalar(const FLT in, const FLT gain)

FLT は、float に対する typedef です。レガシ ソース コードは、ファイル your_types.hgain.h、および gainScalar.c にあります。

defs = [];

% rtwdemo_sfun_st_inherited
def = legacy_code('initialize');
def.SFunctionName = 'rtwdemo_sfun_st_inherited';
def.OutputFcnSpec = 'single y1 = gainScalar(single u1, single p1)';
def.HeaderFiles   = {'gain.h'};
def.SourceFiles   = {'gainScalar.c'};
def.IncPaths      = {'rtwdemo_lct_src'};
def.SrcPaths      = {'rtwdemo_lct_src'};
defs = [defs; def];

% rtwdemo_sfun_st_fixed
def = legacy_code('initialize');
def.SFunctionName = 'rtwdemo_sfun_st_fixed';
def.OutputFcnSpec = 'single y1 = gainScalar(single u1, single p1)';
def.HeaderFiles   = {'gain.h'};
def.SourceFiles   = {'gainScalar.c'};
def.IncPaths      = {'rtwdemo_lct_src'};
def.SrcPaths      = {'rtwdemo_lct_src'};
def.SampleTime    = [2 1];
defs = [defs; def];

% rtwdemo_sfun_st_parameterized
def = legacy_code('initialize');
def.SFunctionName = 'rtwdemo_sfun_st_parameterized';
def.OutputFcnSpec = 'single y1 = gainScalar(single u1, single p1)';
def.HeaderFiles   = {'gain.h'};
def.SourceFiles   = {'gainScalar.c'};
def.IncPaths      = {'rtwdemo_lct_src'};
def.SrcPaths      = {'rtwdemo_lct_src'};
def.SampleTime    = 'parameterized';
defs = [defs; def];

シミュレーション用の S-Function の生成

入力引数 'defs' によって示される説明に従って C-MEX S-Function を生成するために、最初の入力を 'sfcn_cmex_generate' に設定して関数 legacy_code() を再び呼び出します。この S-Function により、シミュレーション中にレガシ関数が呼び出されます。S-Function のソース コードは、ファイル rtwdemo_sfun_st_inherited.crtwdemo_sfun_st_fixed.c および rtwdemo_sfun_st_parameterized.c にあります。

legacy_code('sfcn_cmex_generate', defs);

生成された S-Function のシミュレーション向けのコンパイル

C-MEX S-Function ソース ファイルの生成後、Simulink® を使用したシミュレーション用に S-Function をコンパイルするために、最初の入力を 'compile' に設定して関数 legacy_code() を再び呼び出します。

legacy_code('compile', defs);
### Start Compiling rtwdemo_sfun_st_inherited
    mex('-I/mathworks/devel/bat/Bdoc20b/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src', '-I/tmp/Bdoc20b_1465442_59938/tp8eb0d42c/ex74504488', '-c', '-outdir', '/tmp/Bdoc20b_1465442_59938/tpabcf5c2d_60af_4daf_adc8_612f6a269082', '/mathworks/devel/bat/Bdoc20b/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src/gainScalar.c')
Building with 'gcc'.
MEX completed successfully.
    mex('rtwdemo_sfun_st_inherited.c', '-I/mathworks/devel/bat/Bdoc20b/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src', '-I/tmp/Bdoc20b_1465442_59938/tp8eb0d42c/ex74504488', '/tmp/Bdoc20b_1465442_59938/tpabcf5c2d_60af_4daf_adc8_612f6a269082/gainScalar.o')
Building with 'gcc'.
MEX completed successfully.
### Finish Compiling rtwdemo_sfun_st_inherited
### Exit

### Start Compiling rtwdemo_sfun_st_fixed
    mex('-I/mathworks/devel/bat/Bdoc20b/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src', '-I/tmp/Bdoc20b_1465442_59938/tp8eb0d42c/ex74504488', '-c', '-outdir', '/tmp/Bdoc20b_1465442_59938/tp04d8c1e7_032f_4a10_9ce3_e13bd3d5e3dd', '/mathworks/devel/bat/Bdoc20b/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src/gainScalar.c')
Building with 'gcc'.
MEX completed successfully.
    mex('rtwdemo_sfun_st_fixed.c', '-I/mathworks/devel/bat/Bdoc20b/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src', '-I/tmp/Bdoc20b_1465442_59938/tp8eb0d42c/ex74504488', '/tmp/Bdoc20b_1465442_59938/tp04d8c1e7_032f_4a10_9ce3_e13bd3d5e3dd/gainScalar.o')
Building with 'gcc'.
MEX completed successfully.
### Finish Compiling rtwdemo_sfun_st_fixed
### Exit

### Start Compiling rtwdemo_sfun_st_parameterized
    mex('-I/mathworks/devel/bat/Bdoc20b/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src', '-I/tmp/Bdoc20b_1465442_59938/tp8eb0d42c/ex74504488', '-c', '-outdir', '/tmp/Bdoc20b_1465442_59938/tpa80f921e_bbba_428b_82df_20ed6254c645', '/mathworks/devel/bat/Bdoc20b/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src/gainScalar.c')
Building with 'gcc'.
MEX completed successfully.
    mex('rtwdemo_sfun_st_parameterized.c', '-I/mathworks/devel/bat/Bdoc20b/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src', '-I/tmp/Bdoc20b_1465442_59938/tp8eb0d42c/ex74504488', '/tmp/Bdoc20b_1465442_59938/tpa80f921e_bbba_428b_82df_20ed6254c645/gainScalar.o')
Building with 'gcc'.
MEX completed successfully.
### Finish Compiling rtwdemo_sfun_st_parameterized
### Exit

コード生成用の TLC ブロック ファイルの生成

S-Function をコンパイルしてシミュレーションで使用した後、最初の入力を 'sfcn_tlc_generate' に設定して関数 legacy_code() を再び呼び出し、TLC ブロック ファイルを生成することができます。このブロック ファイルで、モデルの生成コードでレガシ コードを呼び出す方法を指定します。TLC ブロック ファイルを生成せずに、S-Function を含むモデルのコードを生成しようとすると、コード生成に失敗します。S-Function の TLC ブロック ファイルは、rtwdemo_sfun_st_inherited.tlcrtwdemo_sfun_st_fixed.tlc および rtwdemo_sfun_st_parameterized.tlc です。

legacy_code('sfcn_tlc_generate', defs);

コード生成用の rtwmakecfg.m ファイルの生成

TLC ブロック ファイルの作成後に、最初の入力を 'rtwmakecfg_generate' に設定して関数 legacy_code() を再び呼び出すことができます。これは、コード生成をサポートする rtwmakecfg.m ファイルを生成するためです。S-Function に必要なソース ファイルとヘッダー ファイルが S-Function と同じフォルダーになく、コード生成時に作成される makefile 内にこれらの依存関係を追加する場合は、この rtwmakecfg.m ファイルを生成してください。

legacy_code('rtwmakecfg_generate', defs);

生成された S-Function を呼び出すためのマスクされた S-Function ブロックの生成

C-MEX S-Function ソースのコンパイルが終了したら、最初の入力を 'slblock_generate' に設定して関数 legacy_code() を再び呼び出すことができます。これは、S-Function を呼び出すマスク済みの S-Function ブロックを生成するためです。このブロックはソフトウェアによって新しいモデルに配置されます。そこから、ブロックを既存のモデルにコピーできます。

legacy_code('slblock_generate', defs);

レガシ コードとの統合の表示

モデル rtwdemo_lct_sampletime は、モデルとレガシ コードとの統合を示しています。サブシステム sample_time は、以前の出力値の保存に役立つ単位遅延と共に、レガシ C 関数の呼び出しに利用できます。

open_system('rtwdemo_lct_sampletime')
open_system('rtwdemo_lct_sampletime/sample_time')
sim('rtwdemo_lct_sampletime')

参考

関連するトピック