主要内容

从跨模型共享的库子系统生成可重用代码

什么是可重用库子系统?

可重用库子系统是包含在配置为可重用的库中的子系统。您必须在库中定义一个子系统,并对其进行配置,以便跨模型重用子系统。

为了重用公共功能,你可以包括一个子系统的多个实例:

  • 在单个模型中,该模型是顶级模型或模型引用层次结构的一部分

  • 在模型引用层次结构中跨多个引用模型

  • 跨越包含模型块的多个顶级模型

  • 跨多个不包括模型块的顶级模型

代码生成器使用校验和来确定可重用性。在某些情况下,代码生成器不能重用子系统代码。

对于增量代码生成,如果可重用库子系统发生更改,则会重新构建自身及其父类。在构建过程中,如果没有找到匹配的函数,则将在共享实用程序文件夹中生成可重用函数的新实例。如果从以前的构建中找到了不同的匹配函数,则使用该函数,并且不会发出新的可重用函数。

对于后续构建,未使用的文件不会从文件夹中替换或删除。在模型开发期间,当共享实用程序文件夹中存在许多过时的共享功能时,您可以删除该文件夹并重新生成代码。如果可重用库子系统的所有实例都从模型引用层次结构中删除,并且您重新生成代码,那么过时的共享函数将保留在共享实用程序文件夹中,直到您删除它们。

如果一个模型发生变化,这样的变化可能会导致子系统生成不同的代码,那么就会生成一个新的可重用功能。例如,修改代码注释的模型配置参数可能会导致子系统生成不同的代码,即使可重用库子系统没有改变。

嵌入式编码器用户可以从包含配置为可重用的子系统的库中生成代码。有关更多信息,请参见基于库的可重用库子系统代码生成

可重用库子系统代码放置和命名

可重用库子系统生成的代码独立于模型生成的代码。可重用库子系统的代码生成到共享实用程序文件夹中,slprj /目标/ _sharedutils,而不是模型引用层次结构文件夹。为支持类型生成的代码,这些代码生成到万博1manbetx。h文件,也在共享实用程序文件夹中。

为了实现唯一命名,可重用函数名在可重用库子系统名称后附加了一个校验和。例如,子系统的代码和文件,魔法石,第1章,它连接到一个可重用的库子系统,RLS,可能是:

  • 函数名:RLS_mgdjlngd

  • 文件名称:RLS_mgdjlnd.cRLS_mgdjlnd.h

要配置一个可重用的库子系统,请设置如下所列的子系统参数:

  • 选择作为一个原子单位来对待

  • 代码生成标签:

    • 函数包装可重用的功能

    • 设置函数名选项文件名选项基于该表的参数。此表总结了代码生成器如何生成代码,并突出显示了文件名选项用粗体显示,使您能够从可重用的库子系统生成代码。出于该表的目的,假设命名了子系统块mySubsystem文件名称的值用户指定的选择是myFunction

      功能名称选项 文件名选项 生成文件夹位置 生成函数名称 生成的文件名
      汽车 汽车 / slprj /目标/ _sharedutils mySubsystem_校验和 mySubsystem_校验和。cmySubsystem_校验和。h
      使用子系统名称 / slprj /目标/ _sharedutils mySubsystem_校验和 mySubsystem_校验和。cmySubsystem_校验和。h
      使用函数名 / slprj /目标/ _sharedutils mySubsystem_校验和 mySubsystem_校验和。cmySubsystem_校验和。h
      用户指定的 model_target_rtw 模型_Subsystem myFile.h
      使用子系统名称 汽车 model_target_rtw 模型_Subsystem 生成的代码包含在模型。h
      使用子系统名称 / slprj /目标/ _sharedutils mySubsystem_校验和 mySubsystem_校验和。cmySubsystem_校验和。h
      使用函数名 / slprj /目标/ _sharedutils mySubsystem_校验和 mySubsystem_校验和。cmySubsystem_校验和。h
      用户指定的 model_target_rtw 模型_Subsystem myFile.h
      用户指定的 汽车(该规范只支持模型中子系统的一个唯一实例。)万博1manbetx / slprj /目标/ _sharedutils myFunction myFunction.c, myFunction.h
      使用子系统名称 model_target_rtw myFunction mySubsystem.c, mySubsystem.h
      使用函数名(该规范只支持模型中子系统的一个唯一实例。)万博1manbetx / slprj /目标/ _sharedutils myFunction myFunction.c, myFunction.h
      用户指定的(如果用户指定的函数名和文件名相同,并且只适用万博1manbetx于模型中子系统的一个唯一实例,则支持此规范。) / slprj /目标/ _sharedutils myFunction myFunction.c, myFunction.h

有关子系统块参数的更多信息,请参见子系统

配置包含可重用库子系统的模型

对于使用可重用库子系统的模型,您必须根据模型是参考模型还是顶级模型对模型进行不同的配置。如果子系统处于引用模型层次结构中,则设置配置参数,共享代码放置汽车。否则,对于使用子系统的每个模型,设置模型配置参数共享代码放置共享位置

