Main Content

レガシ コード ツールの例

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

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

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

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

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

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

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

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

レガシ関数の仕様の提供

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

  • 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 です。レガシ ソース コードは次のファイルにあります。* rtwdemo_lct_src/your_types.h * rtwdemo_lct_src/myfilter.h * rtwdemo_lct_src/filterV1.c * rtwdemo_lct_src/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.c * rtwdemo_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/tmp/Bdoc23b_2395265_2114772/tp72f1d74f/simulinkcoder-ex19632214/rtwdemo_lct_src', '-I/tmp/Bdoc23b_2395265_2114772/tp72f1d74f/simulinkcoder-ex19632214', '-c', '-outdir', '/tmp/Bdoc23b_2395265_2114772/tp1277dd95_72fd_4453_88aa_2d0d8cfd5d5b', '/tmp/Bdoc23b_2395265_2114772/tp72f1d74f/simulinkcoder-ex19632214/rtwdemo_lct_src/filterV1.c')
Building with 'gcc'.
MEX completed successfully.
    mex('rtwdemo_sfun_filterV1.c', '-I/tmp/Bdoc23b_2395265_2114772/tp72f1d74f/simulinkcoder-ex19632214/rtwdemo_lct_src', '-I/tmp/Bdoc23b_2395265_2114772/tp72f1d74f/simulinkcoder-ex19632214', '/tmp/Bdoc23b_2395265_2114772/tp1277dd95_72fd_4453_88aa_2d0d8cfd5d5b/filterV1.o')
Building with 'gcc'.
MEX completed successfully.
### Finish Compiling rtwdemo_sfun_filterV1
### Exit

### Start Compiling rtwdemo_sfun_filterV2
    mex('-I/tmp/Bdoc23b_2395265_2114772/tp72f1d74f/simulinkcoder-ex19632214/rtwdemo_lct_src', '-I/tmp/Bdoc23b_2395265_2114772/tp72f1d74f/simulinkcoder-ex19632214', '-c', '-outdir', '/tmp/Bdoc23b_2395265_2114772/tp8b6982c5_9d60_4430_8def_acde1c6da48c', '/tmp/Bdoc23b_2395265_2114772/tp72f1d74f/simulinkcoder-ex19632214/rtwdemo_lct_src/filterV2.c')
Building with 'gcc'.
MEX completed successfully.
    mex('rtwdemo_sfun_filterV2.c', '-I/tmp/Bdoc23b_2395265_2114772/tp72f1d74f/simulinkcoder-ex19632214/rtwdemo_lct_src', '-I/tmp/Bdoc23b_2395265_2114772/tp72f1d74f/simulinkcoder-ex19632214', '/tmp/Bdoc23b_2395265_2114772/tp8b6982c5_9d60_4430_8def_acde1c6da48c/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);

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

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

open_system('LctValueVersusAddress')
open_system('LctValueVersusAddress/TestFilter')
sim('LctValueVersusAddress')

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

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

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

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

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

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

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

レガシ関数の仕様の提供

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

FLT gainScalar(const FLT in, const FLT gain)

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

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

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

入力引数 def によって提供される記述に従って C-MEX S-Function を生成するために、最初の入力を sfcn_cmex_generate に設定して関数 legacy_code() を再び呼び出します。この S-Function により、シミュレーション中にレガシ関数が呼び出されます。S-Function のソース コードは、ファイル 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 sfun_gain_scalar
    mex('-I/tmp/Bdoc23b_2395265_2114772/tp72f1d74f/simulinkcoder-ex09148220/Lct_src', '-I/tmp/Bdoc23b_2395265_2114772/tp72f1d74f/simulinkcoder-ex09148220', '-c', '-outdir', '/tmp/Bdoc23b_2395265_2114772/tp5d6dd9c9_893f_4f96_8209_9799927fadbb', '/tmp/Bdoc23b_2395265_2114772/tp72f1d74f/simulinkcoder-ex09148220/Lct_src/gainScalar.c')
Building with 'gcc'.
MEX completed successfully.
    mex('sfun_gain_scalar.c', '-I/tmp/Bdoc23b_2395265_2114772/tp72f1d74f/simulinkcoder-ex09148220/Lct_src', '-I/tmp/Bdoc23b_2395265_2114772/tp72f1d74f/simulinkcoder-ex09148220', '/tmp/Bdoc23b_2395265_2114772/tp5d6dd9c9_893f_4f96_8209_9799927fadbb/gainScalar.o')
Building with 'gcc'.
MEX completed successfully.
### Finish Compiling sfun_gain_scalar
### Exit

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

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

legacy_code('sfcn_tlc_generate', def);

S-Function の生成された TLC ブロック ファイルは、sfun_gain_scalar.tlc です。

コード生成用の 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);

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

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

