我是靠谱客的博主 朴实小蜜蜂,最近开发中收集的这篇文章主要介绍深入拆解Simulink自动生成代码(一)——数据流处理文章目录前言一、Simulink实现数据流处理二、自动生成C代码三、变式1四、变式2五、变式3总结,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

文章目录

前言

一、Simulink实现数据流处理

二、自动生成C代码

三、变式1

四、变式2

五、变式3

总结


前言

        近期在做的项目用到了Simulink自动生成代码,图形化编程语言相比文本类编程语言的优势是,逻辑思路和数据流清晰了很多,劣势是程序执行的时序不明显,而且各个模块的配置操作使编程的灵活度下降了不少,在使用习惯上面总感觉有各种限制。今天就深入地拆解一下Simulink中最基础的几个编程模块,尽量在以后的使用中发扬它的优势,避开劣势。

一、Simulink实现数据流处理

         用Simulink处理数据流的一个最简单编程举例如下:

二、自动生成C代码

         上述处理数据流的Simulink自动生成的对应C代码如下:


uint8_T rtb_Output;
/* UnitDelay: '<S3>/Output' */
rtb_Output = CodeGenerate_DW.Output_DSTATE;
/* Switch: '<S5>/FixPt Switch' incorporates:
*
Constant: '<S4>/FixPt Constant'
*
Constant: '<S5>/Constant'
*
Sum: '<S4>/FixPt Sum1'
*
UnitDelay: '<S3>/Output'
*/
if ((uint8_T)(CodeGenerate_DW.Output_DSTATE + 1U) > 7) {
CodeGenerate_DW.Output_DSTATE = 0U;
} else {
CodeGenerate_DW.Output_DSTATE++;
}
/* End of Switch: '<S5>/FixPt Switch' */
/* Outport: '<Root>/y' incorporates:
*
Gain: '<S2>/Gain'
*/
CodeGenerate_Y.y = (uint16_T)(160U * rtb_Output);

三、变式1

         基于上述举例,把源数据整体做一个偏移参数”2”,生成的对应代码如下所示:


/* Outport: '<Root>/y' incorporates:
*
Constant: '<S2>/Constant'
*
Gain: '<S2>/Gain'
*
Sum: '<S2>/Add'
*
UnitDelay: '<S3>/Output'
*/
CodeGenerate_Y.y = ((real_T)CodeGenerate_DW.Output_DSTATE + 2.0) * 10.0;
/* Switch: '<S5>/FixPt Switch' incorporates:
*
Constant: '<S4>/FixPt Constant'
*
Constant: '<S5>/Constant'
*
Sum: '<S4>/FixPt Sum1'
*
UnitDelay: '<S3>/Output'
*/
if ((uint8_T)(CodeGenerate_DW.Output_DSTATE + 1U) > 7) {
CodeGenerate_DW.Output_DSTATE = 0U;
} else {
CodeGenerate_DW.Output_DSTATE++;
}
/* End of Switch: '<S5>/FixPt Switch' */

四、变式2

         基于上述举例,把数据流处理的结果从double型转换成bool型,生成的对应代码如下所示:


/* Outport: '<Root>/y' incorporates:
*
Constant: '<S2>/Constant'
*
DataTypeConversion: '<S2>/Data Type Conversion'
*
Gain: '<S2>/Gain'
*
Sum: '<S2>/Add'
*
UnitDelay: '<S3>/Output'
*/
CodeGenerate_Y.y = ((CodeGenerate_DW.Output_DSTATE - 2) * 10 != 0);
/* Switch: '<S5>/FixPt Switch' incorporates:
*
Constant: '<S4>/FixPt Constant'
*
Constant: '<S5>/Constant'
*
Sum: '<S4>/FixPt Sum1'
*
UnitDelay: '<S3>/Output'
*/
if ((uint8_T)(CodeGenerate_DW.Output_DSTATE + 1U) > 7) {
CodeGenerate_DW.Output_DSTATE = 0U;
} else {
CodeGenerate_DW.Output_DSTATE++;
}
/* End of Switch: '<S5>/FixPt Switch' */

五、变式3

        基于上述举例,把数据流处理的结果做两个周期的延时,生成的对应代码如下所示:


int32_T rtb_Var2;
/* Outport: '<Root>/y' incorporates:
*
Delay: '<S2>/Delay'
*/
CodeGenerate_Y.y = CodeGenerate_DW.Delay_DSTATE[0];
/* Gain: '<S2>/Gain' incorporates:
*
Constant: '<S2>/Constant'
*
Sum: '<S2>/Add'
*
UnitDelay: '<S3>/Output'
*/
rtb_Var2 = (CodeGenerate_DW.Output_DSTATE - 2) * 10;
/* Switch: '<S5>/FixPt Switch' incorporates:
*
Constant: '<S4>/FixPt Constant'
*
Constant: '<S5>/Constant'
*
Sum: '<S4>/FixPt Sum1'
*
UnitDelay: '<S3>/Output'
*/
if ((uint8_T)(CodeGenerate_DW.Output_DSTATE + 1U) > 7) {
CodeGenerate_DW.Output_DSTATE = 0U;
} else {
CodeGenerate_DW.Output_DSTATE++;
}
/* End of Switch: '<S5>/FixPt Switch' */
/* Update for Delay: '<S2>/Delay' incorporates:
*
DataTypeConversion: '<S2>/Data Type Conversion'
*/
CodeGenerate_DW.Delay_DSTATE[0] = CodeGenerate_DW.Delay_DSTATE[1];
CodeGenerate_DW.Delay_DSTATE[1] = (rtb_Var2 != 0);

总结

         以上就是本人拆解Simulink模块自动生成代码时,首先讲解的第一部分。主要针对Simulink的数据流处理模块,展示了这些模块的使用方法,并对比了相应的C代码。

         后续还会更新Simulink其他的几种模块,欢迎评论区留言、点赞、收藏和关注,这些鼓励和支持都将成为笔者持续分享的动力。

         另外,上述例程使用的Demo工程可以到笔者的主页查找和下载。


         版权声明:原创文章,转载和引用请注明出处和链接,侵权必究!

最后

以上就是朴实小蜜蜂为你收集整理的深入拆解Simulink自动生成代码(一)——数据流处理文章目录前言一、Simulink实现数据流处理二、自动生成C代码三、变式1四、变式2五、变式3总结的全部内容,希望文章能够帮你解决深入拆解Simulink自动生成代码(一)——数据流处理文章目录前言一、Simulink实现数据流处理二、自动生成C代码三、变式1四、变式2五、变式3总结所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(63)

评论列表共有 0 条评论

立即
投稿
返回
顶部