入出力引数を持たない形の関数の Legacy Code に対して、Legacy Code Tool で S-Function を生成するにはどのようにしますか?

2 ビュー (過去 30 日間)
MathWorks Support Team
MathWorks Support Team 2013 年 10 月 25 日
回答済み: MathWorks Support Team 2013 年 10 月 25 日
入出力を持たず、例えば
void testFcn(void)
のような形の関数である Legacy Code で、外部との値の受け渡しを全てグローバル変数で行うよう記述している
ソースコードがあります。
このソースに対して Legacy Code Tool を活用して S-Function を生成したいと考えています。

採用された回答

MathWorks Support Team
MathWorks Support Team 2013 年 10 月 25 日
そのまま Legacy Code Tool を使用ことはできませんので、ラッパー関数を作成する必要があります。
S-Function の入出力に相当する変数を用意、先の Legacy 関数を呼び出し、 Legacy 関数ソースでのグローバル変数との値のやり取りをするラッパー関数のソースを記述・作成し、このラッパー関数に対して Legacy Code Tool を適用、 S-Function を生成する方法となります。
例えば、次のように、入力引数を持たず、出力を持たない void 型関数である Legacy コードがある場合を考えます。
double SigA;
double SigB;
double OutA;
double OutB;
void lc_global(void)
{
OutA = 10 * SigA;
OutB = 20 * SigB;
}
void lc_global_initialize(void)
{
OutA = 0;
OutB = 0;
SigA = 0;
SigB = 0;
}
こちらに対しては次のように、上記関数との値のやり取りと呼び出し手順を含めたラッパー関数を記述した C ソースを作成します。
void lc_global_wrap(double SigAw, double SigBw, double *OutAw, double *OutBw)
{
SigA=SigAw;
SigB=SigBw;
lc_global();
*OutAw=OutA;
*OutBw=OutB;
}
このように作成したラッパー関数のソースファイルに対し、下記のように MATLAB コマンドウィンドウから Legacy Code Tool を活用し、 S-Function 生成を行います。
[MATLAB コマンドウィンドウ上から]
def = legacy_code('initialize');
def.SFunctionName = 'sfcn_C';
def.OutputFcnSpec = ...
'void lc_global_wrap(double u1, double u2, double y1[1], double y2[1] )';
def.InitializeConditionsFcnSpec = 'void lc_global_initialize( void )';
def.HeaderFiles = {'sfcnwrapper.h'};
def.SourceFiles = {'lc_global.c','lc_global_wrap.c'};
def.Options.useTlcWithAccel = false;
%%C-MEX S-Functionの生成
legacy_code('sfcn_cmex_generate', def);
%%mex実行で、コンパイルオプション -DLC1を指定
legacy_code('compile',def);
%%TLCファイルの生成
legacy_code('sfcn_tlc_generate', def);
%%S-Functionブロックの生成
legacy_code('slblock_generate', def);
本ページ下部から、以上の参考例を示したコードがダウンロードできます。

その他の回答 (0 件)

カテゴリ

Help Center および File Exchangeコード生成 についてさらに検索

製品

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!