基于模型的敏捷设计:在持续集成工作流中加速Simulink仿真金宝app

作者:Puneet Khetapal和Marco Dragic,MathWorks


在敏捷开发工作流中,设计复杂系统是一项协作工作,大型团队在其中开发组件、组装子系统并将它们集成到系统设计中。理想情况下,系统仿真是组件设计工作流中不可或缺的验证步骤,使工程师能够验证组件是否满足系统要求。但是,多次模拟具有复杂模型层次结构的系统可能非常耗时。

Simulink的一种方式金宝app®通过在第一次运行模拟时创建一组中间衍生工件,可以加速大型模型参考层次的模拟。对于大型团队来说,共享和重用这些派生文件(包括MEX文件和其他二进制文件)可能是一项挑战。因此,团队成员经常花费时间重建和重新创建团队中其他人已经创建的文件。这种多余的工作消耗了原本可以花在更高效的设计活动上的时间。团队越大,模型越复杂,问题就越严重。

为了解决这个问题,Simulink将这些派生的金宝app工件打包并存储在Simulink缓存文件中™ 对于源代码管理和Jenkins™ 对于连续集成(CI),这种方法大大加快了系统仿真的速度。

模型缓存金宝app

当您在加速器、快速加速器或模型引用加速模式中模拟模型时,Simulink将层次结构中每个模型的派生文件打包到其相应的Simulink缓存文件(SLXC)中。金宝app团队成员可以彼此共享这些SLXC文件和相应的Simulink模型文件。金宝app当团队成员在他们的机器上重复模拟时,Simulink从每个模型的SLXC文件中提取必要的派生文件。金宝app因此,Simulink不需金宝app要执行不必要的重新构建,并且模拟完成得更快。

确切的性能改进取决于几个因素,例如层次结构中的模型数、模型参照重建设置、参照模型中的块数以及为每个模型创建的衍生文件的大小和数量。在我们对具有0-500个参考模型和1-10个层次的各种系统模型的测试中,我们看到了从2倍到超过34倍的改进(图1)。

图1所示。使用Simulink缓存文件对各种系统模型进行性能改进。金宝app

在包含Jenkins CI系统的敏捷工作金宝app流中共享和重用Simulink缓存文件是一个三个阶段的过程(图2):

  1. 将设计更改提交到Git。
  2. 集成设计更改和归档SLXC文件。
    • Jenkins从Git中提取设计更改并运行模拟来测试它们。
    • Jenkins将Simulink缓存金宝app文件保存在Jenkins构建归档中。
  3. 同步设计更改和SLXC文件。
    • 团队成员同步来自Git的最新设计更改和来自Jenkins build归档的相关缓存文件。
    • 团队成员使用缓存文件运行系统模拟。

图2。使用源代码管理和连续集成系统重用Simulink缓存文件的典型工作流。阴影区金宝app域描述了工作流的三个阶段。

在更详细地查看这些阶段之前,让我们考虑使用Simulink缓存的需求和最佳实践。金宝app

共享和重用Simulink缓存文件的要求和最佳做法金宝app

Simu金宝applink缓存包含派生文件,这些文件取决于仿真过程中使用的MATLAB版本、平台和编译器。要共享和重用这些文件,所有团队成员必须使用相同的MATLAB®发布、平台和编译器。在本文中,我们使用的是MATLAB R2019a,微软®窗户®,以及Microsoft Visual c++®分别为2017年。

通过重用共享缓存文件,以下最佳实践可以更容易地加速大型分层模型的模拟:

  • 跟随基于组件的建模指南适合您的模型。例如,层次结构中的参照模型通常应包含500多个块,以获得最佳模拟性能。
  • 让每个团队成员负责层次结构的一个子集,通常是构成组件的几个Simulink模型,例如具有定义良好的接口的控制器或设备。这可以最大限度地减少合并设计更改时出现的问题金宝app。
  • 使用项目使用启动和关闭脚本,确保所有团队成员的工作环境一致。启动脚本在项目打开时初始化环境,关闭脚本在项目关闭时清理环境。
  • 参考中的所有模型加速器模式。若要在本地机器上调试引用的模型,请使用典型的模式。但是,此模式不能提供与Accelerator模式相同的模拟性能优势。
  • 设置每个模型的重建参数到如果在已知依赖项中检测到任何更改(图3)并使用模型依赖关系参数指定用户创建的依赖项。这提高了重建检测的速度和准确性。
  • 如果您正在使用并行计算工具箱™,请选择启用并行模型引用构建(图3)。然后模型引用层次结构将自动并行构建。
  • 决定Jenkins构建是在一天中的特定时间在每次提交时运行,还是按需运行。您的具体需求将决定什么时间最有效,以及使用以下哪种类型的构建:
    • 无菌:在Jenkins工作区中清除先前Jenkins构建中的工件或文件的构建。如果您的团队经常更改Simulink模型配置,请使用无菌构建。例如,更改Simulink模型层次结构上的硬件设置需要干净的工作空间。金宝app
    • 增量:保留先前Jenkins构建中的工件的构建。如果您的团队对单个组件进行微小的增量更改,请使用增量构建。

    无菌构建通常比增量构建花费更长的时间,具体取决于模型层次结构的大小。

