1. ASIL等级判定与软件安全目标分解
任务定义
本案例面向ISO 26262功能安全软件开发的起点:在项目早期为待开发系统定义ASIL等级并导出安全目标。任务输入为系统级危害分析结果(危害事件清单),输出为:①每个危害事件对应的ASIL等级(QM/A/B/C/D);②由最高ASIL等级推导出的安全目标及其属性(安全状态、容错时间间隔FTTI)。完成本案例后,你将获得一份可直接用于后续软件安全需求分解的ASIL与安全目标定义表。
输入数据
以某电动助力转向(EPS)系统为例,已完成初步危害分析与风险评估(HARA),识别出以下3个危害事件:
| 危害事件编号 | 危害场景 | 严重度S | 暴露概率E | 可控性C |
|---|---|---|---|---|
| H-01 | 高速行驶中非预期丧失转向助力 | S3 | E4 | C3 |
| H-02 | 低速泊车时非预期丧失转向助力 | S1 | E4 | C2 |
| H-03 | 行驶中转向助力输出错误方向 | S3 | E3 | C3 |
ASIL等级确定规则
依据ISO 26262-3:2018表1,ASIL由S、E、C组合查表确定:
| C1 | C2 | C3 | |
|---|---|---|---|
| S1+E1 | QM | QM | QM |
| S1+E2 | QM | QM | QM |
| S1+E3 | QM | QM | A |
| S1+E4 | QM | A | B |
| S2+E1 | QM | QM | QM |
| S2+E2 | QM | A | B |
| S2+E3 | A | B | C |
| S2+E4 | B | C | C |
| S3+E1 | A | B | C |
| S3+E2 | B | C | D |
| S3+E3 | C | C | D |
| S3+E4 | C | D | D |
ASIL等级计算实现
以下Python代码实现ASIL查表与安全目标生成逻辑:
# asil_definition.py
# 依赖:无(纯标准库)
# ASIL查表:键为(S,E,C),值为ASIL等级
ASIL_TABLE = {
(1,1,1):'QM', (1,1,2):'QM', (1,1,3):'QM',
(1,2,1):'QM', (1,2,2):'QM', (1,2,3):'QM',
(1,3,1):'QM', (1,3,2):'QM', (1,3,3):'A',
(1,4,1):'QM', (1,4,2):'A', (1,4,3):'B',
(2,1,1):'QM', (2,1,2):'QM', (2,1,3):'QM',
(2,2,1):'QM', (2,2,2):'A', (2,2,3):'B',
(2,3,1):'A', (2,3,2):'B', (2,3,3):'C',
(2,4,1):'B', (2,4,2):'C', (2,4,3):'C',
(3,1,1):'A', (3,1,2):'B', (3,1,3):'C',
(3,2,1):'B', (3,2,2):'C', (3,2,3):'D',
(3,3,1):'C', (3,3,2):'C', (3,3,3):'D',
(3,4,1):'C', (3,4,2):'D', (3,4,3):'D',
}
def get_asil(s, e, c):
"""根据S/E/C参数查表返回ASIL等级"""
return ASIL_TABLE[(s, e, c)]
def derive_safety_goal(hazard_id, scenario, asil):
"""
根据危害事件生成安全目标。
安全目标文本基于危害场景自动构造,ASIL取该危害事件的等级。
返回字典包含:安全目标ID、描述、ASIL、安全状态、FTTI。
"""
# 安全状态与FTTI根据场景特征设定(示例值,实际需系统工程师确认)
if '错误方向' in scenario:
safe_state = '禁止助力输出,转入机械转向模式'
ftti = 100 # ms
elif '高速' in scenario:
safe_state = '保持当前助力水平,降级至安全助力模式'
ftti = 200 # ms
else:
safe_state = '关闭助力,转入机械转向模式'
ftti = 500 # ms
return {
'safety_goal_id': f'SG-{hazard_id}',
'description': f'避免车辆在“{scenario}”场景下发生危害',
'ASIL': asil,
'safe_state': safe_state,
'FTTI_ms': ftti,
}
# ===== 主流程:处理输入危害事件清单 =====
hazards = [
{'id': 'H-01', 'scenario': '高速行驶中非预期丧失转向助力', 'S': 3, 'E': 4, 'C': 3},
{'id': 'H-02', 'scenario': '低速泊车时非预期丧失转向助力', 'S': 1, 'E': 4, 'C': 2},
{'id': 'H-03', 'scenario': '行驶中转向助力输出错误方向', 'S': 3, 'E': 3, 'C': 3},
]
print('='*70)
print('危害事件ASIL等级与安全目标定义结果')
print('='*70)
safety_goals = []
for h in hazards:
asil = get_asil(h['S'], h['E'], h['C'])
sg = derive_safety_goal(h['id'], h['scenario'], asil)
safety_goals.append(sg)
print(f"\n危害事件 {h['id']}: {h['scenario']}")
print(f" 参数: S={h['S']}, E={h['E']}, C={h['C']} → ASIL={asil}")
print(f" 安全目标: {sg['safety_goal_id']} | {sg['description']}")
print(f" 安全目标ASIL: {sg['ASIL']}")
print(f" 安全状态: {sg['safe_state']}")
print(f" FTTI: {sg['FTTI_ms']} ms")
# 汇总:取所有安全目标中的最高ASIL作为系统级ASIL
asil_rank = {'QM':0, 'A':1, 'B':2, 'C':3, 'D':4}
max_asil = max(safety_goals, key=lambda x: asil_rank[x['ASIL']])['ASIL']
print(f"\n{'='*70}")
print(f"系统级ASIL(取最高): {max_asil}")
print(f"共定义 {len(safety_goals)} 条安全目标,后续软件安全需求将基于以上安全目标分解。")
运行与验证
运行方式:将上述代码保存为 asil_definition.py,在Python 3.6+环境中执行:
python asil_definition.py
预期输出(确定性结果):
危害事件 H-01: 高速行驶中非预期丧失转向助力
参数: S=3, E=4, C=3 → ASIL=D
安全目标: SG-H-01 | 避免车辆在“高速行驶中非预期丧失转向助力”场景下发生危害
安全目标ASIL: D
安全状态: 保持当前助力水平,降级至安全助力模式
FTTI: 200 ms
危害事件 H-02: 低速泊车时非预期丧失转向助力
参数: S=1, E=4, C=2 → ASIL=A
安全目标: SG-H-02 | 避免车辆在“低速泊车时非预期丧失转向助力”场景下发生危害
安全目标ASIL: A
安全状态: 关闭助力,转入机械转向模式
FTTI: 500 ms
危害事件 H-03: 行驶中转向助力输出错误方向
参数: S=3, E=3, C=3 → ASIL=D
安全目标: SG-H-03 | 避免车辆在“行驶中转向助力输出错误方向”场景下发生危害
安全目标ASIL: D
安全状态: 禁止助力输出,转入机械转向模式
FTTI: 100 ms
=====================================================
系统级ASIL(取最高): D
共定义 3 条安全目标,后续软件安全需求将基于以上安全目标分解。
判定标准:程序无异常退出,输出中H-01与H-03的ASIL均为D(S3+E4+C3与S3+E3+C3查表均为D),H-02为A(S1+E4+C2查表为A),系统级ASIL取最高为D。安全目标ID、描述、安全状态与FTTI均按规则生成且与输入场景对应。