要使用从模型生成的代码,可以调用生成的入口点函数,例如一步
和初始化
.调用这些函数的环境必须提供输入信号数据,并根据应用程序提供调度信息。生成的算法然后计算调用环境可以使用的输出数据。环境和算法可以通过全局变量或形式参数交换这些数据。
输入输出数据集和交换机制构成了入口点函数的接口。当你理解了默认接口以及如何控制它们时,你可以:
编写代码来调用生成的代码。
生成可重用(重圈)代码,您可以在单个应用程序中多次调用。
将生成的代码与应用程序中的其他外部代码集成。
在模型中,根级inport.和外港块表示块算法的主要输入和输出。默认情况下,代码生成器将这些块聚合到存储输入和输出数据的标准结构中。
有关生成的代码如何存储不参与模型接口的内部数据的信息,请参见生成的代码如何存储内部信号,状态和参数数据.
此示例显示生成的代码如何与环境交换数据。
探索示例模型
打开示例模型rtwdemo_roll
.
Open_System('rtwdemo_roll')
在根级别,模型有许多import块和一个Outport块。
在模型中,设置>代码生成>系统目标文件来grt.tlc.
.
set_param('rtwdemo_roll','systemtargetfile',“grt.tlc”)
检查设置>代码生成>接口>代码接口打包.设置那种一次性的功能
意味着生成的代码不可重用(不可重入)。
对于本例,为了生成更简单的代码,清除配置参数>代码生成>接口>高级参数> MAT文件日志记录.
set_param('rtwdemo_roll','matfilelogging','离开')
生成那种一次性代码
从模型生成代码。
RTWBuild('rtwdemo_roll')
###启动模型的构建过程:rtwdemo_roll
检查文件RTWDEMO_ROLL.H.
.该文件定义了表示输入数据的结构类型和表示输出数据的类型。
文件= fullfile (“rtwdemo_roll_grt_rtw”,“rtwdemo_roll.h”);rtwdemodbtype(文件,...'/*外部输入(默认存储的根输入信号)*/',...“}ExtY_rtwdemo_roll_T;”, 1, 1)
/*外部输入(root import signals with default storage) */ typedef struct {real32_T Phi;/* '/Phi' */ real32_T Psi;/* ' /Psi' */ real32_T Rate_FB;/* ' /Rate_FB' */ real32_T TAS;/* ' /TAS' */ boolean_T AP_Eng;/* ' /AP_Eng' */ boolean_T HDG_Mode;/* ' /HDG_Mode' */ real32_T HDG_Ref;/* ' /HDG_Ref' */ real32_T Turn_Knob;/* ' /Turn_Knob' */} ExtU_rtwdemo_roll_T;/*外部输出(由默认存储的信号提供的根输出)*/ typedef struct {real32_T Ail_Cmd; /* ' /Ail_Cmd' */ } ExtY_rtwdemo_roll_T;
每个字段对应于模型根级别的import或Outport块。每个字段的名称来源于块的名称。
该文件还定义了结构类型实时模型数据结构,其单个字段存储一个运行时指示,指示生成的代码在执行期间是否遇到错误。
rtwdemodbtype(文件,'/*实时模型数据结构*/',...'/*块状态(默认存储)*/', 1,0)
/*实时模型数据结构*/ struct tag_RTM_rtwdemo_roll_T {const char_T *errorStatus;};
当您修改模型配置参数以适合您的应用程序时,此结构还可以包含与整个模型相关的其他数据,例如调度信息。
对于表示实时模型数据结构的结构类型,该文件RTWDEMO_ROLL_TYPES.H.
创建别名(typedef.
)生成的代码稍后用于为结构分配内存。
文件= fullfile (“rtwdemo_roll_grt_rtw”,“rtwdemo_roll_types.h”);rtwdemodbtype(文件,'/* rtModel的前向声明*/',...“RT_MODEL_rtwdemo_roll_T;”, 1, 1)
/ * RTMODEL的前向声明* / typedef struct tag_rtm_rtwdemo_roll_t rt_model_rtwdemo_roll_t;
使用这些结构类型,文件RTWDEMO_ROLL.C.
定义(分配内存)全局结构变量,用于存储生成算法的输入和输出数据。该文件还定义了表示实时模型数据结构的变量和指向该结构的指针。
文件= fullfile (“rtwdemo_roll_grt_rtw”,'rtwdemo_roll.c');rtwdemodbtype(文件,...'/*外部输入(默认存储的根输入信号)*/',...“= &rtwdemo_roll_M_;”, 1, 1)
/*外部输入(root import signals with default storage) */ ExtU_rtwdemo_roll_T rtwdemo_roll_U;/*外部输出(由默认存储的信号提供的根输出)*/ ExtY_rtwdemo_roll_T rtwdemo_roll_Y;/*实时模型*/ RT_MODEL_rtwdemo_roll_T rtwdemo_roll_M_;RT_MODEL_rtwdemo_roll_T *const rtwdemo_roll_M = &rtwdemo_roll_M_;
该文件RTWDEMO_ROLL.H.
声明这些结构变量。您的外部代码可以包括(# include
)此文件,其通用名称为模型.h
在哪里模型
是模型的名称,以访问参与模型接口的数据。
在RTWDEMO_ROLL.C.
, 该模型一步
代表主要模型算法的函数,使用a空白
空白
接口(不带参数)。
rtwdemodbtype(文件,...'/* Model step函数*/',“空白rtwdemo_roll_step(空白), 1, 1)
/ *模型步骤功能* / void RTWDEMO_ROLL_STEP(void)
在函数定义中,算法通过直接访问全局结构变量来读取输入数据和写入输出数据。例如,在算法的末尾,函数的代码Engswitch.
块读取值的值AP_ENG.
字段(表示输入),并基于该值有条件地将常量值写入Ail_Cmd
字段(表示输出)。
rtwdemodbtype(文件,“如果(rtwdemo_roll_U.AP_Eng) {','}', 1, 1)
if(rtwdemo_roll_u.ap_eng){/ *原子子系统的输出:'/ basicrollmode'* // * serventate:' / cmdlimit'* / if(rtwdemo_roll_y.ail_cmd> 15.0f){/ * sum:' / sum2'包含:*出口:' / / ail_cmd'* / rtwdemo_roll_y.ail_cmd = 15.0f;} else {if(rtwdemo_roll_y.ail_cmd <-15.0f){/ * sum:' / sum2'包含:*出口:' / ail_cmd'* / rtwdemo_roll_y.ail_cmd = -15.0f;}
由于空白
空白
接口和直接数据访问,函数不重新入口。如果在应用程序中多次调用该函数,则每个调用将输入和输出数据读取并将输入和输出数据写入相同的全局结构变量,从而导致呼叫之间的数据损坏和无意的交互。
模型初始化函数,rtwdemo_roll_initialize
,初始化输入和输出数据为零。该函数还初始化错误状态。函数直接访问全局变量,这意味着函数是不可重入的。
rtwdemodbtype(文件,/*模型初始化函数*/,...'rtmseterrorstatus(rtwdemo_roll_m,(null));', 1, 1)
/ *模型初始化函数* / void RTWDEMO_ROLL_INITIALIZE(void){/ *注册码* // *初始化错误状态* / rtmseterrorstatus(rtwdemo_roll_m,(null));
rtwdemodbtype(文件,/*外部输入*/',.../* SystemInitialize for Atomic子系统:, 1,0)
/*外部输入*/ (void)memset(&rtwdemo_roll_U, 0, sizeof(ExtU_rtwdemo_roll_T);/*外部输出*/ rtwdemo_roll_Y。Ail_Cmd f = 0.0;
生成可重复使用的代码
您可以将生成的代码配置为重圈,这意味着您可以在应用程序中多次调用入口点函数。使用此配置,而不是直接访问全局变量,通过形式参数(指针参数)来输入,输出函数交换输入,输出和其他模型数据。使用这些指针参数,每个调用可以读取输入并将输出写入一组单独的全局变量,防止呼叫之间的无意的交互。
在模型中,设置>代码生成>接口>代码接口打包来可重复使用的功能
.
set_param('rtwdemo_roll',“CodeInterfacePackaging”,“可重复使用的功能”)
从模型生成代码。
RTWBuild('rtwdemo_roll')
###启动模型的构建过程:rtwdemo_roll
现在,在RTWDEMO_ROLL.H.
,实时模型数据结构包含指向错误指示的指针、输入数据、输出数据和附加数据的形式DWork
子结构(例如,存储,例如,块状态,例如离散时间集成器块的状态)。
文件= fullfile (“rtwdemo_roll_grt_rtw”,“rtwdemo_roll.h”);rtwdemodbtype(文件,'/*实时模型数据结构*/',...'/*依赖源文件的外部数据声明*/', 1,0)
/*实时模型数据结构*/ struct tag_RTM_rtwdemo_roll_T {const char_T *errorStatus;extu_rtwdemo_roll_t *输入;exty_rtwdemo_roll_t *输出;dw_rtwdemo_roll_t * dwork;};
要在应用程序中多次调用生成的代码,您的代码必须在每次调用时为实时模型数据结构分配内存。该文件RTWDEMO_ROLL.C.
定义专用函数,可为新的实时模型数据结构分配内存,并返回到结构的指针。该功能还为模型数据结构点中的字段分配了存储器的存储器,例如输入和输出结构。
文件= fullfile (“rtwdemo_roll_grt_rtw”,'rtwdemo_roll.c');rtwdemodbtype(文件,'/ *模型数据分配功能* /',...'RT_MODEL_RTWDEMO_ROLL_T * RTWDEMO_ROLL(VOID)', 1, 1)
/ *模型数据分配功能* / RT_MODEL_RTWDEMO_ROLL_T * RTWDEMO_ROLL(VOID)
在RTWDEMO_ROLL.C.
, 该模型一步
函数接受一个表示实时模型数据结构的参数。
文件= fullfile (“rtwdemo_roll_grt_rtw”,'rtwdemo_roll.c');rtwdemodbtype(文件,...'/* Model step函数*/',“空白rtwdemo_roll_step”, 1, 1)
/*模型步长函数*/ void rtwdemo_roll_step(RT_MODEL_rtwdemo_roll_T *const rtwdemo_roll_M)
在函数定义中,算法首先将每个指针从实时模型数据结构中提取到局部变量中。
rtwdemodbtype(文件,...‘* rtwdemo_roll_DW = ','RTWDEMO_ROLL_M->输出;', 1, 1)
DW_rtwdemo_roll_T *rtwdemo_roll_DW = (((DW_rtwdemo_roll_T *) rtwdemo_roll_M->dwork);ExtU_rtwdemo_roll_T *rtwdemo_roll_U = (ExtU_rtwdemo_roll_T *) rtwdemo_roll_M->输入;ExtY_rtwdemo_roll_T *rtwdemo_roll_Y = (ExtY_rtwdemo_roll_T *) rtwdemo_roll_M->输出;
然后,为了访问存储在全局内存中的输入和输出数据,算法与这些局部变量进行交互。
rtwdemodbtype(文件,' if (rtwdemo_roll_U->AP_Eng) {',...' /* Switch结束:"/EngSwitch " */' , 1, 1)
if (rtwdemo_roll_U->AP_Eng) {/* Outputs for Atomic子系统:'/BasicRollMode' */ /* Saturate: ' /CmdLimit' */ if (rtwdemo_roll_Y->Ail_Cmd > 15.0F) {/* Sum: ' /Sum2' includes: * Outport: ' /Ail_Cmd' */ rtwdemo_roll_Y->Ail_Cmd = 15.0F;} else {if (rtwdemo_roll_Y->Ail_Cmd < -15.0 f) {/* Sum: ' /Sum2'合并:* Outport: ' /Ail_Cmd' */ rtwdemo_roll_Y->Ail_Cmd = -15.0 f;}} /* End of Saturate: ' /CmdLimit' */ /* End of Outputs for SubSystem: ' /BasicRollMode' */} else {/* Sum: ' /Sum2' includes: * Constant: ' /Zero' */ Outport: ' /Ail_Cmd' */ rtwdemo_roll_Y->Ail_Cmd = 0.0F;}
类似地,模型初始化函数接受实时模型数据结构作为参数。
rtwdemodbtype(文件,.../*模型初始化函数*/,“空白rtwdemo_roll_initialize”, 1, 1)
/ *模型初始化函数* / void RTWDEMO_ROLL_INITIALIZE(RT_MODEL_RTWDEMO_ROLL_T * CONST RTWDEMO_ROLL_M)
由于对入口点函数的每次调用都与单独的实时模型数据结构交互,因此可以避免调用之间的意外交互。
要在生成的代码中控制数据接口的特征,请参见生成代码中的控制数据和函数接口.