图3。模型配置参数。

将设计更改提交到Git

在此步骤中,团队成员修改模型、模拟模型层次结构、运行model Advisor检查并进行单元测试。他们承诺只有他们的设计文件到源代码管理系统,如Git。Simulink缓存文件不应提交给源代码管理系统;它金宝app们是派生的二进制文件,可能占用大量磁盘空间,无法进行比较或合并。在Git存储库中,您可以配置.gitignore这样Git就会忽略所有派生的工件,包括SLXC文件。

集成设计更改和归档SLXC文件

有关在Simulink中使用Jenkins的指导和配置提示,请参阅博客文章金宝app与Simulink项目和Simulink测试持续集成。金宝app

在下面的示例中,Jenkins管理员指定构建命令。该命令启动MATLAB,构建最大模拟加速的快速加速器目标,并运行测试。图4显示了打开Simulink项目的命令,金宝appMyJenkinsProject并执行myBuildAndTest剧本

图4.Jenkins Build命令的示例,该命令打开Simulink项目并执行金宝appmyBuildAndTest剧本该脚本为系统构建快速加速器目标,并运行多个模拟以测试更改。

使用此脚本,Jenkins为模型层次结构构建快速加速器目标:

金宝appSimulink.BlockDiagram.buildRapidAcceleratorTarget('model');

此命令创建包含层次结构中所有模型的快速加速器和模型参考模拟目标的SLXC文件。金宝appSimulink将这些SLXC文件存储在仿真缓存文件夹中。文件中指定此文件夹的位置项目详情(图5)。然后,脚本运行多个模拟以测试设计更改。

图5。“项目详细信息”对话框指定存储SLXC文件的缓存文件夹的位置。默认设置是[项目根]。

此外,管理员还设置Post-build行动在Jenkins中归档SLXC文件(图6)。构建完成后,Jenkins将SLXC文件从Jenkins工作空间复制到构建归档位置。要指定Jenkins构建归档位置,管理员可以编辑config.xml文件位于Jenkins主目录中。

图6。一个Jenkins后期构建操作,配置为在构建完成后将所有Simulink缓存文件从Jenkins工作空间归金宝app档到构建归档区域。

同步设计更改和SLXC文件

通常,Jenkins构建是每晚执行的。然后,每个团队成员都准备好根据上一次成功构建同步一个沙箱。团队成员从Git签出设计更改,从构建归档区域检索关联的Simulink缓存文件,并在模拟之前将Simulink缓存文件放置在其模拟缓存文件夹中。团队可以设置一个脚本来自动化这个过程。例如,以下脚本概述了同步Simulink缓存文件的主要步骤:金宝app

函数CopyJenkinsLxCfiles(构建位置)COPYJENKINSSLXCFILES从Jenkins lastsuccessbuild拷贝slxc文件%将位置存档到用户的缓存文件夹。%%buildLocation:Jenkins构建位置%构建归档路径archivePath=fullfile(构建位置,“lastSuccessfulBuild”,“档案”,“工作”,“缓存”);%获取缓存文件夹位置cacheFolder=Si金宝appmulink.fileGenControl(“得到”,“CacheFolder”);%将slxc文件从生成存档复制到缓存文件夹复制文件(归档路径、缓存文件夹);终止

加强工作流程

有几种方法可以使此工作流更快、更不容易出错。要轻松管理来自多个Jenkins版本的SLXC文件,可以使用数据库或存储库管理工具。要在项目中自动运行MATLAB和Simulink测试作为工作的一部分,可以使用Jenkins的MATLAB插件。最后,为了进一步扩展模拟性能,可以使用金宝app帕西姆输入参数值的范围。

2019年出版

查看相关功能的文章