理想的系统模拟在元件设计工作流程中是一个完整的验证步骤,让工程师可以验证元件是否符合系统要求,本文将描述一个在典型的敏捷开发工作流程管理和分享Simulink快取档案的方法。
在敏捷(Agile)开发工作流程中,复杂系统设计仰赖多个大型团队的共同付出来开发元件、组装子系统、以及将其整合至系统设计。理想中,系统模拟在元件设计工作流程中是一个完整的验证步骤,让工程师可以验证元件是否符合系统要求。然而,多次模拟一个具复杂模型阶层的系统可能会耗费太多的时间。
Simulink提供一种加速大型模型参考阶层的模拟的方法,也就是于首次执行模拟时建立一组中间衍生的人造产物(artifacts)。对于大型的团队而言,共享及重复使用这些包含MEX档和其他二元档案的衍生档案(derived files)可能具有一定程度的挑战。
因此,团队成员频繁花费时间来重新建立和创造其他团队成员已经建立过的档案,耗费在这种多余的功夫和时间,其实可以运用在更有生产力的设计活动上。团队愈庞大、模型的复杂度愈高,问题也就愈大。
为了处理这样的问题,Simulink将这些衍生的人造产物封装,并储存于Simulink快取(cache)档案。本文将描述一个在典型的敏捷开发工作流程管理和分享Simulink快取档案的方法,其中会使用到Git来进行来源管控,以及Jenkins来进行持续整合(continuous integration;CI)。这种方法对系统模拟的加速有相当不错的效果。
Simulink快取
当在加速器、快速加速器、或模型参考加速模式进行模型模拟时,Simulink会将每一个模型的衍生档案依照层级打包至对应的Simulink快取档案(Simulink cache file;SLXC)。团队成员之间可以共享这些SLXC和对应的Simulink模型档。当某个团队成员在机器重新做了模拟,Simulink会从SLXC档为每一个模型撷取必要的衍生档。这样下来,Simulink不用去执行非必要的重建,模拟完成的速度也明显提升。
实际性能表现的改善仰赖于几个因素,像是层级之中的模型数量、模型参考重建设定、参考模型当中的模块数量、为每一个模型建立的衍生档案的大小和数量。在我们经由内含0-500个参考模型和1-10个阶层等级等各种模型的测试,我们看到了从2倍到超过34倍不等的改善程度(图1)。
图1 : 透过使用各种系统模型的Simulink快取档案所达成的性能改善 |
|
在包含了Jenkins CI系统的敏捷工作流程内分享和重复使用Simulink快取档的流程有三个阶段(图2):
一、将设计变更提交给Git
二、整合设计变更和将SLXC档案归档
-- Jenkins从Git拉出设计变更,并执行模拟来测试这些变更
-- Jenkins将Simulink快取档储存至Jenkins建置(build)档案资料库
三、进行设计变更与SLXC档的同步
-- 团队成员从Git以及从Jenkins建置档案资料库同步最新的设计变更
-- 团队成员使用这些快取档执行系统模拟
图2 : 重复使用带有来源管控和持续整合系统的Simulink快取档的典型工作流程。阴影区块描述了工作流程的三个阶段。 |
|
在更进一步看到这些阶段之前,我们先考量使用Simulink快取的要求与最佳实务。
分享和重复使用Simulink快取档的要求与最佳化实务
Simulink快取所包含的衍生档案会受到MATLAB版本、作业平台、及在模拟中使用的编译器的影响。为了要分享和重复使用这些档案,所有的团队成员必须使用相同的MATLAB版本、作业平台、和编译器。本文中使用的分别是MATLAB R2019a版本、Microsoft Windows、和Microsoft Visual C++ 2017。
以下最佳化实务可以透过重复使用共享的快取档案,让大型阶层模型模拟的加速更为容易:
‧ 依模型选择适合以元件为基础的建模准则来遵循(举例来说,在阶层当中的参考模型,通常应该包含超过500个模块以达成最佳的模拟表现)。
‧ 让每一个团队成员负责一个阶层的子集—通常会有几个Simulink模型构成一个元件,像是经过妥善定义的介面的控制器或受控体。这可以在合并设计变更时将问题最小化。
‧ 使用包含启动和停机程式脚本的专案,以确保所有团队成员处于一致的工作环境。启动脚本在专案开启时将环境初始化,而停机脚本则在专案结束时清除环境。
‧ 在加速器(Accelerator)模式下参考所有模型。在本地机器的参考模型除错时,则使用正常(Normal)模式。然而,这个模式并不提供和加速器模式相同的模拟表现益处。
‧ 设定每一个模型的重建(Rebuild)参数,以因应在已知的相依性下侦测到任何变动(图3),以及使用模型相依性(Model dependencies)参数来指定由使用者建立的相依性,这可以改善重建侦测的速度和准确度。
‧ 如果使用了平行运算工具箱(Parallel Computing Toolbox),选择Enable parallel model reference builds (图3)。这个模型参考阶层将自动地被平行建立。
‧ 决定是否要在每一次提交的时候执行Jenkins建置,或者在一天的特定时间执行,还是只有在需要的时候执行。所特定的要求将影响最佳运行时机,以及要选择使用以下哪一种建置:
o Sterile:在这个建置中,Jenkins的工作区域不会有人造产物或从之前的Jenkins建置留下来的档案。如果团队频繁地变更Simulink模型结构,则适合使用Sterile建置。比如在Simulink模型阶层需要的干净工作区域改变硬体设定。
o Incremental:在这个建置,先前Jenkins建置留下的人造产物都被保留下来。如果团队仅在个别元件做了些微的增值变更,就适合使用Incremental建置。
Sterile建置视模型阶层的大小不同,通常比起incremental建置需要更多的时间。
提交设计变更至Git
团队成员在这一个步骤当中变更模型、模拟模型阶层、执行Model Advisor检查、和执行单元测试。团队成员仅提交他们的设计档到来源管控系统,如Git。 Simulink快取档不应被提交至来源管控系统;他们是衍生的二进位档案,会占据大量的空间且不能被比对或合并。在Git储藏库,你可以配置一个.gitignore档案让Git忽略所有衍生人造产物,包含SLXC档案。
整合设计变更和SLXC归档
透过这篇文章,可以了解Jenkins与Simulink搭配使用的准则和配置技巧。
在以下范例,Jenkins管理者在Jenkins指定了Build指令。该指令开启MATLAB,为模拟加速的极大化建立快速加速器目标,并执行测试。图4为开启Simulink专案的指令,MyJenkinsProject和执行myBuildAndTest程式脚本。
图4 : Jenkins建置指令的说明,该指令开启了Simulink专案并执行myBuildAndTest程式脚本。这个程式脚本为系统建立了快速加速器目标,并且执行多次模拟来测试变更。 |
|
使用这组程式脚本,Jenkins为模型阶层建立了快速加速器目标:
simulink.blockdiagram.buildRapidaceleratortarget('型号');
这个指令建立了SLXC档,里面包含快速加速器与阶层当中所有模型的模型参考模拟目标。 Simulink将这些SLXC档储存在模拟快取资料夹。资料的位置是由Project Details 来指定(图5)。程式脚本接下来会执行多次模拟来测试设计变更。
图5 : Project Details对话框指定存放了SLXC档案的快取资料夹位置。默认设定为[project root]。 |
|
除此之外,管理者在Jenkins设置一个 Post-build Action 来将SLXC档归档(图6)。建置之后,Jenkins会从Jenkins工作区域将SLXC档复制到建置归档的位置。如果要指定Jenkins建置归档位置,管理者可以在Jenkins的home索引下编辑config.xml档。
图6 : 配置Jenkins建置後动作(post-build actions),在建置完成之後,将所有Simulink快取档从Jenkins工作区域归档到建置归档区域。 |
|
设计变更和SLXC档的同步
通常Jenkins建置是在晚上执行。团队中每一位成员接着准备将沙箱(sandbox)依上一次的成功建置来进行同步。团队成员从Git检查设计变更,从建置归档区域将关联的Simulink快取档回收,并在模拟之前将Simulink快取档放置在他们的模拟快取资料夹。团队可以设置一个脚本来自动化这些过程。比如,下列脚本概述了同步Simulink快取档的主要步骤:
图7 : 同步Simulink快取档的主要步骤概述 |
|
改善工作流程
有几种方法可以让工作流程更快、易错(error-prone)更少发生。例如可以使用资料库或是存放管理工具,更容易地从多个Jenkins建置管理SLXC档。若要让自动执行MATLAB和Simulink测试作为专案工作的一部分,可以使用MATLAB Plugin for Jenkins。最后,可以使用parsim执行多次系统模拟来测试各种输入参数值来进一步提升模拟的性能表现。
(作者Puneet Khetarpal、Marco Dragic任职于MathWorks公司:本文由钛思科技提供)