第三章:系统建模工具搭建
系统建模,说白了就是给预期功能安全找个「骨架」。你想想看,没有模型,你怎么定义功能?怎么分析危害?怎么跟团队对齐?
我个人习惯用 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 里,我通常这样操作:
- 新建一个「System Context」图。
- 把「目标系统」放在中间,周围放上「外部实体」(比如驾驶员、其他车辆、云端)。
- 用箭头标出交互关系。注意,箭头方向代表「数据流」或「能量流」。
举个例子,一个自动紧急制动系统(AEB)的上下文图,大概长这样:
第二步:内部架构分解
上下文图画完后,就该拆内部了。在 SystemWeaver 里,我习惯用「功能架构」视图:
- 把系统拆成「感知层」、「决策层」、「执行层」。
- 每个层再拆成「功能模块」。比如感知层包含「雷达处理」、「视觉处理」。
- 模块之间用「接口」连接。接口要标明数据类型和方向。
关键点:架构分解的粒度要适中。太粗了,安全分析做不透;太细了,模型维护成本高。我一般控制在 3~5 层,每层 5~8 个模块。
3.3 功能定义与接口设计
架构搭好了,接下来就是往里面填「功能」。说白了,就是定义每个模块「干什么」以及「怎么跟别人说话」。
功能定义:
在 PREEvision 里,我通常用「功能树」来组织:
- 根节点是「整车级功能」,比如「自动紧急制动」。
- 下一层是「系统级功能」,比如「目标检测」、「碰撞风险评估」。
- 再下一层是「组件级功能」,比如「雷达目标跟踪」、「制动压力计算」。
每个功能节点,我都会填上这些属性:
| 属性 | 说明 | 示例 |
|---|---|---|
| 功能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,一看就知道是「发送制动指令」。别用 Data1、Signal2 这种名字,后期根本看不懂。
接口矩阵示例:
| 源模块 | 目标模块 | 接口名称 | 数据类型 | 周期 |
|---|---|---|---|---|
| 雷达处理 | 融合模块 | 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,电磁干扰导致误触发制动,差点出事。
好了,系统建模工具这块,核心就是「搭架构、定功能、画接口」。工具只是手段,关键是思路要清晰。你想想看,模型建好了,后面的危害分析、安全验证才有根可循。
一句话总结:模型是安全工程的「蓝图」。蓝图画歪了,后面盖的楼肯定歪。