1. 项目概述为什么我们需要自定义需求链接类型在基于模型的系统工程MBSE和复杂产品研发领域尤其是在使用Simulink、Stateflow等工具进行建模与仿真时需求管理是确保设计正确性的基石。我们经常使用需求管理工具如IBM DOORS、Jama Connect等来管理文本需求并通过需求模型互操作性RMI或类似机制将Simulink模型中的设计元素如模块、信号线、状态与上游需求条目关联起来。系统自带的“实现”、“验证”等标准链接类型在大多数情况下是够用的。但当你遇到更精细化的管理场景时标准类型就显得力不从心了。举个例子你的团队可能希望区分一个Simulink模块是“部分实现”了某个需求还是“优化实现”了它或者你可能需要标记某个需求变更后哪些模型元素受到了“影响”但尚未修改。这时一个名为“影响分析”或“衍生设计”的自定义链接类型就能提供更精确的追溯信息。自定义需求链接类型的核心价值就在于它允许你将模型与需求之间的抽象关系具体化为符合你团队特定流程和语义的纽带。这不仅仅是技术配置更是一种流程定制能让需求追溯矩阵更具洞察力让验证与确认VV工作更加有的放矢。本文将深入探讨在Simulink环境中创建和使用自定义需求链接类型的完整流程。我会从设计思路讲起带你理解背后的“为什么”然后一步步拆解实现细节包括如何定义链接类型、如何将其集成到Simulink的需求工具栏中、以及如何通过脚本进行批量操作。最后我会分享几个在实际项目中踩过的坑和总结出的高效技巧。无论你是系统工程师、软件架构师还是VV工程师只要你的工作涉及将Simulink模型与结构化需求关联这篇文章都能为你提供一套可直接落地的解决方案。2. 核心概念与设计思路拆解在动手之前我们必须厘清几个关键概念并想清楚我们到底要设计一个什么样的链接类型。这决定了后续所有配置工作的方向和边界。2.1 理解Simulink需求链接的底层机制Simulink的需求链接功能本质上是在模型元素对象和外部需求源如DOORS中的需求条目之间建立一种有类型的、可查询的关系。这个关系通常存储在模型的.slmx文件或独立的.req文件中。每个链接都包含几个核心属性源对象Simulink中的模块、信号线、注释或模型本身。目标需求外部需求管理工具中某个需求的唯一标识符如DOORS ID。链接类型定义了这个关系的语义例如implements实现、verifies验证、derives衍生等。描述与自定义属性可以为链接添加自由文本描述或者如果我们定义了自定义链接类型还可以为其添加特定的属性字段。标准链接类型是硬编码在Simulink环境中的。而自定义链接类型则是通过扩展这个体系引入我们自己的“关系语义”和“属性集”。这就像是在标准的“人际关系”如朋友、同事之外定义了一种新的关系“项目搭档”并且规定这种关系必须记录“合作项目名称”和“开始日期”两个属性。2.2 定义自定义链接类型的目标与场景创建自定义类型不是目的解决实际问题才是。在开始前请先明确你的应用场景。以下是我在项目中遇到的几个典型场景它们催生了不同的自定义链接类型场景一精细化设计状态跟踪问题一个高层的系统需求被分解为多个子需求并分配给不同的子系统模型。设计过程中某些子系统可能已完全实现某些还在设计中某些则因为架构调整被标记为“暂缓”。自定义类型详细设计。我们可以为其添加属性设计状态 其值域为[“未开始”, “进行中”, “已完成”, “已评审”, “暂缓”]。这样通过过滤链接类型和状态项目经理可以一目了然地看到整个系统的设计进展而不仅仅是“有没有链接”。场景二变更影响范围标识问题当某个底层需求发生变更时我们需要快速识别出模型中所有直接或间接受其影响的元素以便评估变更工作量。标准链接无法区分“直接实现”和“可能受影响”。自定义类型影响于或依赖于。这个链接本身不表示实现关系而是一种依赖标记。配合脚本可以快速生成变更影响链极大提升变更控制流程的效率。场景三多维度验证追溯问题一个模型元素如一个算法模块可能通过单元测试、集成测试和系统测试等多个层级来验证其满足的需求。使用单一的verifies链接无法区分验证的层级和类型。自定义类型单元验证、集成验证、系统验证。甚至可以为其添加属性测试用例ID或验证方法如“仿真”、“形式化验证”。设计思路的核心你的自定义链接类型应该是一个名词或动名词短语能够清晰、无歧义地描述模型元素与需求之间的一种特定、可重复的关系。避免使用过于宽泛或与标准类型语义重叠的词汇。2.3 方案选型基于文件 vs. 基于项目Simulink提供了两种主要方式来管理自定义需求链接定义基于需求定义文件.sldd 或 .req将自定义链接类型的定义保存在一个独立的文件如CustomLinkTypes.req中。这种方式灵活便于在不同项目间共享和复用。你需要手动或通过脚本将该文件与模型关联。基于Simulink项目.prj如果你使用Simulink Projects来管理工程可以将自定义链接类型的定义集成到项目配置中。这种方式管理更集中与项目生命周期绑定更紧密。对于大多数团队协作和希望定义可复用的场景我强烈推荐基于需求定义文件的方式。它的好处是独立性定义文件可以放入版本控制系统如Git独立于任何具体模型进行管理和迭代。可复用性同一个定义文件可以被多个模型或项目引用保证全组织内链接类型语义的一致性。灵活性可以随时创建新的定义文件用于不同的产品线或流程阶段。基于项目的配置更适合小型、临时的探索或在项目内部进行快速原型设计。在接下来的实操中我们将以基于需求定义文件的方式为主线。3. 创建自定义链接类型的详细步骤理论清晰后我们进入实战环节。整个过程可以分为四个阶段定义、集成、应用和管理。3.1 第一阶段定义链接类型规范这是最核心的一步我们需要创建一个结构化的文件来定义我们的新链接类型。虽然Simulink没有提供图形化界面直接创建这个文件但我们可以通过操作一个已有模型的需求链接设置来“导出”模板或者直接编写一个简单的XML/结构体文件。这里介绍最可靠的手动创建方法。我们计划创建一个名为详细设计的链接类型并为其添加两个自定义属性设计状态枚举型和负责人字符串型。创建需求定义文件 在项目根目录下创建一个新的文本文件命名为CustomRequirementsSpecification.req。.req是Simulink认可的需求规范文件扩展名。编写定义内容 用文本编辑器打开该文件输入以下内容。这个结构模仿了Simulink内部处理链接类型定义的方式。?xml version1.0 encodingUTF-8? RequirementTypes xmlnshttp://www.mathworks.com/requirements/types CustomLinkType name详细设计 displayName详细设计 Description此链接用于标记模型元素与详细设计说明书或底层设计需求之间的对应关系。/Description CustomAttributes Attribute nameDesignStatus displayName设计状态 typeenum Description当前设计任务的进展状态。/Description EnumValues EnumValue valuenot_started displayName未开始/ EnumValue valuein_progress displayName进行中/ EnumValue valuecompleted displayName已完成/ EnumValue valueunder_review displayName已评审/ EnumValue valuedeferred displayName暂缓/ /EnumValues /Attribute Attribute nameOwner displayName负责人 typestring Description负责此详细设计任务的工程师。/Description /Attribute /CustomAttributes /CustomLinkType !-- 可以在此处继续定义其他CustomLinkType -- /RequirementTypes关键字段解释name: 链接类型的内部标识符建议使用英文且无空格用于编程接口如API调用。displayName: 在Simulink需求工具栏、属性对话框等图形界面中显示的名称使用中文更友好。typeof Attribute: 支持string字符串、enum枚举、integer整数、double浮点数等基本类型。枚举类型最适合状态跟踪。EnumValues: 为枚举类型定义所有可能的取值及其显示名称。注意XML结构必须正确特别是命名空间xmlnshttp://www.mathworks.com/requirements/types。一个格式错误或标签不匹配的文件将无法被Simulink正确加载。3.2 第二阶段将定义集成到Simulink环境定义好文件后需要让Simulink知道它的存在。有两种主要方式方法一通过模型需求设置关联推荐用于具体模型这是最直接的方式将定义文件与特定模型绑定。打开你的Simulink模型。在“需求”功能区选项卡中点击“设置”按钮通常是一个齿轮图标。在弹出的“需求设置”对话框中找到“需求规范”或“定义文件”相关的部分。点击“添加”或“浏览” 然后选择你刚才创建的CustomRequirementsSpecification.req文件。点击“应用”并“确定”。完成此操作后关闭并重新打开模型的需求工具栏或重启MATLAB新的链接类型应该就会出现。方法二通过Simulink路径或项目启动脚本加载用于全局或项目级设置如果你希望多个模型都能使用这个定义可以将其所在目录添加到MATLAB路径或者在你的startup.m文件或Simulink Project的project_startup.m文件中编写代码来动态加载。这种方式更自动化但需要一些脚本知识。% 示例在 startup.m 中加载自定义需求定义 customReqFile fullfile(pwd, ‘Requirements’, ‘CustomRequirementsSpecification.req’); if exist(customReqFile, ‘file’) % 注意没有直接的load函数通常是通过关联到模型或项目来生效。 % 更常见的做法是设置一个全局变量或路径供后续脚本使用。 addpath(fileparts(customReqFile)); disp(‘自定义需求定义文件路径已添加。’); end实际上更稳健的项目级做法是在Simulink Project中将.req文件作为项目资源管理并在项目启动时确保所有模型的需求设置都指向这个共享文件。3.3 第三阶段在模型中使用自定义链接集成成功后你就可以像使用标准链接类型一样使用它了。通过需求工具栏创建链接在Simulink编辑器中选中一个模块例如一个Subsystem。在“需求”选项卡中点击“链接”。在弹出的“创建需求链接”对话框中你会看到“链接类型”下拉菜单。除了原有的实现、验证等现在应该出现了“详细设计”。选择“详细设计” 然后在“目标”字段输入你的需求标识符例如DS-001: 控制算法输入接口定义。点击“创建”。这时一个使用新类型的链接就建立了并且模块上会出现对应的链接图标可能与标准图标不同取决于主题。查看与编辑自定义属性创建链接后右键点击该模块选择“需求”-“属性” 或者在“需求”工具栏中点击“管理链接”。在打开的“需求链接”浏览器或对话框中找到刚才创建的链接。选中该链接下方的属性面板中除了常规的描述字段你现在应该能看到我们定义的两个属性“设计状态”下拉菜单和“负责人”文本框。在这里你可以为这个特定的链接设置状态为“进行中” 并填写负责人姓名。利用属性进行过滤和报告这是自定义链接价值的体现。在“需求”工具栏中使用“跟踪”或“报告”功能。你可以设置过滤器例如“显示所有链接类型为‘详细设计’且‘设计状态’不等于‘已完成’的模型元素”。这样你就能快速生成一个“未完成详细设计任务”的清单极大地辅助了项目管理。3.4 第四阶段通过API进行批量操作与管理对于大型模型手动点击创建和更新链接效率太低。Simulink Requirements 提供了丰富的MATLAB API如rmi,slreq.*系列函数允许我们通过脚本自动化这些操作。示例脚本为所有名为‘Controller_*’的模块添加同一个详细设计链接% 假设我们已经有了一个自定义链接类型 ‘详细设计’ 并且模型已加载 modelName ‘myProduct.slx’; open_system(modelName); % 目标需求标识符 targetReq ‘DS-100: 核心控制器算法总览’; % 找到所有名称以‘Controller_’开头的模块 allBlocks find_system(modelName, ‘Regexp’, ‘on’, ‘BlockType’, ‘SubSystem’, ‘Name’, ‘^Controller_’); % 更精确的查找可以使用其他属性 for i 1:length(allBlocks) blockPath allBlocks{i}; % 使用 slreq.createLink 创建链接 % 注意需要指定自定义链接类型。标准类型如‘implement’可以直接用字符串。 % 对于自定义类型可能需要使用其内部名称如 ‘DetailedDesign’或通过其他方式获取类型对象。 % 这里假设我们通过 slreq.getLinkType 来获取 customLinkTypeObj slreq.getLinkType(‘DetailedDesign’); % 使用内部名称 if ~isempty(customLinkTypeObj) link slreq.createLink(blockPath, targetReq, customLinkTypeObj); % 设置自定义属性 if ~isempty(link) % 方法一通过 Data 属性直接设置 (取决于API版本和实现) % link.Data.CustomAttributes.DesignStatus ‘in_progress’; % link.Data.CustomAttributes.Owner ‘张三’; % 方法二使用 setCustomAttribute 方法如果可用 % 更通用的方法是先获取需求项再操作 reqItem slreq.getReqs(blockPath, ‘LinkType’, ‘DetailedDesign’); if ~isempty(reqItem) % 此处操作依赖于具体的API可能需要探索 % 例如更新链接的描述或自定义数据字段 slreq.set(link, ‘Description’, ‘由脚本自动创建’); % 对于自定义属性可能需要通过底层rmi命令或操作slreq.DataModel end end else warning(‘未找到自定义链接类型“DetailedDesign”请检查定义文件是否已正确加载。’); end end save_system(modelName); disp([‘已完成对 ‘, num2str(length(allBlocks)), ‘ 个模块的链接添加。’]);重要提示Simulink Requirements API在不同版本间可能有变化尤其是对自定义属性操作的接口。上述脚本中的属性设置部分可能需要根据你使用的MATLAB版本进行调整。最可靠的方法是查阅对应版本的官方文档doc slreq并重点查看slreq.CustomAttribute相关的类和方法。在编写关键脚本前务必先在小模型上测试通过。4. 高级应用与集成策略自定义链接类型的力量不仅在于其本身更在于它如何融入你整体的研发流程和工具链。4.1 与需求管理工具如DOORS, Jama深度集成如果你的需求存储在IBM DOORS或Jama Connect中自定义链接类型可以映射到这些工具中的自定义链接模块或属性上。这通常需要在Simulink端和需求管理工具端进行对称配置。思路在DOORS中创建一个新的链接模块Link Module例如DetailedDesign 并定义对应的属性字段DesignStatus和Owner。然后在Simulink的RMI需求管理接口配置中建立从Simulink自定义链接类型到DOORS这个链接模块的映射。好处实现双向同步。在Simulink中更新的链接状态和属性可以同步回DOORS反之亦然。这使得需求管理工具成为唯一的真实来源Single Source of TruthSimulink模型作为其丰富的“客户端视图”。挑战配置相对复杂需要同时熟悉Simulink RMI和需求管理工具的管理功能。通常需要团队的管理员权限。4.2 生成定制化的需求追溯报告与仪表盘利用自定义链接类型及其属性你可以生成远超标准模板的追溯报告。使用slreq.generateReport 你可以编写MATLAB脚本调用此函数并指定复杂的过滤和分组条件。例如生成一个按“负责人”分组的报告列出每个负责人名下所有“设计状态”为“进行中”的链接并统计数量。集成到Simulink Dashboard 虽然不能直接显示需求链接但你可以编写一个MATLAB函数实时查询模型中特定自定义链接的状态例如统计“未开始”和“进行中”的数量然后将这个函数的输出连接到一个Simulink Dashboard的显示模块如“仪表”或“指示灯”。这样在模型顶层就能看到一个直观的设计进度仪表盘。导出至Excel或数据库进行进一步分析 使用slreq.get或rmi(‘get’, modelName)获取所有链接数据然后利用MATLAB强大的数据处理能力将其整理成结构化的表格并写入Excel或数据库。这为使用BI工具如Tableau, Power BI进行更高级的项目分析和可视化提供了可能。4.3 在版本控制中管理链接定义文件CustomRequirementsSpecification.req文件是你的重要资产必须纳入版本控制如Git。最佳实践将其放在项目仓库中一个独立的、清晰的目录下例如/config/requirements/。在文件头部或附带的README.txt中详细记录每个自定义链接类型的定义目的、属性含义以及枚举值的解释。对文件的任何修改如新增链接类型、修改枚举值都应提交代码审查因为这会影响到所有使用该定义的模型。考虑使用语义化版本号来管理定义文件本身例如v1.0.0 并在文件中注明版本和修改历史。合并冲突处理 由于.req是XML文件当多个分支同时修改它时可能会产生合并冲突。团队需要约定修改流程或者考虑将不同的自定义类型拆分到不同的.req文件中以降低冲突概率。5. 常见问题、故障排查与实操心得即使按照步骤操作你也可能会遇到一些问题。下面是我在实践中总结的一些常见坑点和解决思路。5.1 自定义链接类型未在工具栏中显示这是最常见的问题。检查1定义文件是否已正确关联重新进入模型的“需求设置”确认CustomRequirementsSpecification.req文件已出现在列表中且路径正确。尝试移除后重新添加。检查2文件格式是否正确用文本编辑器打开.req文件检查XML格式是否良好标签闭合、命名空间正确。一个快速验证的方法是尝试在MATLAB命令窗口用xmlread函数读取它看是否报错。检查3Simulink是否已刷新关联定义文件后尝试关闭并重新打开“需求”工具栏或者关闭所有模型并重启MATLAB。有时UI缓存需要刷新。检查4用户权限与文件位置确保MATLAB进程有权限读取该文件。如果文件位于网络驱动器有时会因为权限或延迟问题导致加载失败。尽量将其放在本地或受信任的项目路径内。5.2 通过API无法找到或操作自定义链接类型脚本运行时提示找不到自定义类型。确保环境已加载在运行脚本前先确保目标模型已经打开并且该模型已经关联了自定义需求定义文件。脚本运行的环境当前工作区需要能访问到该定义。使用正确的内部名称在API如slreq.getLinkType中需要使用链接类型的name属性通常是英文标识符而不是displayName中文显示名。在我们的例子中应使用‘DetailedDesign’。查阅具体版本的API不同版本的Simulink Requirements API可能有差异。使用doc slreq.getLinkType查看当前版本的确切用法。如果函数不存在或用法不同可以尝试使用更底层的rmi(‘getLinkTypes’, modelName)来列出所有可用链接类型看看你的自定义类型是否在其中以及它的内部标识符到底是什么。5.3 自定义属性在UI中不显示或无法编辑创建了链接但属性面板是空的。确认定义无误检查.req文件中CustomAttributes部分语法是否正确type定义是否被支持。检查链接创建方式确保你是通过选择了“详细设计”这个类型创建的链接而不是先创建一个标准类型的链接再试图去修改其类型这通常不行。属性值保存问题在UI中编辑了属性值后记得点击“应用”或“确定”。有时属性值可能没有立即保存到模型文件。保存模型CtrlS是最终确保数据持久化的操作。5.4 性能考虑与最佳实践当模型中有成千上万个需求链接时性能可能成为问题。精简属性只为真正需要的链接类型添加自定义属性。每个属性都会增加存储和加载的开销。避免定义过多或过于复杂的属性如嵌套结构。慎用实时同步如果与外部需求工具如DOORS设置了实时同步大量自定义链接的频繁更新可能会带来性能瓶颈。考虑调整为手动同步或定时同步。模型架构优化将需求链接尽可能放在较高的架构层级如子系统层面而不是每个原子模块都链接。这既能减少链接数量也更符合需求追溯的逻辑高层需求对应高层设计。5.5 我的实操心得始于流程终于工具在动手配置之前一定要和团队系统工程师、软件工程师、项目经理一起明确这个新的链接类型要支持什么样的工作流程谁负责创建和更新它它产出什么价值没有流程支撑的自定义类型最终一定会被废弃。保持一致性为自定义链接类型和其枚举值建立一份团队共享的“数据字典”或术语表。确保所有人对“进行中”、“已评审”等状态的理解是一致的。试点先行不要一开始就在全公司或大项目推广。选择一个有代表性的子系统或一个小型试点项目先用起来跑通整个流程创建-使用-报告-迭代收集反馈完善后再推广。文档至关重要将CustomRequirementsSpecification.req文件以及如何使用它的方法包括手动和脚本方式写入团队的技术规范或Wiki中。这能极大降低新成员的入门成本也是知识传承的关键。拥抱脚本化对于重复性的链接操作尽早投入时间编写和调试脚本。从长远看自动化节省的时间远大于初期投入。可以将常用脚本封装成函数放在团队共享的工具箱里。自定义需求链接类型是一个强大的“元工具”它让你能够塑造符合自身研发习惯的需求追溯体系。它开始可能只是一两个简单的状态标记但随着团队熟练度的提升你可以基于它构建出非常精细化的设计状态看板、自动化合规检查脚本乃至与项目管理系统如Jira集成真正实现模型驱动研发的闭环管理。关键在于从一个小而具体的痛点开始逐步迭代让工具为流程服务而不是相反。