open_system('LctExternalCodeImportGain')
open_system('LctExternalCodeImportGain/TestGain')
sim('LctExternalCodeImportGain')

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

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

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

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

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

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

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

レガシ関数の仕様の提供

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

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

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

% sfun_adder_cpp
def = legacy_code('initialize');
def.SFunctionName = '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      = {'Lct_src'};
def.SrcPaths      = {'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 のソース コードは、ファイル 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 sfun_adder_cpp
    mex('-I/tmp/Bdoc23b_2395265_2117481/tp3b741673/simulinkcoder-ex06428671/Lct_src', '-I/tmp/Bdoc23b_2395265_2117481/tp3b741673/simulinkcoder-ex06428671', '-c', '-outdir', '/tmp/Bdoc23b_2395265_2117481/tp6990cfcf_a236_49fe_9592_a7658f83d7f6', '/tmp/Bdoc23b_2395265_2117481/tp3b741673/simulinkcoder-ex06428671/Lct_src/adder_cpp.cpp')
Building with 'g++'.
MEX completed successfully.
    mex('sfun_adder_cpp.cpp', '-I/tmp/Bdoc23b_2395265_2117481/tp3b741673/simulinkcoder-ex06428671/Lct_src', '-I/tmp/Bdoc23b_2395265_2117481/tp3b741673/simulinkcoder-ex06428671', '-cxx', '/tmp/Bdoc23b_2395265_2117481/tp6990cfcf_a236_49fe_9592_a7658f83d7f6/adder_cpp.o')
Building with 'g++'.
MEX completed successfully.
### Finish Compiling sfun_adder_cpp
### Exit

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

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

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

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

open_system('LctExternalCodeImportCpp')
sim('LctExternalCodeImportCpp')

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

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

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

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

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

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

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

レガシ関数の仕様の提供

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

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 にあります。

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

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

入力引数 def によって提供される記述に従って C-MEX S-Function を生成するために、最初の入力を sfcn_cmex_generate に設定して関数 legacy_code() を再び呼び出します。この S-Function により、シミュレーション中にレガシ関数が呼び出されます。S-Function のソース コードは、ファイル 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 sfun_gain_fixpt
    mex('-I/tmp/Bdoc23b_2395265_2114772/tp72f1d74f/simulinkcoder-ex05928773/Lct_src', '-I/tmp/Bdoc23b_2395265_2114772/tp72f1d74f/simulinkcoder-ex05928773', '-c', '-outdir', '/tmp/Bdoc23b_2395265_2114772/tp9f79bb9d_5e9e_4056_a7e6_7138198e0a17', '/tmp/Bdoc23b_2395265_2114772/tp72f1d74f/simulinkcoder-ex05928773/Lct_src/timesS16.c')
Building with 'gcc'.
MEX completed successfully.
    mex('sfun_gain_fixpt.c', '-I/tmp/Bdoc23b_2395265_2114772/tp72f1d74f/simulinkcoder-ex05928773/Lct_src', '-I/tmp/Bdoc23b_2395265_2114772/tp72f1d74f/simulinkcoder-ex05928773', '/tmp/Bdoc23b_2395265_2114772/tp9f79bb9d_5e9e_4056_a7e6_7138198e0a17/timesS16.o')
Building with 'gcc'.
MEX completed successfully.
### Finish Compiling sfun_gain_fixpt
### Exit

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

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

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

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

open_system('LctFixedParams')
open_system('LctFixedParams/TestFixpt')
sim('LctFixedParams')

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

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

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

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

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

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

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

レガシ関数の仕様の提供

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

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 にあります。

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

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

入力引数 def によって提供される記述に従って C-MEX S-Function を生成するために、最初の入力を sfcn_cmex_generate に設定して関数 legacy_code() を再び呼び出します。この S-Function により、シミュレーション中にレガシ関数が呼び出されます。S-Function のソース コードは、ファイル 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 sfun_times_s16
    mex('-I/tmp/Bdoc23b_2395265_2114772/tp72f1d74f/simulinkcoder-ex96454812/Lct_src', '-I/tmp/Bdoc23b_2395265_2114772/tp72f1d74f/simulinkcoder-ex96454812', '-c', '-outdir', '/tmp/Bdoc23b_2395265_2114772/tpf58d4d9c_51fa_4abd_bd85_823e21dac997', '/tmp/Bdoc23b_2395265_2114772/tp72f1d74f/simulinkcoder-ex96454812/Lct_src/timesS16.c')
Building with 'gcc'.
MEX completed successfully.
    mex('sfun_times_s16.c', '-I/tmp/Bdoc23b_2395265_2114772/tp72f1d74f/simulinkcoder-ex96454812/Lct_src', '-I/tmp/Bdoc23b_2395265_2114772/tp72f1d74f/simulinkcoder-ex96454812', '/tmp/Bdoc23b_2395265_2114772/tpf58d4d9c_51fa_4abd_bd85_823e21dac997/timesS16.o')
Building with 'gcc'.
MEX completed successfully.
### Finish Compiling sfun_times_s16
### Exit

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

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

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

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

open_system('LctFixedSignals')
open_system('LctFixedSignals/TestFixpt')
sim('LctFixedSignals')

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

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

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

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

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

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

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

レガシ関数の仕様の提供

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

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 Lct_data.mat')

% sfun_work
def = legacy_code('initialize');
def.SFunctionName = '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      = {'Lct_src'};
def.SrcPaths      = {'Lct_src'};

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

入力引数 def によって提供される記述に従って C-MEX S-Function を生成するために、最初の入力を sfcn_cmex_generate に設定して関数 legacy_code() を再び呼び出します。この S-Function により、シミュレーション中にレガシ関数が呼び出されます。S-Function のソース コードは、生成された 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 sfun_work
    mex('-I/tmp/Bdoc23b_2395265_2114772/tp72f1d74f/simulinkcoder-ex38707886/Lct_src', '-I/tmp/Bdoc23b_2395265_2114772/tp72f1d74f/simulinkcoder-ex38707886', '-c', '-outdir', '/tmp/Bdoc23b_2395265_2114772/tpe31e6253_b3b8_4303_b3f8_105132751c41', '/tmp/Bdoc23b_2395265_2114772/tp72f1d74f/simulinkcoder-ex38707886/Lct_src/memory_bus.c')
Building with 'gcc'.
MEX completed successfully.
    mex('sfun_work.c', '-I/tmp/Bdoc23b_2395265_2114772/tp72f1d74f/simulinkcoder-ex38707886/Lct_src', '-I/tmp/Bdoc23b_2395265_2114772/tp72f1d74f/simulinkcoder-ex38707886', '/tmp/Bdoc23b_2395265_2114772/tpe31e6253_b3b8_4303_b3f8_105132751c41/memory_bus.o')
Building with 'gcc'.
MEX completed successfully.
### Finish Compiling sfun_work
### Exit

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

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

legacy_code('sfcn_tlc_generate', def);

S-Function の TLC ブロック ファイルは、sfun_work.tlc です。

コード生成用の 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);

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

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

