主要内容

레거시함수를사용하여지정되거나상속된샘플시간

이예제에서는레거시코드툴을사용하여레거시C함수를지정,상속,파라미터화된샘플시간과통합하는방법을보여줍니다。

레거시코드툴을사용하면다음이가능합니다。

  • 레거시함수사양제공

  • 시뮬레이션중에레거시코드를호출하는데사용되는C-MEX S-Function생성

  • 생성된S-Function을시뮬레이션용으로컴파일및빌드

레거시함수사양제공하기

레거시코드툴과함께제공되는함수는특정데이터구조체또는구조체로구성된배열을인수로받습니다。데이터구조체는첫번째입력값으로“初始化”를사용하여함수legacy_code()를호출함으로써초기화됩니다。구조체를초기화한후에는통합하려는레거시코드에해당하는값에속성을할당해야합니다。이예제에서호출하는레거시함수의프로토타입은다음과같습니다。

FLT增益标量(const FLT in, const FLT增益)

여기서FLT는浮动형에대한typedef입니다。레거시소스코드는파일your_types.hgain.hgainScalar.c에서확할수있습니다。

Defs = [];% sldemo_sfun_st_inheritedDef = legacy_code(“初始化”);def.SFunctionName =“sldemo_sfun_st_inherited”;def.OutputFcnSpec ='single y1 = gainScalar(single u1, single p1)';def.HeaderFiles = {“gain.h”};def.SourceFiles = {“gainScalar.c”};def.IncPaths = {“sldemo_lct_src”};def.SrcPaths = {“sldemo_lct_src”};Defs = [Defs;def);% sldemo_sfun_st_fixedDef = legacy_code(“初始化”);def.SFunctionName =“sldemo_sfun_st_fixed”;def.OutputFcnSpec ='single y1 = gainScalar(single u1, single p1)';def.HeaderFiles = {“gain.h”};def.SourceFiles = {“gainScalar.c”};def.IncPaths = {“sldemo_lct_src”};def.SrcPaths = {“sldemo_lct_src”};def.SampleTime = [2 1];Defs = [Defs;def);% sldemo_sfun_st_parameterizedDef = legacy_code(“初始化”);def.SFunctionName =“sldemo_sfun_st_parameterized”;def.OutputFcnSpec ='single y1 = gainScalar(single u1, single p1)';def.HeaderFiles = {“gain.h”};def.SourceFiles = {“gainScalar.c”};def.IncPaths = {“sldemo_lct_src”};def.SrcPaths = {“sldemo_lct_src”};def.SampleTime =“参数化”;Defs = [Defs;def);

시뮬레이션중에사용할S-Function생성및컴파일하기

함수legacy_code()는입력인수“def”로제공되는설명에따라C-MEX s函数을자동으로생성및컴파일하기위해첫번째입력값을”generate_for_sim으로설정하여다시호출됩니다。이S-Function은시뮬레이션에서레거시함수를호출하는데사용됩니다。S-Function의소스코드는sldemo_sfun_st_inherited.csldemo_sfun_st_fixed.csldemo_sfun_st_parameterized.c파일에서확할수있습니다。

