使用Simulink缓存文件加速持续集成工作流中的Simulink仿真
作者:Puneet Khetarpal, Marco Dragic和Govind Malleichervu, MathWorks
在敏捷开发工作流中,设计复杂系统是一项协作工作,其中大型团队开发组件,组装子系统,并将它们集成到系统设计中。理想情况下,系统仿真是组件设计工作流中不可分割的验证步骤,使工程师能够验证组件是否满足系统需求。然而,多次模拟一个具有复杂模型层次结构的系统可能非常耗时。
Simulink的一种方法®通过在第一次运行模拟时创建一组中间派生的工件来加速大型模型参考层次结构的模拟。对于大型团队来说,共享和重用这些派生文件(包括MEX文件和其他二进制文件)可能具有挑战性。因此,团队成员经常花费时间重建和重新创建团队中其他人已经创建的文件。这种多余的工作消耗了本可以用于更有效的设计活动的时间。团队越大,模型越复杂,问题就越严重。
为了解决这个问题,Simulink将这些派生工件打包并存储在模型缓存文件。在本文中,我们描述了在典型的敏捷开发工作流中管理和共享Simulink缓存文件的方法,该工作流使用Git™进行源代码控制,使用Jenkins™进行持续集成(CI)。这种方法大大加快了系统模拟的速度。
Simulink缓存
当您以加速模式、快速加速模式或模型参考加速模式模拟模型时,Simulink会将层次结构中每个模型的派生文件打包到相应的Simulink缓存文件(SLXC)中。团队成员可以彼此共享这些SLXC文件和相应的Simulink模型文件。当团队成员在他们的机器上重复模拟时,Simulink从每个模型的SLXC文件中提取必要的派生文件。因此,Simulink不需要执行不必要的重构,模拟完成速度显著加快。
确切的性能改进取决于几个因素,例如层次结构中的模型数量、模型引用重建设置、引用模型中的块数量,以及为每个模型创建的派生文件的大小和数量。在我们使用各种系统模型(0-500个参考模型和1 - 10个层次结构)的测试中,我们看到了从2倍到超过34倍的改进(图1)。
在包含Jenkins CI系统的敏捷工作流中,共享和重用Simulink缓存文件分为三个阶段(图2):
- 向Git提交设计更改。
- 集成设计更改并归档SLXC文件。
- Jenkins从Git中提取设计更改并运行模拟来测试它们。
- Jenkins将Simulink缓存文件保存在Jenkins构建存档中。
- 同步设计更改和SLXC文件。
- 团队成员同步来自Git的最新设计更改和来自Jenkins构建归档的相关缓存文件。
- 团队成员使用缓存文件运行系统模拟。
在更详细地研究这些阶段之前,让我们考虑一下使用Simulink缓存的需求和最佳实践。
共享和重用Simulink缓存文件的要求和最佳实践
Simulink缓存包含派生文件,这些文件依赖于仿真过程中使用的MATLAB版本、平台和编译器。为了共享和重用这些文件,所有团队成员必须使用相同的MATLAB®版本、平台和编译器。在本文中,我们使用的是MATLAB R2019a,微软®窗户®,以及Microsoft Visual c++®2017年,分别。
以下的最佳实践可以通过重用共享缓存文件来简化大型分层模型的模拟:
- 遵循基于组件的建模指南适合你的模特。
- 让每个团队成员负责层次结构的一个子集——通常是由几个Simulink模型组成一个组件,例如具有定义良好的接口的控制器或植物。这将在合并设计更改时最小化问题。
- 使用项目使用启动和关闭脚本,以确保所有团队成员的工作环境一致。启动脚本在打开项目时初始化环境,关闭脚本在关闭项目时清理环境。
- 引用所有模型加速器模式。若要在本地机器上调试引用模型,请使用正常的模式。但是,这种模式不能提供与Accelerator模式相同的模拟性能优势。
- 设置每个模型的重建参数如果检测到任何已知依赖项的更改(图3),并使用模型的依赖性参数指定用户创建的依赖项。这提高了重建检测的速度和准确性。
- 如果您正在使用并行计算工具箱™,请选择启用并行模型引用构建(图3)。然后,模型引用层次结构将自动并行构建。
- 决定Jenkins构建是在每次提交时运行,还是在一天的特定时间运行,还是按需运行。您的特定需求将决定哪种计时效果最好,以及使用以下哪种类型的构建:
- 无菌:一个构建,其中Jenkins工作区清除了来自前一个Jenkins构建的工件或文件。如果您的团队频繁更改Simulink模型配置,请使用无菌构建。例如,更改Simulink模型层次结构上的硬件设置需要一个干净的工作空间。
- 增量:保留前一个Jenkins构建中的构件的构建。如果您的团队对单个组件进行了微小的增量更改,则使用增量构建。
无菌构建通常比增量构建花费更长的时间,这取决于模型层次结构的大小。
将设计更改提交到Git
在此步骤中,团队成员修改模型,模拟模型层次结构,运行model Advisor检查,并进行单元测试。他们承诺只有他们的设计文件到源代码控制系统,如Git。Simulink缓存文件不应该提交给源代码控制系统;它们是派生的二进制文件,可能占用大量磁盘空间,不能进行比较或合并。在Git存储库中,您可以配置.gitignore
文件,以便Git忽略所有派生构件,包括SLXC文件。
集成设计更改和归档SLXC文件
有关在Simulink中使用Jenkins的指导和配置技巧,请参阅这篇技术文章
在本文的其余部分中,我们将使用Simulink缓存和Jenkins的工作流程示例.
在本例中,Jenkins管理员指定构建命令在MATLAB Jenkins插件.该命令启动MATLAB,构建加速器目标,为嵌入式实时目标控制器生成生产C代码,并运行软件在环(SIL)等价测试。图4显示了打开Simulink项目并执行myBuildAndTest脚本的命令。
作为模拟和代码生成的一部分,Simulink创建了SLXC文件,其中包含层次结构中所有模型的加速器和模型参考模拟目标。这些SLXC文件的一个子集包含用于嵌入式实时控制器目标的生产C代码。Simulink将这些SLXC文件存储在仿真缓存文件夹中。文件中指定此文件夹的位置项目详细信息(图5)。脚本然后运行多个模拟来测试设计更改。
此外,管理员设置一个Post-build行动在Jenkins中存档SLXC文件(图6)。在构建之后,Jenkins将SLXC文件从Jenkins工作区复制到构建存档位置。
要指定Jenkins构建存档位置,管理员可以编辑Jenkins主目录中的config.xml文件。
同步设计更改和SLXC文件
通常,Jenkins构建是每晚执行的。然后,每个团队成员可以基于上一次成功构建同步一个沙盒。团队成员从Git签出设计更改,从构建归档区检索相关的Simulink缓存文件,并在模拟之前将Simulink缓存文件放在他们的模拟缓存文件夹中。团队可以设置一个脚本来自动化这个过程。
在这个例子中,syncSLXCForCurrentHash脚本访问一个SQLite数据库来查询成功的构建,找到它对应的Git提交散列,并将SLXC文件从Jenkins中的归档构建区复制到模拟缓存文件夹中。
改进工作流
有几种方法可以使此工作流更快、更不容易出错。要方便地管理来自多个Jenkins构建的SLXC文件,可以使用数据库或存储库管理工具,如本例所示。最后,为了进一步扩展模拟性能,可以使用parsim对一系列输入参数值运行多个系统模拟。
2022年出版的