open_system('LctInstanceSpecificMemory')
open_system('LctInstanceSpecificMemory/memory_bus')
sim('LctInstanceSpecificMemory')

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

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

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

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

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

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

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

レガシ関数の仕様の提供

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

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

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

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

% rtwdemo_sfun_counterbus
def = legacy_code('initialize');
def.SFunctionName = '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      = {'Lct_src'};
def.SrcPaths      = {'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 sfun_counterbus
    mex('-I/tmp/Bdoc23b_2395265_2114772/tp72f1d74f/simulinkcoder-ex90330074/Lct_src', '-I/tmp/Bdoc23b_2395265_2114772/tp72f1d74f/simulinkcoder-ex90330074', '-c', '-outdir', '/tmp/Bdoc23b_2395265_2114772/tpe38b3d39_f53e_4f63_8de7_aa0ad69188f3', '/tmp/Bdoc23b_2395265_2114772/tp72f1d74f/simulinkcoder-ex90330074/Lct_src/counterbus.c')
Building with 'gcc'.
MEX completed successfully.
    mex('sfun_counterbus.c', '-I/tmp/Bdoc23b_2395265_2114772/tp72f1d74f/simulinkcoder-ex90330074/Lct_src', '-I/tmp/Bdoc23b_2395265_2114772/tp72f1d74f/simulinkcoder-ex90330074', '/tmp/Bdoc23b_2395265_2114772/tpe38b3d39_f53e_4f63_8de7_aa0ad69188f3/counterbus.o')
Building with 'gcc'.
MEX completed successfully.
### Finish Compiling sfun_counterbus
### Exit

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

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

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

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

open_system('LctStructureArguments')
open_system('LctStructureArguments/TestCounter')
sim('LctStructureArguments')

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

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

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

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

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

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

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

レガシ関数の仕様の提供

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

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

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

% sfun_gain_scalar
def = legacy_code('initialize');
def.SFunctionName = '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      = {'Lct_src'};
def.SrcPaths      = {'Lct_src'};

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

入力引数 def によって提供される記述に従って C-MEX S-Function を生成するために、最初の入力を sfcn_cmex_generate に設定して関数 legacy_code() を再び呼び出します。この S-Function により、シミュレーション中にレガシ関数が呼び出されます。S-Function のソース コードは、ファイル 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 sfun_cplx_gain
    mex('-I/tmp/Bdoc23b_2395265_2114772/tp72f1d74f/simulinkcoder-ex97344681/Lct_src', '-I/tmp/Bdoc23b_2395265_2114772/tp72f1d74f/simulinkcoder-ex97344681', '-c', '-outdir', '/tmp/Bdoc23b_2395265_2114772/tp2986a49f_9d7a_453a_b885_2207e05cbd22', '/tmp/Bdoc23b_2395265_2114772/tp72f1d74f/simulinkcoder-ex97344681/Lct_src/cplxgain.c')
Building with 'gcc'.
MEX completed successfully.
    mex('sfun_cplx_gain.c', '-I/tmp/Bdoc23b_2395265_2114772/tp72f1d74f/simulinkcoder-ex97344681/Lct_src', '-I/tmp/Bdoc23b_2395265_2114772/tp72f1d74f/simulinkcoder-ex97344681', '/tmp/Bdoc23b_2395265_2114772/tp2986a49f_9d7a_453a_b885_2207e05cbd22/cplxgain.o')
Building with 'gcc'.
MEX completed successfully.
### Finish Compiling sfun_cplx_gain
### Exit

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

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

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

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

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

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

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

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

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

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

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

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

レガシ関数の仕様の提供

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

  • 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 = [];

% sfun_mat_add
def = legacy_code('initialize');
def.SFunctionName = '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      = {'Lct_src'};
def.SrcPaths      = {'Lct_src'};
defs = [defs; def];

% sfun_mat_mult
def = legacy_code('initialize');
def.SFunctionName = '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      = {'Lct_src'};
def.SrcPaths      = {'Lct_src'};
defs = [defs; def];

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

入力引数 defs によって提供される記述に従って C-MEX S-Function を生成するために、最初の入力を sfcn_cmex_generate に設定して関数 legacy_code() を再び呼び出します。この S-Function により、シミュレーション中にレガシ関数が呼び出されます。S-Function のソース コードは、ファイル sfun_mat_add.csfun_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 sfun_mat_add
    mex('-I/tmp/Bdoc23b_2395265_2114772/tp72f1d74f/simulinkcoder-ex89794148/Lct_src', '-I/tmp/Bdoc23b_2395265_2114772/tp72f1d74f/simulinkcoder-ex89794148', '-c', '-outdir', '/tmp/Bdoc23b_2395265_2114772/tp4baf7214_380a_4b6f_8b72_0b87613f541e', '/tmp/Bdoc23b_2395265_2114772/tp72f1d74f/simulinkcoder-ex89794148/Lct_src/mat_ops.c')
Building with 'gcc'.
MEX completed successfully.
    mex('sfun_mat_add.c', '-I/tmp/Bdoc23b_2395265_2114772/tp72f1d74f/simulinkcoder-ex89794148/Lct_src', '-I/tmp/Bdoc23b_2395265_2114772/tp72f1d74f/simulinkcoder-ex89794148', '/tmp/Bdoc23b_2395265_2114772/tp4baf7214_380a_4b6f_8b72_0b87613f541e/mat_ops.o')
Building with 'gcc'.
MEX completed successfully.
### Finish Compiling sfun_mat_add
### Exit

### Start Compiling sfun_mat_mult
    mex('-I/tmp/Bdoc23b_2395265_2114772/tp72f1d74f/simulinkcoder-ex89794148/Lct_src', '-I/tmp/Bdoc23b_2395265_2114772/tp72f1d74f/simulinkcoder-ex89794148', '-c', '-outdir', '/tmp/Bdoc23b_2395265_2114772/tp329bf258_cb54_4d97_a4c8_216723e7f8db', '/tmp/Bdoc23b_2395265_2114772/tp72f1d74f/simulinkcoder-ex89794148/Lct_src/mat_ops.c')
Building with 'gcc'.
MEX completed successfully.
    mex('sfun_mat_mult.c', '-I/tmp/Bdoc23b_2395265_2114772/tp72f1d74f/simulinkcoder-ex89794148/Lct_src', '-I/tmp/Bdoc23b_2395265_2114772/tp72f1d74f/simulinkcoder-ex89794148', '/tmp/Bdoc23b_2395265_2114772/tp329bf258_cb54_4d97_a4c8_216723e7f8db/mat_ops.o')
Building with 'gcc'.
MEX completed successfully.
### Finish Compiling sfun_mat_mult
### Exit

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

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

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

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

open_system('LctInheritedDimensions')
open_system('LctInheritedDimensions/TestMatOps')
sim('LctInheritedDimensions')

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

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

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

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

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

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

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

レガシ関数の仕様の提供

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

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      = {'Lct_src'};
def.SrcPaths      = {'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/tmp/Bdoc23b_2395265_2114283/tp6da647d7/simulinkcoder-ex14927435/Lct_src', '-I/tmp/Bdoc23b_2395265_2114283/tp6da647d7/simulinkcoder-ex14927435', '-c', '-outdir', '/tmp/Bdoc23b_2395265_2114283/tpdcc62e85_e70b_4db1_8051_e9516ac32bbd', '/tmp/Bdoc23b_2395265_2114283/tp6da647d7/simulinkcoder-ex14927435/Lct_src/ndarray_ops.c')
Building with 'gcc'.
MEX completed successfully.
    mex('rtwdemo_sfun_ndarray_add.c', '-I/tmp/Bdoc23b_2395265_2114283/tp6da647d7/simulinkcoder-ex14927435/Lct_src', '-I/tmp/Bdoc23b_2395265_2114283/tp6da647d7/simulinkcoder-ex14927435', '/tmp/Bdoc23b_2395265_2114283/tpdcc62e85_e70b_4db1_8051_e9516ac32bbd/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 を含むモデルのコードを生成しようとすると、コード生成に失敗します。

legacy_code('sfcn_tlc_generate', def);

S-Function の生成された TLC ブロック ファイルは、rtwdemo_sfun_ndarray_add.tlc です。

コード生成用の 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);

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

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

open_system('LctMultiDimensionalSig')
open_system('LctMultiDimensionalSig/ndarray_add')
sim('LctMultiDimensionalSig')

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

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

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

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

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

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

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

レガシ関数の仕様の提供

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

  • 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 にあります。

% sfun_fault
def = legacy_code('initialize');
def.SFunctionName = '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                     = {'Lct_src'};
def.SrcPaths                     = {'Lct_src'};
def.Options.useTlcWithAccel      = false;

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

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

legacy_code('sfcn_cmex_generate', def);

S-Function のソース コードは、生成された sfun_fault.c ファイルにあります。

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

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

legacy_code('compile', def);
### Start Compiling sfun_fault
    mex('-I/tmp/Bdoc23b_2395265_2114283/tp6da647d7/simulinkcoder-ex46254423/Lct_src', '-I/tmp/Bdoc23b_2395265_2114283/tp6da647d7/simulinkcoder-ex46254423', '-c', '-outdir', '/tmp/Bdoc23b_2395265_2114283/tpf287aea0_b4a9_4db8_b11e_b4941f1aff7b', '/tmp/Bdoc23b_2395265_2114283/tp6da647d7/simulinkcoder-ex46254423/Lct_src/fault.c')
Building with 'gcc'.
MEX completed successfully.
    mex('sfun_fault.c', '-I/tmp/Bdoc23b_2395265_2114283/tp6da647d7/simulinkcoder-ex46254423/Lct_src', '-I/tmp/Bdoc23b_2395265_2114283/tp6da647d7/simulinkcoder-ex46254423', '/tmp/Bdoc23b_2395265_2114283/tpf287aea0_b4a9_4db8_b11e_b4941f1aff7b/fault.o')
Building with 'gcc'.
MEX completed successfully.
### Finish Compiling sfun_fault
### Exit

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

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

legacy_code('sfcn_tlc_generate', def);

S-Function の生成された TLC ブロック ファイルは、sfun_fault.tlc です。

コード生成用の 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);

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

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

