第三章:系统建模工具搭建

系统建模,说白了就是给预期功能安全找个「骨架」。你想想看,没有模型,你怎么定义功能?怎么分析危害?怎么跟团队对齐?

我个人习惯用 PREEvision 和 SystemWeaver 这两款工具。它们各有千秋,但核心逻辑是一样的:把抽象的安全需求,变成可视化的系统架构。

3.1 工具安装与环境配置

先说安装。嗯,这里要注意,别一上来就双击 setup.exe。

PREEvision 安装要点:

  • Java 环境:必须用官方指定的 JDK 版本。我遇到过有人装了 OpenJDK 17,结果模型编辑器打不开。后来换成 Oracle JDK 11 才搞定。
  • 数据库:PREEvision 依赖 PostgreSQL。记得把数据库的编码设成 UTF-8,不然中文注释会乱码。
  • License 配置:浮动许可证的话,要配好环境变量 LM_LICENSE_FILE。我曾经因为少配了一个端口号,折腾了整整一下午。
避坑指南:我曾经在 Windows 上装 PREEvision 2022,结果安装路径带了中文「项目」二字。启动时直接报错「路径非法」。所以,路径里不要有中文和空格。

SystemWeaver 安装要点:

  • IIS 配置:SystemWeaver 是 B/S 架构,需要先装好 IIS。记得启用 ASP.NET 4.7 功能。
  • 数据库:支持 SQL Server 或 Oracle。我建议用 SQL Server 2019,兼容性最好。
  • 客户端:安装时选「Full Client」,别选「Web Client」。Web 版功能不全,画图时卡得要命。
小技巧:装完 SystemWeaver 后,先跑一下自带的「SampleProject」模板。如果这个能打开,说明环境没问题。我每次给客户部署都这么干。

3.2 系统架构建模

工具装好了,接下来就是建模。我个人习惯先画「系统上下文图」,再细化到「内部架构」。

第一步:定义系统边界

在 PREEvision 里,我通常这样操作:

  1. 新建一个「System Context」图。
  2. 把「目标系统」放在中间,周围放上「外部实体」(比如驾驶员、其他车辆、云端)。
  3. 用箭头标出交互关系。注意,箭头方向代表「数据流」或「能量流」。

举个例子,一个自动紧急制动系统(AEB)的上下文图,大概长这样:

AEB 系统 目标系统 驾驶员 外部实体 前车 外部实体 制动执行器 外部实体 制动请求 雷达波 制动指令

第二步:内部架构分解

上下文图画完后,就该拆内部了。在 SystemWeaver 里,我习惯用「功能架构」视图:

  • 把系统拆成「感知层」、「决策层」、「执行层」。
  • 每个层再拆成「功能模块」。比如感知层包含「雷达处理」、「视觉处理」。
  • 模块之间用「接口」连接。接口要标明数据类型和方向。
关键点:架构分解的粒度要适中。太粗了,安全分析做不透;太细了,模型维护成本高。我一般控制在 3~5 层,每层 5~8 个模块。

3.3 功能定义与接口设计

架构搭好了,接下来就是往里面填「功能」。说白了,就是定义每个模块「干什么」以及「怎么跟别人说话」。

功能定义:

在 PREEvision 里,我通常用「功能树」来组织:

  1. 根节点是「整车级功能」,比如「自动紧急制动」。
  2. 下一层是「系统级功能」,比如「目标检测」、「碰撞风险评估」。
  3. 再下一层是「组件级功能」,比如「雷达目标跟踪」、「制动压力计算」。

每个功能节点,我都会填上这些属性:

属性 说明 示例
功能ID 唯一标识 FUNC_001
功能名称 简短描述 目标检测
功能描述 详细行为 通过雷达和摄像头数据,识别前方障碍物
触发条件 什么情况下激活 车速 > 10 km/h
安全等级 ASIL 等级 ASIL B

接口设计:

接口设计这块,我踩过不少坑。说白了,接口定义不清楚,后面集成测试就是灾难。

在 SystemWeaver 里,我这样定义接口:

  • 信号接口:Signal 类型,标明数据长度、初始值、范围。比如 BrakePressure: uint16, 0-1000 bar
  • 服务接口:Service 类型,标明请求/响应格式。比如 Request: TargetList, Response: BrakeCommand
  • 物理接口:Port 类型,标明引脚号、电压范围。比如 CAN_H, 2.5V ± 0.5V
个人经验:我建议接口命名用「动词+名词」的格式。比如 SendBrakeCommand,一看就知道是「发送制动指令」。别用 Data1Signal2 这种名字,后期根本看不懂。

接口矩阵示例:

源模块 目标模块 接口名称 数据类型 周期
雷达处理 融合模块 RadarTargetList struct { id, x, y, v } 50 ms
融合模块 决策模块 FusedObjectList struct { id, type, distance } 100 ms
决策模块 执行模块 BrakeCommand uint8 (0=off, 1=partial, 2=full) 事件触发
注意:接口设计时,一定要考虑「安全机制」。比如制动指令,我建议用「冗余发送」+「CRC 校验」。曾经有个项目,因为接口没加 CRC,电磁干扰导致误触发制动,差点出事。

好了,系统建模工具这块,核心就是「搭架构、定功能、画接口」。工具只是手段,关键是思路要清晰。你想想看,模型建好了,后面的危害分析、安全验证才有根可循。

一句话总结:模型是安全工程的「蓝图」。蓝图画歪了,后面盖的楼肯定歪。

专注资料整理