示例模型

打开示例模型 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)

matlab 传输速率,处理速率转换 - MATLAB Simulink - MathWorks 中国相关推荐

  1. matlab的许可证文件路径,网络许可证文件 - MATLAB Simulink - MathWorks 中国

    在网络许可证文件内 网络许可证文件是一种特殊格式的 ASCII 文本文件,其中包含您有权运行的每个产品的加密产品密码.每个产品密码用于确认适合该产品的密钥数.网络许可证管理器可授予或拒绝对某产品的访问 ...

  2. matlab 数字转化为文字,将文本转换为数值 - MATLAB Simulink - MathWorks 中国

    双精度值 将文本转换为双精度值的推荐方法是使用 str2double 函数.它可以转换字符向量.字符串数组和字符向量元胞数组. 例如,使用单引号创建字符向量,并将其转换为它所表示的数字. X = st ...

  3. 如何建立分类模型matlab,创建简单模型 - MATLAB Simulink - MathWorks 中国

    创建简单模型 您可以使用 Simulink® 来对系统建模,然后仿真该系统的动态行为.本教程中创建简单模型所使用的基本方法也适用于创建更复杂的模型.此示例对简化的汽车运动进行仿真.当踩下油门踏板时,汽 ...

  4. matlab目标支持包安装问题,配置系统目标文件 - MATLAB Simulink - MathWorks 中国

    配置系统目标文件 要对模型进行配置以用于代码生成,请按照选择支持代码生成的求解器和从 STF 浏览器中选择系统目标文件中的步骤进行操作.选择系统目标文件时,其他模型配置参数会相应更改,以满足执行环境的 ...

  5. matlab 的字符类型转换,数据类型转换 - MATLAB Simulink - MathWorks 中国

    将文本转换为数值数组.文本可以表示浮点值.日期和时间,以及十六进制和二进制数字.如果文本表示日期和时间,则可以将文本转换为日期时间或持续时间值. 将数值转换为文本.文本可以表示浮点值,其格式可以使用或 ...

  6. matlab文字转数据,将文本转换为数值 - MATLAB Simulink - MathWorks 中国

    双精度值 将文本转换为双精度值的推荐方法是使用 str2double 函数.它可以转换字符向量.字符串数组和字符向量元胞数组. 例如,使用单引号创建字符向量,并将其转换为它所表示的数字. X = st ...

  7. matlab 数字转化为文字,将数值转换为文本 - MATLAB Simulink - MathWorks 中国

    转换为字符串 在 R2016b 之前,使用num2str转换为字符向量. 要将数字转换为表示该数字的字符串,请使用 string 函数. str = string(pi) str = "3. ...

  8. 如何用MATLAB绘制真值表,编写真值表 - MATLAB Simulink - MathWorks 中国

    编写真值表 在创建新真值表后,您就可以对它进行编写以根据您的设定执行.要编写真值表,您需要添加条件.决策和动作.有关创建真值表的详细信息,请参阅使用真值表对组合逻辑建模. 真值表仅在 Simulink ...

  9. matlab memory 代数环,代数环概念 - MATLAB Simulink - MathWorks 中国

    代数环求解器的工作原理 当模型中包含代数环时,Simulink 在每个时间步使用非线性求解器解算代数环.求解器执行迭代以确定代数约束的解(如果存在).因此,有代数环的模型的运行速度可能比没有代数环的模 ...

最新文章

  1. 2021年春季学期-信号与系统-第三次作业参考答案-第十一道题
  2. 1年内4次架构调整,谈Nice的服务端架构变迁之路--转
  3. db2查最新值的前一天值_现在的C1驾照值多少钱?最新价格曝光,老司机一看赚翻了...
  4. [Visual Studio] 未能完成操作 不支持此接口
  5. gulp版本号管理插件注意事项
  6. java .this的用法_JAVA中this用法小结
  7. 大数据“下田”,未来农业将成为世界上最重要的产业之一
  8. 笨方法python3_“笨方法”学Python3,习题 30 。
  9. IEC61850简要介绍
  10. ECS主动运维事件--让你HOLD住全场 (二)
  11. 计算机网络课后作业习题2
  12. 门户通专访蓝色理想曾沐阳:用户需慢慢沉淀
  13. 2020iOS开发工程师面试题汇总(内含面试技巧)-看完BATJ面试官对你竖起大拇指!
  14. Linux valgrind java_linux下valgrind的使用概述
  15. 怎么用matlab画一个笑脸,MATLAB笑脸识别
  16. 用cJSON解析心知天气返回的数据包
  17. win7系统安装高版本node
  18. 记录第一次被黑数据库
  19. 2015届华为校园招聘机试题 C语言实现
  20. 计算机2010版本怎么样的,cad2010版本使用起来怎么样

热门文章

  1. weld焊接_玩Weld-Probe –一站式查看CDI的所有方面
  2. gc频繁的暂停启动_减少主要GC暂停的频率
  3. POI创建的文档具有不同条件的灵活样式
  4. 具有Spring Security的Grails
  5. 使用Spring Data R2DBC进行异步RDBMS访问
  6. Spring Cloud Gateway –配置简单路由
  7. OpenLiberty:注入时出错,适用于TomEE和Wildfly
  8. 现代化历险记:策略+将COBOL转换为Java的示例
  9. 应用程序模块和实体缓存
  10. 可行的DeltaSpike教程