分享

解锁隐藏技能 | 又一种实现条件编译的建模方法

 afliegen 2017-09-27

作者简介

董淑成,MathWorks公司中国区高级应用工程师,MATLAB中文论坛超级版主“老胡”,主要负责自动代码生成在汽车及其他工业领域中的应用,具有15年以上的MATLAB®/Simulink使用经验。加入MathWorks之前,曾任职于德尔福中国研发中心的控制与安全部门负责算法建模和代码生成,并成功的将基于模型设计引入到产品开发中,在基于模型设计以及相关的流程优化方面有丰富的经验。

上次介绍过可以使用Variant Subsystem或者Model Variant实现带有条件编译的代码(条件编译助力Simulink模型平台化开发)。最近了解到,从MATLAB R2016a开始,又有一种新的方式可以实现C代码中的条件编译。这就是Variant Sourc模块的使用。

假设有如下模型:

双击Variant Source模块,可以看到如下配置界面:

不难看出,除了要定义Simulink Variant对象K1、K2之外,还需要勾上Analyze all choices during update diagram and generate prepropcessor conditionals选项。显然,如果K==1条件成立,则Port 1分支对应的代码被编译,如果K==2,则Port 2分支对应的代码被编译。这里的K可以定义为Simulink Parameter对象,Storage Class定义为Define(Custom),并且需要指定宏定义的文件。

如此设置之下,得到的模型算法实现函数如下:

void testvariantSource_step(void)

{

      real_T rtb_VariantMerge_For_Variant_So;


    #if K1

      rtb_VariantMerge_For_Variant_So = u1 + u2;

    #endif


    #if K2

      rtb_VariantMerge_For_Variant_So = u3 + u4;

    #endif

      y = rtb_VariantMerge_For_Variant_So;

}

这种方式实现带有条件编译的代码也非常简单,条件编译的好处可以通过控制宏定义K控制需要编译哪部分代码,那么,如果不设置条件编译呢?

上述模型中,如果不再勾选Analyze all choices during update diagram and generate prepropcessor conditionals选项,我们得到如下代码:

void testvariantSource_step(void)

{

  y = u1 + u2;

}

代码中只有当前参数条件下有效算法的代码。


跟上次介绍的条件编译相比,实现方式不同,应用场景也可能不同,如何取舍,这里就不去分析了。但是,在基于模型的开发模式下,到底在模型级别上做选择,还是通过C代码级别的条件编译做选择,这是个值得我们思考的问题。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多