open_system('LctStartTermActions')
open_system('LctStartTermActions/TestFault')
sim('LctStartTermActions')

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

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

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

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

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

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

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

レガシ関数の仕様の提供

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

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 Lct_data.mat')

% sfun_dlut3D
def = legacy_code('initialize');
def.SFunctionName = '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      = {'Lct_src'};
def.SrcPaths      = {'Lct_src'};
defs = [defs; def];

% sfun_dlut4D
def = legacy_code('initialize');
def.SFunctionName = '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      = {'Lct_src'};
def.SrcPaths      = {'Lct_src'};
defs = [defs; def];

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

入力引数 defs によって示される説明に従って C-MEX S-Function を生成するために、関数 legacy_code() を再び呼び出します。最初の入力は sfcn_cmex_generate に設定します。この S-Function により、シミュレーション中にレガシ関数が呼び出されます。S-Function のソース コードは、ファイル sfun_dlut3D.c およびファイル rtwdemo_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 sfun_dlut3D
    mex('-I/tmp/Bdoc23b_2395265_2114283/tp6da647d7/simulinkcoder-ex19426386/Lct_src', '-I/tmp/Bdoc23b_2395265_2114283/tp6da647d7/simulinkcoder-ex19426386', '-c', '-outdir', '/tmp/Bdoc23b_2395265_2114283/tp29e5c3aa_df52_4486_bba3_b7be5ee5d26f', '/tmp/Bdoc23b_2395265_2114283/tp6da647d7/simulinkcoder-ex19426386/Lct_src/directLookupTableND.c')
