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

1 view (last 30 days)
入出力を持たず、例えば
void testFcn(void)
のような形の関数である Legacy Code で、外部との値の受け渡しを全てグローバル変数で行うよう記述している
ソースコードがあります。
このソースに対して Legacy Code Tool を活用して S-Function を生成したいと考えています。

Accepted Answer

MathWorks Support Team
MathWorks Support Team on 25 Oct 2013
そのまま 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);
本ページ下部から、以上の参考例を示したコードがダウンロードできます。

More Answers (0)

MathWorks Support

Categories

Find more on コード生成 in Help Center and File Exchange

Products

Community Treasure Hunt

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

Start Hunting!