主要内容

使用命令行API更新或修复需求链接

此示例涵盖了一组标准情况,当一个或多个工件被移动或重命名后,设计工件和需求之间的链接变得陈旧。我们希望更新现有链接,而不是删除损坏的链接并创建新的链接,以便保留创建/修改历史和其他属性(描述、关键字、评论等)。演示了以下api的使用:

  • slreq.find获取Simulink Requ金宝appirements®条目和链接

  • 找到在给定的ReqSet中定位所需的条目

  • getLinks命令,查询LinkSet中所有出链路

  • 关于链接源的简要信息

  • 目的地关于链路目的地的简要信息

  • slreq。链接对于“as stored”目标信息,与“as resolved”目标信息不同Link.destination ()

  • slreq。链接Set当目标文档移动时更新链接目的地

  • slreq。ReqSet当源文档移动时更新先前导入的集合

  • updateFromDocument从更新后的文档中更新以前导入的引用

  • slreq。链接Set将现有的“直接连结”转换为“参考连结”

  • slreq.show用于查看给定对象的源端或目的端slreq。链接

在一些地方,我们也使用遗产rmi从退役SLVnV产品的需求管理接口(RMI)部分继承的api。

工程文件示例

在开始之前,通过运行确保一个干净的初始状态slreq.clear命令。然后输入slreqCCProjectStart打开巡航控制项目示例。这将把链接工件文件的集合解压缩到您的目录下的新子文件夹中MATLAB /项目文件夹中。

slreq.clear ();slreqCCProjectStart ();

金宝app链接到需求的Simulink模型

我们将关注这个项目的依赖关系图的一小部分:打开crs_plant.slx金宝appSimulink模型,该模型具有到外部Microsoft®Word文档的多个链接crs_reqs.docx

open_system (“crs_plant”);

导航其中一个链接以打开链接文档。

rmi (“视图”“crs_plant /状态”1);

Word文档打开到对应的部分:

下面是如何使用命令行api并检查来自的链接crs_plant.slxcrs_reqs.docx