Building with 'gcc'.
MEX completed successfully.
    mex('sfun_dlut3D.c', '-I/tmp/Bdoc23b_2395265_2114283/tp6da647d7/simulinkcoder-ex19426386/Lct_src', '-I/tmp/Bdoc23b_2395265_2114283/tp6da647d7/simulinkcoder-ex19426386', '/tmp/Bdoc23b_2395265_2114283/tp29e5c3aa_df52_4486_bba3_b7be5ee5d26f/directLookupTableND.o')
Building with 'gcc'.
MEX completed successfully.
### Finish Compiling sfun_dlut3D
### Exit

### Start Compiling sfun_dlut4D
    mex('-I/tmp/Bdoc23b_2395265_2114283/tp6da647d7/simulinkcoder-ex19426386/Lct_src', '-I/tmp/Bdoc23b_2395265_2114283/tp6da647d7/simulinkcoder-ex19426386', '-c', '-outdir', '/tmp/Bdoc23b_2395265_2114283/tpb133ba5a_fd83_44d7_b277_8103b6ebe78f', '/tmp/Bdoc23b_2395265_2114283/tp6da647d7/simulinkcoder-ex19426386/Lct_src/directLookupTableND.c')
Building with 'gcc'.
MEX completed successfully.
    mex('sfun_dlut4D.c', '-I/tmp/Bdoc23b_2395265_2114283/tp6da647d7/simulinkcoder-ex19426386/Lct_src', '-I/tmp/Bdoc23b_2395265_2114283/tp6da647d7/simulinkcoder-ex19426386', '/tmp/Bdoc23b_2395265_2114283/tpb133ba5a_fd83_44d7_b277_8103b6ebe78f/directLookupTableND.o')
