1. 需求驱动的系统上下文建模

需求驱动的系统上下文建模 学习卡片

为什么上下文建模是需求验证的第一道关口

需求文档中大量约束并非描述系统内部行为,而是描述系统与外部环境之间的边界条件,例如“系统应接收来自操作员的启停指令”“系统应向维护终端输出诊断数据”“系统不得直接控制执行机构”。这些约束如果只停留在自然语言条目中,很难判断是否被完整覆盖。SysML内部块图(ibd)提供了把系统边界、外部参与者和接口一次性显式化的手段:系统本身作为一个块,外部参与者作为对端块,端口与连接器承载接口,需求则通过«satisfy»或«refine»关系挂接到对应端口或连接器上。

本例以一个简化的“环境监测站”为建模对象,完成三件事:定义系统边界与外部参与者、明确接口与交互关系、检查需求中上下文相关约束的覆盖情况。

建模对象与边界约定

系统命名为 EnvMonitorStation,其职责是采集环境参数并上报。边界之外识别出四类外部参与者:

  • Operator:操作员,下发启停与模式切换指令。
  • SensorSuite:外部传感器组,向系统提供原始模拟量。
  • MaintenanceTerminal:维护终端,接收诊断数据并下发校准命令。
  • PowerGrid:外部供电,提供电能并反馈供电状态。

边界内只保留系统自身,不把传感器信号调理、通信模块等内部部件画入上下文图,否则边界会被稀释。上下文图的目标是“谁在系统外面、通过什么接口与系统交互”,而不是展开内部结构。

接口与交互关系定义

为每个外部参与者分配一个端口,端口类型用接口块表达,端口上标注方向与流属性:

端口对端参与者接口块方向主要流属性
pCmdOperatorICmdinstartStop:Boolean, mode:ModeKind
pRawSensorSuiteIRawSignalinrawValue:Real, channelId:Integer
pDiagMaintenanceTerminalIDiagoutfaultCode:Integer, calibCmd:CalibKind
pPwrPowerGridIPowerinoutvoltage: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 的端口或连接器。当前模型中不存在,因此该约束在结构上被满足,但需要显式记录“通过不存在性验证”,而不是留空。这正是上下文建模对需求验证的直接价值:把“不应该有什么”也变成可检查的结构事实。

常见错误:把外部参与者画成系统内部部件,或把内部信号调理模块画成外部参与者。判断标准是——该对象是否由本系统负责实现。由本系统实现的一律在边界内,不由本系统实现的一律在边界外。
EnvMonitorStation 系统上下文(ibd) «block» EnvMonitorStation 系统边界 pCmd pRaw pDiag pPwr Operator 操作员 SensorSuite 外部传感器组 MaintenanceTerminal 维护终端 PowerGrid 外部供电 ICmd (in) IRawSignal (in) IDiag (out/in) IPower (inout) 需求覆盖检查 ✓ REQ-CTX-01 ~ 05:已挂接到对应端口与接口块 ✓ REQ-CTX-06:边界内无 IActuator 端口,通过不存在性验证 ✗ 未覆盖项:无(当前上下文约束全部可检查)

覆盖验证的操作路径

在建模工具中执行以下检查,即可把上述表格变成可重复的验证动作:

  1. 在 ibd 中选中系统块,确认其所有端口均指向外部参与者,不存在指向内部部件的端口。
  2. 对每个端口,检查其类型是否为已定义的接口块,且接口块中的流属性方向与端口方向一致。
  3. 打开需求图,逐条查看上下文相关需求是否通过 «satisfy» 或 «refine» 连接到端口或连接器。
  4. 对否定性约束,检查边界内是否存在被禁止的端口类型;若不存在,记录“通过不存在性验证”。
  5. 若某条需求未挂接任何端口,标记为未覆盖,回到上下文图补充端口或修正需求表述。
上下文图不是一次画完就固定的。当需求新增外部交互时,先判断该交互是否改变系统边界:若引入新的外部参与者,则新增端口与接口块;若只是已有接口的属性变化,则修改接口块中的流属性,不改变拓扑。

可直接使用的上下文覆盖检查清单

检查项通过条件不通过时的处理
边界完整性所有外部参与者均在边界外,所有内部实现均在边界内重新划分块归属
端口方向一致性端口方向与接口块流属性方向一致修正端口或接口块方向
需求挂接率每条上下文需求至少挂接一个端口或连接器补充端口或修正需求
否定性约束被禁止的端口类型在边界内不存在移除违规端口或调整需求
接口块复用同类交互使用同一接口块,无重复定义合并重复接口块