中国汽车工程师之家--聚集了汽车行业80%专业人士 

论坛口号:知无不言,言无不尽!QQ:542334618 

本站手机访问:直接在浏览器中输入本站域名即可 

  • 138查看
  • 0回复

[Simulink] MBD的Simulink使用技巧⑥:代码生成目标配置工具

[复制链接]


该用户从未签到

发表于 2-3-2024 09:30:34 | 显示全部楼层 |阅读模式

汽车零部件采购、销售通信录       填写你的培训需求,我们帮你找      招募汽车专业培训老师


全文约2400字,你将看到以下内容:

    代码生成目标配置工具
    代码生成的配置方法总结
autoMBD最近发布了《autoMBD原创技术文章合集》
合集包含156页丰富的MBD入门基础和MBDT硬件支持包的使用还包含基于MBD的电机控制算法开源项目——AMBD-MC合集配备了丰富的视频讲解
和大量的模型、文档和软件资源

如何获取请参考@所有读者:autoMBD发布《autoMBD原创技术文章合集》。

本篇文章继续介绍MBD的Simulink使用技巧,主要包括代码生成目标配置工具的介绍。点击以下链接,可以查看本系列的往期文章:
    MBD的Simulink使用技巧①:Simulink代码生成的基本概念MBD的Simulink使用技巧②:详解代码生成中的模型与代码MBD的Simulink使用技巧③:虚拟子系统与原子子系统的代码生成MBD的Simulink使用技巧④:详解生成代码的结构与代码的生成流程MBD的Simulink使用技巧⑤:详解自动代码生成的配置与优化

特别提示:在本篇文章中使用的PI控制器示例模型,可以在autoMBD资源库的“临时资源分享”文件夹中找到该模型(资源序号tA22)。资源库链接的获取可以在《autoMBD原创技术文章合集》中找到(见文章开头)。

1  代码生成目标配置工具

上一篇文章中介绍了很多关于Simulink生成代码的配置选项,怎么合理地设置这些配置项,是一个关键的问题。由于可配置项众多,并且分布零散不集中,开发者在配置时可能会感到困惑。

针对这个问题,Simulink内置了一个专门的配置工具来追踪不同的配置选项,即代码生成目标工具(Code generation objectives)。

这个工具可以设置一个或多个代码生成目标,然后交由工具对当前的配置选项进行全面检查,查找出所有相关配置选项,并给出建议的设置。

可以设置的代码生成目标有八个:


    执行效率(Execution efficiency)

    ROM效率(ROM efficiency)

    RAM效率(RAM efficiency)

    可追踪性(Traceability)

    安全预防(Safety precaution)

    调试(Debugging)

    MISAR-C: 2012 guidelines
    Polyspace

Tips:MISAR-C是一个C语言的标准编程规范;Polyspace是基于抽象解释原理的代码级静态分析和验证工具,可以帮助开发者检查代码中可能存在的溢出、被零除、数组访问越界等问题。

这八个目标可以分为两类:前三个以高效率为目标;后五个以安全、可靠、可追踪为目标。这两类目标通常来说是相互矛盾的。

下面以PI控制器示例模型为例,向读者展示如何使用代码生成目标工具,模型如下图所示:

MBD的Simulink使用技巧⑥:代码生成目标配置工具w1.jpg

PI控制器示例模型 - From autoMBD

该模型代码生成的相关配置项,全部保持为系统默认配置。实际上,Simulink模型默认的代码生成配置,大部分是倾向于高效率的。

在模型配置的Code Generation页面中,可以找到代码生成目标工具,如下所示:

MBD的Simulink使用技巧⑥:代码生成目标配置工具w2.jpg

代码生成目标工具 - From autoMBD

点击“Set Objectives”按钮,目标设置窗口弹出,如下所示:

MBD的Simulink使用技巧⑥:代码生成目标配置工具w3.jpg

目标设置窗口 - From autoMBD

窗口中左边栏一共有八个可选的目标;右边是已选择的目标。

已选目标是按照优先级进行排序,排在前面的优先级更高。这意味着高效率的目标和安全可靠性目标是可以同时选择的,当发生冲突时,执行高优先级的目标。

在实际中根据需求选择合适的目标和优先级。为了做对比,本文以提高安全可靠性的目标为例,设置如下:

MBD的Simulink使用技巧⑥:代码生成目标配置工具w4.jpg