Building with 'gcc'.
MEX completed successfully.
### Finish Compiling sfun_dlut4D
### Exit

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

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

legacy_code('sfcn_tlc_generate', defs);

S-Function の生成された TLC ブロック ファイルは、sfun_dlut3D.tlc および sfun_dlut4D.tlc です。

コード生成用の 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);

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

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

open_system('LctTableLookups')
open_system('LctTableLookups/TestLut1')
sim('LctTableLookups')

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

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

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

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

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

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

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

レガシ関数の仕様の提供

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

FLT gainScalar(const FLT in, const FLT gain)

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

defs = [];

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

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

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

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

入力引数 defs によって提供される記述に従って C-MEX S-Function を生成するために、最初の入力を sfcn_cmex_generate に設定して関数 legacy_code() を再び呼び出します。この S-Function により、シミュレーション中にレガシ関数が呼び出されます。S-Function のソース コードは、ファイル sfun_st_inherited.csfun_st_fixed.c、および 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 sfun_st_inherited
    mex('-I/tmp/Bdoc23b_2395265_2114772/tp72f1d74f/simulinkcoder-ex74504488/Lct_src', '-I/tmp/Bdoc23b_2395265_2114772/tp72f1d74f/simulinkcoder-ex74504488', '-c', '-outdir', '/tmp/Bdoc23b_2395265_2114772/tp884dcbf6_b1d3_4fa6_a76d_7cf5426a21d5', '/tmp/Bdoc23b_2395265_2114772/tp72f1d74f/simulinkcoder-ex74504488/Lct_src/gainScalar.c')