linkSet = slreq.find(“类型”“LinkSet”“名字”“crs_plant”);links = linkSet.getLinks();disp (Word文档的原始链接:);
Word文档的原始链接:
i = 1:numel(links) linkTarget = links(i).getReferenceInfo();如果包含(linkTarget.artifact“crs_req.docx”) source = links(i).source;disp ([找到的链接strrep (getfullname ([bdroot source.id]),换行,...到crs_req.docx]);结束结束
找到链接从crs_plant/Vehicle1/vehiclespeed到crs_req.docx找到链接从crs_plant/throttDrv到crs_req.docx找到链接从crs_plant/status到crs_req.docx找到链接从crs_plant/throttleCC到crs_req.docx

存在导入引用时直接链接的导航

通过输入打开Sim金宝appulink需求编辑器slreq.editor在MATLAB命令行。您将看到加载了两个需求集:crs_req.slreqx而且crs_req_func_spec.slreqx.第一个需求集是导入的引用集合crs_req.docx,第二个是在Simulink Requirements Editor中手动创建的。金宝app如果您现在关闭Word文档并导航到相同的链接crs_plant /状态导入块时,相应的导入引用将在需求编辑器中突出显示,因为导航操作将在加载的导入需求集中找到匹配的引用。

你仍然可以使用在文件中显示按钮,在原始文档的上下文中查看链接的需求。

slreq.editor ();rmidotnet.MSWord.application (“杀”);rmi (“视图”“crs_plant /状态”1);

用例1:文档重命名后批量更新链接

假设收到了需求文档的更新版本,命名为crs_req_v2.docx.现在我们需要链接crs_plant.slx以更新文档的相应部分为目标。对于本例,我们将在相同的文件夹中复制原始文档,并修改名称。然后我们使用slreq。链接SetAPI批量更新给定的所有链接LinkSet要连接到较新的文档副本:

拷贝文件(fullfile (pwd,“文件/ crs_req.docx”), fullfile (pwd,“文件/ crs_req_v2.docx”));linkSet.updateDocUri (“crs_req.docx”“crs_req_v2.docx”);

验证匹配链路的更新

现在我们可以浏览相同的链接,并确认外部文档的适当版本已经打开。如果我们像以前一样迭代所有链接,这确认了所有4个链接都按预期更新:

rmi (“视图”“crs_plant /状态”1);%已更新的文档打开links = linkSet.getLinks();disp (更新后的Word文档链接:);
更新后的Word文档链接:
I = 1: number (links) source = links(I).source;linkTarget = links(i).getReferenceInfo();如果包含(linkTarget.artifact“crs_req.docx”)警告([“链接来自”source.id'仍然指向crs_req.docx']);%不应该发生elseif包含(linkTarget.artifact“crs_req_v2.docx”) disp ([找到的链接strrep (getfullname ([bdroot source.id]),换行,' '...到crs_req_v2.docx]);结束结束
found link from crs_plant/Vehicle1/vehicle speed to crs_req_v2.docx found link from crs_plant/throttDrv to crs_req_v2.docx found link from crs_plant/status to crs_req_v2.docx found link from crs_plant/throttleCC to crs_req_v2.docx

更新链接后导航到导入的引用

如上所示,当导入的引用在Requirements Editor中可用时,导航链接将选择匹配的引用对象。但是,我们刚刚更新了文档新版本的链接crs_req_v2.docx,并且此文档没有导入引用。在需求编辑器的存在下,从Simu金宝applink块的导航会将您直接带到外部Word文档。

为了避免这种不一致,我们需要更新先前导入的引用,以便与更新后的文档名称相关联。我们使用slreq。ReqSetAPI来完成这个任务。此外,因为更新的文档可能有修改的需求,我们必须使用updateFromDocumentAPI用于为存储在Simulink Requirements端的引用项拉入更新。金宝app完成此操作后,从Simulink模型导航将找到匹配的导入引用。金宝app

找到带有导入引用的需求集。更新源文件位置并找到顶级Import节点。

reqSet = slreq.find(“类型”“ReqSet”“名字”“crs_req”);reqSet.updateSrcFileLocation (“crs_req.docx”“crs_req_v2.docx”);importNode = request .find(“CustomId”“crs_req_v2”);

从源文件更新导入的引用。关闭Microsoft Word。然后,在需求编辑器中导航到更新的引用。

importNode.updateFromDocument ();rmidotnet.MSWord.application (“杀”);rmi (“视图”“crs_plant /状态”1);

用例1后的清理

放弃链接数据更改以避免项目关闭提示。关闭项目(同时清理MATLAB路径更改)。关闭Microsoft Word。

slreq.clear ();PRJ = 金宝appsimulinkproject();prj.close ();rmidotnet.MSWord.application (“杀”);

用例2:批量更新链接以完全依赖导入的引用

正如上面的用例1所演示的,当文档被移动或重命名时,需要额外的工作来维护到外部文档的“直接链接”。更好的工作流程是将现有的“直接链接”转换为“引用链接”,即指向导入的链接参考文献.slreqx文件,不再重复关于原始文档的位置或名称的信息。使用此选项时,外部源文档关联仅存储在承载导入引用的需求集中。

控件,从相同的初始点重新启动,以演示此工作流巡航控制模型的需求定义在一个新的子文件夹中。将Simulink金宝app模型复制到您的目录并打开它。

slreqCCProjectStart ();拷贝文件(fullfile (pwd,“文件/ crs_req.docx”), fullfile (pwd,“文件/ crs_req_v2.docx”));open_system (“crs_plant”);

找到crs_plant链路集和crs_req使用导入的引用的需求集。

linkSet = slreq.find(“类型”“LinkSet”“名字”“crs_plant”);reqSet = slreq.find(“类型”“ReqSet”“名字”“crs_req”);

然后我们使用slreq。链接SetAPI来更新所有的直接链接crs_plant.slmx.然后创建一个包含链接集中所有链接的数组。

linkSet.redirectLinksToImportedReqs (reqSet);links = linkSet.getLinks();

更新LinkSet通过这种方式,遍历所有链接以确认没有“直接”链接crs_req.docx文件。

disp (检查原始外部文件的链接);
检查原始外部文件的链接:
计数器= 0;i = 1:numel(links) linkTarget = links(i).getReferenceInfo();如果包含(linkTarget.artifact“crs_req.docx”) source = links(i).source;警告([“链接来自”source.id'仍然指向crs_req.docx']);计数器=计数器+ 1;结束结束disp ([“总数”num2str(柜台)“外部文档链接”]);
到外部文档的链接总数为0

从Simulink模型导航到更新的引金宝app用。

rmi (“视图”“crs_plant /状态”1);

链接到引用和外部文档重命名

现在,当所有链接都指向导入的References而不是指向外部文档时,只要Import节点更新为新的外部文档名称,文档重命名后可跟踪性数据将保持一致。就像在用例1中一样,我们将假设存在一个外部需求文档的更新版本,方法是用一个新名称重新保存我们的Word文档。然后,我们使用与之前相同的api对Import节点执行所需的更新。现在,因为链接依赖于导入的引用,并且不存储关于导入文档的信息,从Simulink模型导航到更新的引用,就像执行用例1的所有步骤之后一样。金宝app

Reference现在与已更新的外部文档相关联,[显示在文档中]按钮打开已更新(重命名)的文档,不需要在LinkSet端进行进一步调整。

找到带有导入引用的需求集。更新源文件位置并找到顶级Import节点。

reqSet = slreq.find(“类型”“ReqSet”“名字”“crs_req”);reqSet.updateSrcFileLocation (“crs_req.docx”“crs_req_v2.docx”);importNode = request .find(“CustomId”“crs_req_v2”);

从源文件更新导入的引用。然后,在需求编辑器中导航到更新的引用。

importNode.updateFromDocument ();
rmi (“视图”“crs_plant /状态”1);

用例2之后的清理

放弃链接数据更改以避免项目关闭提示。关闭项目(同时清理MATLAB路径更改)。关闭Microsoft Word。

slreq.clear ();PRJ = 金宝appsimulinkproject();prj.close ();rmidotnet.MSWord.application (“杀”);

用例3:将链接工件移动到新项目

现在假设我们正在分支一个具有链接工件的现有项目,并且我们需要创建一组新的具有所有可追溯性链接的工件,就像在原始项目中一样。和以前一样,我们将从巡航控制模型的需求定义并将“直接链接”转换为“引用链接”,就像我们在上面的用例2中所做的那样。然后,我们继续创建链接工件的“新版本”,方法保存每个链接工件_v2。的名字。

在创建了重命名的Simulink模型副本、导入的外部文档以及带有导金宝app入需求的需求集之后,存在一个问题:重命名的模型链接到原始需求集中的引用,而不是重命名的需求集中的引用。在细节窗格中,在链接时,链接似乎无法解决,因为没有加载原始模型。

打开巡航控制项目并打开crs_plant模型。找到的链接集crs_plant需求集crs_req

slreqCCProjectStart ();open_system (“模型/ crs_plant.slx”);linkSet = slreq.find(“类型”“LinkSet”“名字”“crs_plant”);reqSet = slreq.find(“类型”“ReqSet”“名字”“crs_req”);

将直接链接转换为引用链接。创建重命名的文件副本并保存它们。

linkSet.redirectLinksToImportedReqs (reqSet);mkdir (fullfile (pwd,“复制”));save_system (“crs_plant”fullfile (pwd,“复制/ crs_plant_v2.slx”));reqSet.save (fullfile (pwd,“复制/ crs_req_v2.slreqx”));拷贝文件(“文件/ crs_req.docx”“复制/ crs_req_v2.docx”);

将重命名的需求集与重命名的文档关联起来。找到顶级Import节点。

reqSet.updateSrcFileLocation (“crs_req.docx”fullfile (pwd,“复制/ crs_req_v2.docx”));importNode = request .find(“CustomId”“crs_req_v2”);

通过更新导入的References,确保重命名的需求集中的内容与重命名文档的内容相匹配。从重命名的Simulink模型导航到重命名的需求集中金宝app的项目。原始需求集中的旧项目被突出显示,这是不正确的。

importNode.updateFromDocument ();
rmi (“视图”“crs_plant_v2 /状态”1);

更新重命名源中的链接以使用重命名目的地作为目标

与用例1类似,我们可以使用LinkSet。updateDocUri(旧的,新的)API来更新链接crs_plant_v2.slmx使用重命名的需求集crs_req_v2.slreqx作为链接目标,而不是原始链接crs_req.slreqx.完成此操作后,再次从重命名模型中的块导航。重新命名的需求集中的需求将被选中,并且细节窗格下链接在右下方是已解决的问题。

找到模型的新副本的链接集,crs_plant_v2.更新与模型的新副本相链接的需求集的名称。从重命名的Simulink模型导航到重命名的需求集中金宝app的项目。这一次,它突出显示了正确的项目。

linkSet = slreq.find(“类型”“LinkSet”“名字”“crs_plant_v2”);linkSet.updateDocUri (“crs_req.slreqx”“crs_req_v2.slreqx”);
rmi (“视图”“crs_plant_v2 /状态”1);

用例3之后的清理

清除开放的需求集和链接集,并关闭开放的模型和项目,而不保存更改。关闭Microsoft Word。

slreq.clear ();bdclose (“所有”);PRJ = 金宝appsimulinkproject();prj.close ();rmidotnet.MSWord.application (“杀”);