主要内容

使用Caller块具有条件执行

此示例显示如何使用带有条件执行的C来电块。示例模型包含两个C调用者块,其输出将输入分支到交换机块中。每个C调用者块调用其中一个自定义C代码函数sort_ascend ()sort_descend ().输入分支中只有一个值被传递到Switch块的输出端。具有相同设置的C Function块也可以用来代替C Caller块来调用这些自定义代码函数。

此示例说明以下概念:

  • 在条件执行上下文中从Simulink®块调用自定义C代码。金宝app

  • 在自定义代码中按函数配置确定性函数。

检查模型

此模型通过连接到交换机块的输入分支的C来电块来调用自定义代码。

open_system ('slexcallerconditional');为生成和检查过程创建一个临时文件夹。currentDir = pwd;[~, cgDir] = rtwdemodir ();

生成代码

此模型中的自定义代码函数尚未被标识为确定性函数。当从模型生成代码时,即使交换机块只需要一个功能的输出,也可以在模拟和生成的代码中执行C函数。

slbuild (bdroot);用= fullfile (cgDir,“slexCCallerConditional_grt_rtw”'slexclerconditional.c');RTWDEMODBTYPE(CFILE,“/ *模型步骤”'/ * matfile logging',1,0);
###开始构建过程:SlexclerConeRational ###成功完成构建过程:SlexclerConeRithal构建摘要顶级模型目标构建:模型动作重建原因=======================================================================================================生成的SlexCallerConitional代码,编译代码生成信息文件不存在。1个型号中有1个(0型号已达到迄今为止)构建持续时间:0H 0M 38.003S / *型号步函数* / void SlexclerConditionAl_step(void){Real_t RTB_CCALLERASCENC [6];real_t rtb_ccallerdescend [6];int32_T我;/ * ccaller:' / c来电者(Ascend)'包含:* inport:' / in2'* / for(i = 0; i <6; i ++){RTB_CCALLERARARCEND [I] = SLEXCCALLERCONCORDINGALAL_U.IN2[一世];} sort_ascend (&rtb_CCallerascend [0], 6);/ * ccaller的结尾:' / c来电(升序)'* / / * ccaller:' / c来电(descend)'包含:* inport:' / in2'* / for(i = 0; i <6; i ++){RTB_CCALLERDESCEND [I] = SLEXCCALLERCORDINGALAL_U.IN2 [i];sort_descend(&RTB_CCALLERDESCEND [0],6);/ * Ccaller的结尾:' / c来电(下降)'* / for(i = 0; i <6; i ++){/ * switch:' / switch'包含:* INPORT:'/In1' */ if (slexCCallerConditional_U.In1 > 0.0) { /* Outport: '/Out3' */ slexCCallerConditional_Y.Out3[i] = rtb_CCallerascend[i]; } else { /* Outport: '/Out3' */ slexCCallerConditional_Y.Out3[i] = rtb_CCallerdescend[i]; } /* End of Switch: '/Switch' */ }

指定自定义代码确定性函数

打开“配置参数”对话框。

模拟目标窗格,集确定性功能通过函数.点击通过功能指定并添加功能sort_ascend.sort_descend.到列表中。此操作告诉模型指定的自定义代码函数具有确定性行为,也就是说,相同的函数输入值总是给出相同的输出。如果一个函数被设置为确定性的,那么如果它位于Switch块的假值对应的输入分支中,就不需要调用它。

configset.highlightParameter(BDROOT,“DefaultCustomCodeDeterministicFunctions”);set_param (bdroot“DefaultCustomCodeDeterministicFunctions”'yfunction');set_param (bdroot“CustomCodeDeterministicFunctions”“sort_ascend, sort_descend”);

重新生成代码

既然您已经指定了确定性函数,那么生成的代码将更加高效,因为只执行Switch块的真正分支中的C Caller块。同样的效率适用于在Simulink中模拟模型。金宝app

slbuild (bdroot);用= fullfile (cgDir,“slexCCallerConditional_grt_rtw”'slexclerconditional.c');RTWDEMODBTYPE(CFILE,“/ *模型步骤”'/ * matfile logging',1,0);close_system(bdroot,0);
###开始构建过程:SlexclerConeRational ###成功完成构建过程:SlexclerConeRithal构建摘要顶级模型目标构建:模型动作重建原因====================================================================================== slexCCallerConditional Code generated and compiled Generated code was out of date. 1 of 1 models built (0 models already up to date) Build duration: 0h 0m 18.387s /* Model step function */ void slexCCallerConditional_step(void) { real_T rtb_CCallerascend[6]; int32_T i; /* Switch: '/Switch' incorporates: * Inport: '/In1' */ if (slexCCallerConditional_U.In1 > 0.0) { /* CCaller: '/C Caller (ascend)' incorporates: * Inport: '/In2' */ for (i = 0; i < 6; i++) { rtb_CCallerascend[i] = slexCCallerConditional_U.In2[i]; } sort_ascend(&rtb_CCallerascend[0], 6); /* End of CCaller: '/C Caller (ascend)' */ } else { /* CCaller: '/C Caller (descend)' incorporates: * Inport: '/In2' */ for (i = 0; i < 6; i++) { rtb_CCallerascend[i] = slexCCallerConditional_U.In2[i]; } sort_descend(&rtb_CCallerascend[0], 6); /* End of CCaller: '/C Caller (descend)' */ } /* End of Switch: '/Switch' */ /* Outport: '/Out3' */ for (i = 0; i < 6; i++) { slexCCallerConditional_Y.Out3[i] = rtb_CCallerascend[i]; } /* End of Outport: '/Out3' */

也可以看看

|||