Building with 'gcc'.
MEX completed successfully.
    mex('sfun_st_inherited.c', '-I/tmp/Bdoc23b_2395265_2114772/tp72f1d74f/simulinkcoder-ex74504488/Lct_src', '-I/tmp/Bdoc23b_2395265_2114772/tp72f1d74f/simulinkcoder-ex74504488', '/tmp/Bdoc23b_2395265_2114772/tp884dcbf6_b1d3_4fa6_a76d_7cf5426a21d5/gainScalar.o')
Building with 'gcc'.
MEX completed successfully.
### Finish Compiling sfun_st_inherited
### Exit

### Start Compiling sfun_st_fixed
    mex('-I/tmp/Bdoc23b_2395265_2114772/tp72f1d74f/simulinkcoder-ex74504488/Lct_src', '-I/tmp/Bdoc23b_2395265_2114772/tp72f1d74f/simulinkcoder-ex74504488', '-c', '-outdir', '/tmp/Bdoc23b_2395265_2114772/tp71072e15_5322_4938_bb6c_9b96e373f24a', '/tmp/Bdoc23b_2395265_2114772/tp72f1d74f/simulinkcoder-ex74504488/Lct_src/gainScalar.c')
Building with 'gcc'.
MEX completed successfully.
    mex('sfun_st_fixed.c', '-I/tmp/Bdoc23b_2395265_2114772/tp72f1d74f/simulinkcoder-ex74504488/Lct_src', '-I/tmp/Bdoc23b_2395265_2114772/tp72f1d74f/simulinkcoder-ex74504488', '/tmp/Bdoc23b_2395265_2114772/tp71072e15_5322_4938_bb6c_9b96e373f24a/gainScalar.o')
Building with 'gcc'.
MEX completed successfully.
### Finish Compiling sfun_st_fixed
### Exit

### Start Compiling sfun_st_parameterized
    mex('-I/tmp/Bdoc23b_2395265_2114772/tp72f1d74f/simulinkcoder-ex74504488/Lct_src', '-I/tmp/Bdoc23b_2395265_2114772/tp72f1d74f/simulinkcoder-ex74504488', '-c', '-outdir', '/tmp/Bdoc23b_2395265_2114772/tpf367c066_5599_4a3f_9f62_2c09a4cf94d1', '/tmp/Bdoc23b_2395265_2114772/tp72f1d74f/simulinkcoder-ex74504488/Lct_src/gainScalar.c')
Building with 'gcc'.
MEX completed successfully.
    mex('sfun_st_parameterized.c', '-I/tmp/Bdoc23b_2395265_2114772/tp72f1d74f/simulinkcoder-ex74504488/Lct_src', '-I/tmp/Bdoc23b_2395265_2114772/tp72f1d74f/simulinkcoder-ex74504488', '/tmp/Bdoc23b_2395265_2114772/tpf367c066_5599_4a3f_9f62_2c09a4cf94d1/gainScalar.o')
Building with 'gcc'.
MEX completed successfully.
### Finish Compiling sfun_st_parameterized
### Exit

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

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

legacy_code('sfcn_tlc_generate', defs);

S-Function の生成された TLC ブロック ファイルは、sfun_st_inherited.tlcsfun_st_fixed.tlc、および sfun_st_parameterized.tlc です。

コード生成用の 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);

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

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

open_system('LctSampleTime')
open_system('LctSampleTime/sample_time')
sim('LctSampleTime')

参考

関連するトピック