示例模型
打开示例模型 rtwdemo_ratetrans。这种多速率、多任务模型包含几个在不同模式下运行的 Rate Transition 模块。
open_system('rtwdemo_ratetrans');
set_param('rtwdemo_ratetrans','SystemTargetFile','ert.tlc');
set_param('rtwdemo_ratetrans','GenerateComments', 'Off');
将 Rate Transition 模块的代码分离出来
在 Configuration Parameters 对话框中,Rate Transition block code 参数设置为 Function。为模型生成代码。代码位于文件 rtwdemo_ratetrans.c 和 rtwdemo_ratetrans.h 中。
currentDir = pwd;
[~,cgDir] = rtwdemodir();
rtwbuild('rtwdemo_ratetrans');
### Starting build procedure for: rtwdemo_ratetrans
### Successful completion of build procedure for: rtwdemo_ratetrans
Build Summary
Top model targets built:
Model Action Rebuild Reason
==================================================================================================
rtwdemo_ratetrans Code generated and compiled Code generation information file does not exist.
1 of 1 models built (0 models already up to date)
Build duration: 0h 0m 18.871s
hfile=fullfile(cgDir, 'rtwdemo_ratetrans_ert_rtw','rtwdemo_ratetrans.h');
rtwdemodbtype(hfile,'typedef struct {','} DW;', 1, 1);
typedef struct {
real_T OutportBufferForOut3[20];
real_T Integrator1_DSTATE[20];
real_T Integrator2_DSTATE[20];
real_T Integrator3_DSTATE[20];
real_T Integrator1_PREV_U[20];
real_T Integrator2_PREV_U[20];
real_T Integrator3_PREV_U[20];
uint32_T Algorithm_PREV_T;
struct {
uint_T Algorithm_RESET_ELAPS_T:1;
} bitsForTID1;
uint8_T Integrator1_SYSTEM_ENABLE;
uint8_T Integrator2_SYSTEM_ENABLE;
uint8_T Integrator3_SYSTEM_ENABLE;
} DW;
对于 Rate Transition 模块,状态数据不在全局状态结构体 DW_rtwdemo_ratetrans_T 中。这些数据在文件 rtwdemo_ratetrans_rtb.h 内专门的结构体中。
以下代码包含在文件 rtwdemo_ratetrans.c 中。
cfile=fullfile(cgDir, 'rtwdemo_ratetrans_ert_rtw','rtwdemo_ratetrans.c');
rtwdemodbtype(cfile,'void rtwdemo_ratetrans_step0','void rtwdemo_ratetrans_terminate(void)', 1, 0);
void rtwdemo_ratetrans_step0(void)
{
(rtM->Timing.RateInteraction.TID0_1)++;
if ((rtM->Timing.RateInteraction.TID0_1) > 1) {
rtM->Timing.RateInteraction.TID0_1 = 0;
}
rtwdemo_rate_DetAndIntegS2F_get(rtY.Out1);
rtwdemo_ratetr_IntegOnlyS2F_get(rtY.Out2);
memcpy(&rtY.Out3[0], &rtDW.OutportBufferForOut3[0], 20U * sizeof(real_T));
rtwdemo_rate_DetAndIntegF2S_set(rtU.In1);
rtwdemo_ratetr_IntegOnlyF2S_set(rtU.In2);
}
void rtwdemo_ratetrans_step1(void)
{
real_T rtb_DetAndIntegF2S[20];
real_T rtb_IntegOnlyF2S[20];
real_T tmp;
int32_T i;
uint32_T Algorithm_ELAPS_T;
rtwdemo_rate_DetAndIntegF2S_get(rtb_DetAndIntegF2S);
rtwdemo_ratetr_IntegOnlyF2S_get(rtb_IntegOnlyF2S);
if (rtDW.bitsForTID1.Algorithm_RESET_ELAPS_T) {
Algorithm_ELAPS_T = 0U;
} else {
Algorithm_ELAPS_T = rtM->Timing.clockTick1 - rtDW.Algorithm_PREV_T;
}
rtDW.Algorithm_PREV_T = rtM->Timing.clockTick1;
rtDW.bitsForTID1.Algorithm_RESET_ELAPS_T = false;
tmp = 0.001 * (real_T)Algorithm_ELAPS_T;
for (i = 0; i < 20; i++) {
if (rtDW.Integrator1_SYSTEM_ENABLE == 0) {
rtDW.Integrator1_DSTATE[i] += tmp * rtDW.Integrator1_PREV_U[i];
}
if (rtDW.Integrator2_SYSTEM_ENABLE == 0) {
rtDW.Integrator2_DSTATE[i] += tmp * rtDW.Integrator2_PREV_U[i];
}
if (rtDW.Integrator3_SYSTEM_ENABLE == 0) {
rtDW.Integrator3_DSTATE[i] += tmp * rtDW.Integrator3_PREV_U[i];
}
rtDW.OutportBufferForOut3[i] = rtDW.Integrator3_DSTATE[i];
rtDW.Integrator1_PREV_U[i] = rtb_DetAndIntegF2S[i];
rtDW.Integrator2_PREV_U[i] = rtb_IntegOnlyF2S[i];
rtDW.Integrator3_PREV_U[i] = rtU.In3[i];
}
rtDW.Integrator1_SYSTEM_ENABLE = 0U;
rtDW.Integrator2_SYSTEM_ENABLE = 0U;
rtDW.Integrator3_SYSTEM_ENABLE = 0U;
rtwdemo_rate_DetAndIntegS2F_set(rtDW.Integrator1_DSTATE);
rtwdemo_ratetr_IntegOnlyS2F_set(rtDW.Integrator2_DSTATE);
rtM->Timing.clockTick1++;
}
void rtwdemo_ratetrans_initialize(void)
{
rtDW.bitsForTID1.Algorithm_RESET_ELAPS_T = true;
rtDW.Integrator1_SYSTEM_ENABLE = 1U;
rtDW.Integrator2_SYSTEM_ENABLE = 1U;
rtDW.Integrator3_SYSTEM_ENABLE = 1U;
}
rtwdemo_ratetrans_step0 和 rtwdemo_ratetrans_step1 函数包含对 get 和 set 函数的调用。这些函数包含 Rate Transition 模块代码。这些函数定义位于文件 rtwdemo_ratetrans_rtb.c 中。
为 Rate Transition 模块生成内联代码
在 Configuration Parameters 对话框中,将 Rate Transition block code 参数设置为 Inline。为模型生成代码。代码位于文件 rtwdemo_ratetrans.c 和 rtwdemo_ratetrans.h 中。
set_param('rtwdemo_ratetrans','RateTransitionBlockCode','Inline');
rtwbuild('rtwdemo_ratetrans')
### Starting build procedure for: rtwdemo_ratetrans
### Successful completion of build procedure for: rtwdemo_ratetrans
Build Summary
Top model targets built:
Model Action Rebuild Reason
=================================================================================
rtwdemo_ratetrans 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 16.174s
以下代码现在位于文件 rtwdemo_ratetrans.h 中。
hfile=fullfile(cgDir, 'rtwdemo_ratetrans_ert_rtw','rtwdemo_ratetrans.h');
rtwdemodbtype(hfile, 'typedef struct {', '} DW;', 1, 1);
typedef struct {
real_T Integrator1_DSTATE[20];
real_T Integrator2_DSTATE[20];
real_T Integrator3_DSTATE[20];
real_T DetAndIntegS2F_Buffer0[20];
volatile real_T IntegOnlyS2F_Buffer[40];
real_T DetAndIntegF2S_Buffer[20];
volatile real_T IntegOnlyF2S_Buffer0[20];
real_T Integrator1_PREV_U[20];
real_T Integrator2_PREV_U[20];
real_T Integrator3_PREV_U[20];
uint32_T Algorithm_PREV_T;
struct {
uint_T Algorithm_RESET_ELAPS_T:1;
} bitsForTID1;
volatile int8_T IntegOnlyS2F_ActiveBufIdx;
volatile int8_T IntegOnlyF2S_semaphoreTaken;
uint8_T Integrator1_SYSTEM_ENABLE;
uint8_T Integrator2_SYSTEM_ENABLE;
uint8_T Integrator3_SYSTEM_ENABLE;
} DW;
对于 Rate Transition 模块,状态数据不在全局状态结构体 DW_rtwdemo_ratetrans_T 中。这些数据在文件 rtwdemo_ratetrans_rtb.h 内专门的结构体中。
以下代码现在位于文件 rtwdemo_ratetrans_rtb.c 中。
cfile=fullfile(cgDir, 'rtwdemo_ratetrans_ert_rtw','rtwdemo_ratetrans.c');
rtwdemodbtype(cfile,'void rtwdemo_ratetrans_step0','void rtwdemo_ratetrans_terminate(void)', 1, 0);
void rtwdemo_ratetrans_step0(void)
{
int32_T i;
int32_T i_0;
(rtM->Timing.RateInteraction.TID0_1)++;
if ((rtM->Timing.RateInteraction.TID0_1) > 1) {
rtM->Timing.RateInteraction.TID0_1 = 0;
}
if (rtM->Timing.RateInteraction.TID0_1 == 1) {
memcpy(&rtY.Out1[0], &rtDW.DetAndIntegS2F_Buffer0[0], 20U * sizeof(real_T));
}
i = rtDW.IntegOnlyS2F_ActiveBufIdx * 20;
for (i_0 = 0; i_0 < 20; i_0++) {
rtY.Out2[i_0] = rtDW.IntegOnlyS2F_Buffer[i_0 + i];
}
if (rtM->Timing.RateInteraction.TID0_1 == 1) {
memcpy(&rtDW.DetAndIntegF2S_Buffer[0], &rtU.In1[0], 20U * sizeof(real_T));
}
if (rtDW.IntegOnlyF2S_semaphoreTaken == 0) {
for (i = 0; i < 20; i++) {
rtDW.IntegOnlyF2S_Buffer0[i] = rtU.In2[i];
}
}
}
void rtwdemo_ratetrans_step1(void)
{
real_T rtb_IntegOnlyF2S[20];
real_T tmp;
int32_T i;
uint32_T Algorithm_ELAPS_T;
rtDW.IntegOnlyF2S_semaphoreTaken = 1;
for (i = 0; i < 20; i++) {
rtb_IntegOnlyF2S[i] = rtDW.IntegOnlyF2S_Buffer0[i];
}
rtDW.IntegOnlyF2S_semaphoreTaken = 0;
if (rtDW.bitsForTID1.Algorithm_RESET_ELAPS_T) {
Algorithm_ELAPS_T = 0U;
} else {
Algorithm_ELAPS_T = rtM->Timing.clockTick1 - rtDW.Algorithm_PREV_T;
}
rtDW.Algorithm_PREV_T = rtM->Timing.clockTick1;
rtDW.bitsForTID1.Algorithm_RESET_ELAPS_T = false;
tmp = 0.001 * (real_T)Algorithm_ELAPS_T;
for (i = 0; i < 20; i++) {
if (rtDW.Integrator1_SYSTEM_ENABLE == 0) {
rtDW.Integrator1_DSTATE[i] += tmp * rtDW.Integrator1_PREV_U[i];
}
if (rtDW.Integrator2_SYSTEM_ENABLE == 0) {
rtDW.Integrator2_DSTATE[i] += tmp * rtDW.Integrator2_PREV_U[i];
}
if (rtDW.Integrator3_SYSTEM_ENABLE != 0) {
rtY.Out3[i] = rtDW.Integrator3_DSTATE[i];
} else {
rtY.Out3[i] = tmp * rtDW.Integrator3_PREV_U[i] + rtDW.Integrator3_DSTATE[i];
}
rtDW.Integrator1_PREV_U[i] = rtDW.DetAndIntegF2S_Buffer[i];
rtDW.Integrator2_PREV_U[i] = rtb_IntegOnlyF2S[i];
rtDW.Integrator3_DSTATE[i] = rtY.Out3[i];
rtDW.Integrator3_PREV_U[i] = rtU.In3[i];
rtDW.DetAndIntegS2F_Buffer0[i] = rtDW.Integrator1_DSTATE[i];
}
rtDW.Integrator1_SYSTEM_ENABLE = 0U;
rtDW.Integrator2_SYSTEM_ENABLE = 0U;
rtDW.Integrator3_SYSTEM_ENABLE = 0U;
for (i = 0; i < 20; i++) {
rtDW.IntegOnlyS2F_Buffer[i + (rtDW.IntegOnlyS2F_ActiveBufIdx == 0) * 20] =
rtDW.Integrator2_DSTATE[i];
}
rtDW.IntegOnlyS2F_ActiveBufIdx = (int8_T)(rtDW.IntegOnlyS2F_ActiveBufIdx == 0);
rtM->Timing.clockTick1++;
}
void rtwdemo_ratetrans_initialize(void)
{
rtDW.bitsForTID1.Algorithm_RESET_ELAPS_T = true;
rtDW.Integrator1_SYSTEM_ENABLE = 1U;
rtDW.Integrator2_SYSTEM_ENABLE = 1U;
rtDW.Integrator3_SYSTEM_ENABLE = 1U;
}
代码内联在函数 rtwdemo_ratetrans_step0 和 rtwdemo_ratetrans_step1 中。
限制
代码生成器不会将那些具有可变大小信号或位于 For Each Subsystem 模块内的 For Rate Transition 模块的代码和数据分离出来。
另请参阅
bdclose('rtwdemo_ratetrans');
rtwdemoclean;
cd(currentDir)