如果可重用的库子系统使用共享的本地数据存储,并且您为模型数据元素配置默认映射,则为类别保留默认的存储类映射共享本地数据存储设置为默认的

在模型引用层次结构中,如果可重用库子系统的实例位于顶级模型中,则在模型参考,则必须选择按值传递固定大小的标量根输入以用于代码生成参数。如果不选择该参数,则会为顶层模型中的可重用库子系统实例生成一个单独的共享函数,并为引用模型中的实例生成一个可重用函数。

如果可重用的库子系统连接到根输出端口,则重用不会发生在未连接到根输出端口的相同子系统上。但是,您可以设置将可重用系统输出传递为个人观点优化窗格,以确保在这些子系统之间发生重用。此参数需要嵌入式编码器®许可证。

有关创建库的详细信息,请参见自定义库。有关创建可重用库子系统的示例,请参见为跨模型共享的子系统生成可重用代码

为跨模型共享的子系统生成可重用代码

这个例子展示了如何配置一个可重用的库子系统,并为跨引用模型共享的子系统生成一个可重用的函数。结果是子系统的可重用代码,生成到共享实用程序文件夹(slprj /目标/ _sharedutils).

创建一个可重用的库子系统。

  1. 在Simuli万博1manbetxnk编辑器中,在模拟选项卡上,选择新的>库。选择空白的图书馆从Simulink万博1manbetx开始页窗口。开放rtwdemo_ssreuse复制和粘贴子系统魔法石,第1章进入图书馆编辑器。该操作加载变量魔法石,第1章到基本工作区。将子系统块重命名为RLS

  2. 点击子系统模块并按下Ctrl + U查询子系统的内容RLS

  3. 要配置子系统,请在Library编辑器中右键单击RLS。在上下文菜单中,选择块参数(子系统)。在“子系统参数”对话框中,选择如下选项:

    • 选择作为一个原子单位来对待

    • 代码生成标签:

      • 函数包装可重用的功能

      • 函数名选项用户指定的并验证函数名设为myfun

      • 文件名选项汽车

  4. 点击应用好吧

  5. 将可重用库保存为ssreuselib,它会创建一个文件,ssreuselib.slx

创建示例模型。

  1. 的实例创建一个模型RLSssreuselib。命名这个子系统魔法石,第1章。添加另一个子系统并命名它SS2。命名模型ex_model1

  2. 的实例创建另一个模型RLSssreuselib。命名这个子系统魔法石,第1章。添加另一个子系统并命名它SS3。命名模型ex_model2

  3. 创建一个包含两个模型块的顶级模型ex_model1ex_model2。保存顶部模型为ex_mdlref_ssreuse

设置top model的配置参数。

  1. 与模型ex_mdlref_ssreuse打开Simulink万博1manbetx®编辑,在C代码选项卡上,单击设置,打开“配置参数”对话框。

  2. 解算器窗格中,指定类型作为固定步

  3. 模型参考窗格中,单击省略号可查看高级参数。然后,选择按值传递固定大小的标量根输入以用于代码生成

  4. 代码生成>报告窗格中,选择创建代码生成报告自动打开报告

  5. 代码生成>接口窗格中,设置共享代码放置共享位置

  6. 代码生成>标识符窗格中,设置最大标识符长度256。此步骤为可选步骤。

  7. 点击应用好吧

创建并传播配置引用。

  1. 在Simuli万博1manbetxnk编辑器中,在建模选项卡上,单击模型浏览器打开模型资源管理器。在模型资源管理器的左侧导航列中,展开ex_mdlref_ssreuse节点。

  2. 选项下面的Configurations节点ex_mdlref_ssreuse节点。在内容窗格中,右键单击配置并选择转换为配置参考

  3. 在“将活动配置转换为引用”对话框中,单击好吧。此操作将模型配置集转换为配置引用,万博1manbetx仿真软件。ConfigSetRef,并创建配置引用对象,configSetObj,在基本工作区中。

  4. 在左侧导航列中,右键单击引用(主动)并选择传播到引用模型

  5. 在配置引用传播到引用模型对话框中,选择列表中的引用模型。点击传播

现在,顶级模型和参考模型使用相同的配置参考,引用(主动),它指向模型配置引用对象,configSetObj,在基本工作区中。保存模型时,还需要导出configSetObj到mat文件。

生成并查看代码。

  1. 要生成代码,在Simulink编辑器中,按万博1manbetxCtrl + B。生成代码后,将打开代码生成报告。

  2. 要查看引用模型的代码生成报告,请在左侧导航窗格中的引用模型部分中,选择ex_model1。代码生成报告显示为的生成的文件ex_model1

  3. 在左侧导航窗格中展开共享文件。代码生成器使用可重用库子系统名称。子系统代码魔法石,第1章是在myfun.cmyfun.h

  4. 点击回来然后导航到ex_model2代码生成报告。ex_model2使用相同的源代码,myfun.cmyfun.h的代码ex_model1。您的子系统函数和文件名将不同。

相关的话题