legacy_code (“generate_for_sim”def);
开始编译sldemo_sfun_st_inherited mex('-I/tmp/Bdoc22b_2023970_1567648/tp98b3da63/simulink_feature万博1manbetxs-ex32622275/sldemo_lct_src', '-I/tmp/Bdoc22b_2023970_1567648/tp98b3da63/simulink_features-ex32622275/sldemo_lct_src', '-c', '-outdir', '/tmp/Bdoc22b_2023970_1567648/tp94a0d0c7_2af8_4584_a65d_aec98b27d5a3', '/tmp/Bdoc22b_2023970_1567648/tp98b3da63/simulink_features-ex32622275/sldemo_lct_src/gainScalar.c')使用'gcc'构建。MEX完成成功。-I/tmp/Bdoc22b_2023970_1567648/tp98b3da63/simulink_features-ex32622275/sldemo万博1manbetx_lct_src', '-I/tmp/Bdoc22b_2023970_1567648/tp98b3da63/simulink_features-ex32622275', '/tmp/Bdoc22b_2023970_1567648/tp94a0d0c7_2af8_4584_a65d_aec98b27d5a3/ gainscala .o')使用'gcc'构建。MEX完成成功。开始编译sldemo_sfun_st_fixed mex('-I/tmp/Bdoc22b_2023970_1567648/tp98b3da63/simulink_features-ex32622275/sldemo_lct_src', '-I/tmp/Bdoc22b_2023970_1万博1manbetx567648/tp98b3da63/simulink_features-ex32622275', '-c', '-outdir', '/tmp/Bdoc22b_2023970_1567648/tp2b8d4d19_ebd9_4bb1_bd60_fbd637359887', '/tmp/Bdoc22b_2023970_1567648/tp98b3da63/simulink_features-ex32622275/sldemo_lct_src/gainScalar.c')使用'gcc'构建。MEX完成成功。-I/tmp/Bdoc22b_2023970_1567648/tp98b3da63/simulink_features-ex32622275/sl万博1manbetxdemo_lct_src', '-I/tmp/Bdoc22b_2023970_1567648/tp98b3da63/simulink_features-ex32622275', '/tmp/Bdoc22b_2023970_1567648/tp2b8d4d19_ebd9_4bb1_bd60_fbd637359887/gainScalar.o')使用'gcc'构建。MEX完成成功。开始编译sldemo_sfun_st_parameterized mex('-I/tmp/Bdoc22b_2023970_1567648/tp98b3da63/simulink_features-ex32622275/sldemo_lct_src', '-I/tmp/Bdoc22b_20239万博1manbetx70_1567648/tp98b3da63/simulink_features-ex32622275', '-c', '-outdir', '/tmp/Bdoc22b_2023970_1567648/tp519ff658_ec98_4aef_ac36_ec376fc7b6aa', '/tmp/Bdoc22b_2023970_1567648/tp98b3da63/simulink_features-ex32622275/sldemo_lct_src/gainScalar.c')使用'gcc'构建。MEX完成成功。 mex('sldemo_sfun_st_parameterized.c', '-I/tmp/Bdoc22b_2023970_1567648/tp98b3da63/simulink_features-ex32622275/sldemo_lct_src', '-I/tmp/Bdoc22b_2023970_1567648/tp98b3da63/simulink_features-ex32622275', '/tmp/Bdoc22b_2023970_1567648/tp519ff658_ec98_4aef_ac36_ec376fc7b6aa/gainScalar.o') Building with 'gcc'. MEX completed successfully. ### Finish Compiling sldemo_sfun_st_parameterized ### Exit

코드생성을위해rtwmakecfg。M파일생성하기

TLC블록파일이생성되면,rtwmakecfg。m파일을생성하여仿真软万博1manbetx件®编码器™를통한코드생성을지원하기위해첫번째입력값을”rtwmakecfg_generate로설정하여함수legacy_code()를다시호출할수있습니다。s函数에필요한소스및헤더파일이s函数과동일한디렉터리에있지않아코드생성중에생성된makefile에이러한종속성을추가하려면rtwmakecfg。M파일을생성하십시오。

참고:이단계는가속화된모드에서모델을시뮬레이션하려는경우에만수행하십시오。

legacy_code (“rtwmakecfg_generate”def);

생성된S-Function의호출을위해마스크처리된S-Function블록생성하기

C-MEX s函数소스가컴파일되면,해당s函数을호출하도록구성된마스크처리된s函数블록을생성하기위해첫번째입력값을”slblock_generate로설정하여함수legacy_code()를다시호출할수있습니다。블록은새모델에배치되며기존모델로복사할수있습니다。

% legacy_code('slblock_generate', defs);

레거시코드통합하기

모델sldemo_lct_sampletime는레거시코드와의통합을보여줍니다。서브시스템sample_time은이전출력값을저장하는데단위지연을사용하며,레거시C함수에대한호출의하네스역할을합니다。

open_system (“sldemo_lct_sampletime”) open_system (“sldemo_lct_sampletime / sample_time”) sim卡(“sldemo_lct_sampletime”);

참고 항목