设置安全可靠性目标 - From autoMBD

设置好目标后,在模型配置页面先点击“Apply”应用刚刚的配置,再点击“Check Model”按钮,选择当前模型,点击确认。如下所示:

MBD的Simulink使用技巧⑥:代码生成目标配置工具w5.jpg

点击Check Model开始执行目标检查工具 - From autoMBD

点击后,系统会自动运行扫描所有的配置选项,等待扫描结束后,Code Generation Advisor窗口弹出,如下图所示:

MBD的Simulink使用技巧⑥:代码生成目标配置工具w6.jpg

Code Generation Advisor窗口 - From autoMBD

在窗口的左边栏可以看到,系统运行了很多的检查项目。其中大部分检查结果是通过的,但还存在两项警告。

点击报警告的项,可以查看具体的警告内容和建议的配置:

MBD的Simulink使用技巧⑥:代码生成目标配置工具w7.jpg

查看检查结果 - From autoMBD

在右边栏中,可以通过点击“Run This Check”,单独对该项进行重新扫描检查。

在右边栏的中间部分,展示了全部不符合选定目标的配置选项。详细列出来了配置选项的名称(Parameters)、当前设置(Current Value)和推荐设置值(Recommended Value)。

用户可以点击配置选项的名称,跳转到对应的设置界面,将其修改为推荐设置值。当然用户也可以点击下面的“Modify Parameters”按钮,一键修改全部配置。

Tips:并不是所有的检查结果都有“Modify Parameters”按钮来一键修改配置参数,没有该按钮时需要自行修改参数,点击配置参数名称可以快速跳转。

点击“Modify Parameters”按钮,等待配置结束,此时会提示重新检查一遍:

MBD的Simulink使用技巧⑥:代码生成目标配置工具w8.jpg

重新检查 - From autoMBD

单击“Run This Check”对该项重新检查扫描,扫描结束后会得到新的扫描结果。如果还有需要修改的配置参数,重复上面的步骤,直至扫描结果为通过Pass:

MBD的Simulink使用技巧⑥:代码生成目标配置工具w9.jpg

扫描结果通过 - From autoMBD

对所有报警告的项目都进行上述操作,直至所有项目都检查通过。全部完成后,就实现了选定目标的全部配置选项的设置。

关闭检查窗口,在新的配置下生成代码,查看Step函数如下:

/* Model step function */void autoMBD_example_PI_noSubs_step(void){  /* Sum: '<Root>/Sum2' incorporates:   *  Inport: '<Root>/Feedback'   *  Inport: '<Root>/Req_Ctrl'   */  autoMBD_example_PI_noSubs_B.Err = autoMBD_example_PI_noSubs_U.Req_Ctrl -    autoMBD_example_PI_noSubs_U.Feedback;
  /* Gain: '<Root>/Kp' */  autoMBD_example_PI_noSubs_B.P_value = rtCP_Kp_Gain *    autoMBD_example_PI_noSubs_B.Err;
  /* DiscreteIntegrator: '<Root>/Discrete-Time Integrator' */  autoMBD_example_PI_noSubs_B.I_value =    autoMBD_example_PI_noSubs_DW.DiscreteTimeIntegrator_DSTATE;
  /* Outport: '<Root>/PI_Ctrl' incorporates:   *  Sum: '<Root>/Sum1'   */  autoMBD_example_PI_noSubs_Y.PI_Ctrl = autoMBD_example_PI_noSubs_B.P_value +    autoMBD_example_PI_noSubs_B.I_value;
  /* Gain: '<Root>/Ki' */  autoMBD_example_PI_noSubs_B.Ki = rtCP_Ki_Gain *    autoMBD_example_PI_noSubs_B.Err;
  /* Update for DiscreteIntegrator: '<Root>/Discrete-Time Integrator' */  autoMBD_example_PI_noSubs_DW.DiscreteTimeIntegrator_DSTATE +=    rtCP_DiscreteTimeIntegrator_gai * autoMBD_example_PI_noSubs_B.Ki;}在上述的示例过程中,是以提高代码的安全性和可靠性为目标。作为对比,当配置代码生成目标为高效率时,重复上述过程:
MBD的Simulink使用技巧⑥:代码生成目标配置工具w10.jpg

设置高效率目标 - From autoMBD

