1. 需求驱动的系统上下文建模
为什么上下文建模是需求验证的第一道关口
需求文档中大量约束并非描述系统内部行为,而是描述系统与外部环境之间的边界条件,例如“系统应接收来自操作员的启停指令”“系统应向维护终端输出诊断数据”“系统不得直接控制执行机构”。这些约束如果只停留在自然语言条目中,很难判断是否被完整覆盖。SysML内部块图(ibd)提供了把系统边界、外部参与者和接口一次性显式化的手段:系统本身作为一个块,外部参与者作为对端块,端口与连接器承载接口,需求则通过«satisfy»或«refine»关系挂接到对应端口或连接器上。
本例以一个简化的“环境监测站”为建模对象,完成三件事:定义系统边界与外部参与者、明确接口与交互关系、检查需求中上下文相关约束的覆盖情况。
建模对象与边界约定
系统命名为 EnvMonitorStation,其职责是采集环境参数并上报。边界之外识别出四类外部参与者:
Operator:操作员,下发启停与模式切换指令。SensorSuite:外部传感器组,向系统提供原始模拟量。MaintenanceTerminal:维护终端,接收诊断数据并下发校准命令。PowerGrid:外部供电,提供电能并反馈供电状态。
边界内只保留系统自身,不把传感器信号调理、通信模块等内部部件画入上下文图,否则边界会被稀释。上下文图的目标是“谁在系统外面、通过什么接口与系统交互”,而不是展开内部结构。
接口与交互关系定义
为每个外部参与者分配一个端口,端口类型用接口块表达,端口上标注方向与流属性:
| 端口 | 对端参与者 | 接口块 | 方向 | 主要流属性 |
|---|---|---|---|---|
| pCmd | Operator | ICmd | in | startStop:Boolean, mode:ModeKind |
| pRaw | SensorSuite | IRawSignal | in | rawValue:Real, channelId:Integer |
| pDiag | MaintenanceTerminal | IDiag | out | faultCode:Integer, calibCmd:CalibKind |
| pPwr | PowerGrid | IPower | inout | voltage:Real, powerState:PowerStateKind |
其中 pDiag 为双向端口:诊断数据向外输出,校准命令向内输入,因此接口块中同时包含 out 与 in 方向的流属性。方向约定统一采用“以系统为参照”:in 表示外部流向系统,out 表示系统流向外部,inout 表示双向。
需求覆盖检查
把需求中与上下文相关的约束逐条挂接到端口或连接器上,形成可检查的覆盖表:
| 需求编号 | 上下文约束 | 挂接对象 | 覆盖状态 |
|---|---|---|---|
| REQ-CTX-01 | 系统应接收操作员启停指令 | pCmd / ICmd | 已覆盖 |
| REQ-CTX-02 | 系统应接收外部传感器原始信号 | pRaw / IRawSignal | 已覆盖 |
| REQ-CTX-03 | 系统应向维护终端输出诊断数据 | pDiag / IDiag | 已覆盖 |
| REQ-CTX-04 | 系统应接收维护终端校准命令 | pDiag / IDiag | 已覆盖 |
| REQ-CTX-05 | 系统应监测外部供电状态 | pPwr / IPower | 已覆盖 |
| REQ-CTX-06 | 系统不得直接驱动执行机构 | — | 未覆盖(无对应端口) |
REQ-CTX-06 是一条否定性约束,它要求系统边界内不存在指向执行机构的端口。检查方法是:在上下文图中搜索是否存在类型为 IActuator 的端口或连接器。当前模型中不存在,因此该约束在结构上被满足,但需要显式记录“通过不存在性验证”,而不是留空。这正是上下文建模对需求验证的直接价值:把“不应该有什么”也变成可检查的结构事实。
覆盖验证的操作路径
在建模工具中执行以下检查,即可把上述表格变成可重复的验证动作:
- 在 ibd 中选中系统块,确认其所有端口均指向外部参与者,不存在指向内部部件的端口。
- 对每个端口,检查其类型是否为已定义的接口块,且接口块中的流属性方向与端口方向一致。
- 打开需求图,逐条查看上下文相关需求是否通过 «satisfy» 或 «refine» 连接到端口或连接器。
- 对否定性约束,检查边界内是否存在被禁止的端口类型;若不存在,记录“通过不存在性验证”。
- 若某条需求未挂接任何端口,标记为未覆盖,回到上下文图补充端口或修正需求表述。
可直接使用的上下文覆盖检查清单
| 检查项 | 通过条件 | 不通过时的处理 |
|---|---|---|
| 边界完整性 | 所有外部参与者均在边界外,所有内部实现均在边界内 | 重新划分块归属 |
| 端口方向一致性 | 端口方向与接口块流属性方向一致 | 修正端口或接口块方向 |
| 需求挂接率 | 每条上下文需求至少挂接一个端口或连接器 | 补充端口或修正需求 |
| 否定性约束 | 被禁止的端口类型在边界内不存在 | 移除违规端口或调整需求 |
| 接口块复用 | 同类交互使用同一接口块,无重复定义 | 合并重复接口块 |