深入拆解Simulink自动生成代码(一)——数据流处理

文章目录

前言

一、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工程可以到笔者的主页查找和下载。


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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mr.Cssust

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值