查看生成的Step函数如下:
/* Model step function */void autoMBD_example_PI_noSubs_step(void){  real_T rtb_Err;
  /* Sum: '<Root>/Sum2' incorporates:   *  Inport: '<Root>/Feedback'   *  Inport: '<Root>/Req_Ctrl'   */  rtb_Err = autoMBD_example_PI_noSubs_U.Req_Ctrl -    autoMBD_example_PI_noSubs_U.Feedback;
  /* Outport: '<Root>/PI_Ctrl' incorporates:   *  DiscreteIntegrator: '<Root>/Discrete-Time Integrator'   *  Gain: '<Root>/Kp'   *  Sum: '<Root>/Sum1'   */  autoMBD_example_PI_noSubs_Y.PI_Ctrl = 2.0 * rtb_Err +    autoMBD_example_PI_noSubs_DW.DiscreteTimeIntegrator_DSTATE;
  /* Update for DiscreteIntegrator: '<Root>/Discrete-Time Integrator' incorporates:   *  Gain: '<Root>/Ki'   */  autoMBD_example_PI_noSubs_DW.DiscreteTimeIntegrator_DSTATE += 3.0 * rtb_Err *    0.001;}对比可以发现,如果以安全可靠为目标时,生成的代码更多,每一行代码语句只执行一个操作(加、减、乘、除等)。同时还会生成一个“模型名_B”的变量,将每一个步骤中的中间变量保存下来。“模型名_B”类型定义、声明如下:
/* “模型名_B”数据类型定义 *//* Block signals (default storage) */typedefstruct {  real_T Err;                          /* '<Root>/Sum2' */  real_T P_value;                      /* '<Root>/Kp' */  real_T I_value;                      /* '<Root>/Discrete-Time Integrator' */  real_T Ki;                           /* '<Root>/Ki' */} B_autoMBD_example_PI_noSubs_T;
/* “模型名_B”变量声明 *//* Block signals (default storage) */B_autoMBD_example_PI_noSubs_T autoMBD_example_PI_noSubs_B;而原本模型中的常数则被定义为了宏,包括PI控制器的比例增益、积分增益和积分时间常数:
/* 位于“模型名_prvate.h” *//* Expression: 2 * Referenced by: '<Root>/Kp' */#define rtCP_Kp_Gain                   (2.0)
/* Computed Parameter: DiscreteTimeIntegrator_gainval * Referenced by: '<Root>/Discrete-Time Integrator' */#define rtCP_DiscreteTimeIntegrator_gai (0.001)
/* Expression: 3 * Referenced by: '<Root>/Ki' */#define rtCP_Ki_Gain                   (3.0)当然,其他文件中也还有一些区别,读者可以自行对比。由于本文中使用的示例模型较为简单,生成的代码差异不是很多。但当模型变得复杂时,不同的代码生成目标,生成的代码差异可能非常大。
使用代码生成目标工具来配置代码生成选项,可以大大简化使用者的配置过程,只需要设定需要的目标(高效率或高可靠性)即可。

2  代码生成的配置方法总结

本篇文章结合上一篇文章的内容,关于在Simulink中的代码生成配置方法就基本介绍完毕了。

需要注意的是,这两篇文章介绍的配置方法,是代码生成的优化配置项,主要影响代码执行效率、RAM/ROM空间效率、安全性、可靠性、Debugging和可追踪性等方面。

实际上,影响代码生成的选项还有很多,在本系列文章的①、②、③、④期文章中介绍了一部分,后续还会介绍存储类、函数原型等相关配置方法,都会影响代码的生成。

MBD的Simulink使用技巧⑥:代码生成目标配置工具w11.jpg

如果你觉得文章对你有帮助,欢迎关注,我会持续更新更多原创文章

与我交流讨论

由于新开通的公众号均不支持留言,欢迎给我发私信,我会及时回复的
MBD的Simulink使用技巧⑥:代码生成目标配置工具w12.jpg


版权归autoMBD所有,转载请注明作者和来源。
MBD的Simulink使用技巧⑥:代码生成目标配置工具w13.jpg

快速发帖

您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|手机版|小黑屋|Archiver|汽车工程师之家 ( 渝ICP备18012993号-1 )

GMT+8, 26-11-2024 03:15 , Processed in 0.424588 second(s), 31 queries .

Powered by Discuz! X3.5

© 2001-2013 Comsenz Inc.