1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116
| """ OMS → 约束控制系统的 CAN 消息接口设计 基于 ZF LIFETEC 方案参考
关键消息: 1. 乘员分类信息 2. 姿态和位置信息 3. 安全带状态 4. 约束系统反馈 """
RESTRAINT_MESSAGES = { 'OMS_OCCUPANT_CLASS': { 'can_id': 0x720, 'length': 8, 'signals': { 'occupant_class': { 'bits': [0, 3], 'values': { 0: 'empty', 1: 'child_small', 2: 'child_large', 3: 'adult_small', 4: 'adult_medium', 5: 'adult_large', 6: 'unknown', 7: 'invalid' } }, 'mass_estimate_kg': { 'bits': [3, 8], 'scale': 0.5, 'offset': 0, 'range': '0-127.5 kg' }, 'confidence': { 'bits': [11, 4], 'scale': 6.25, 'range': '0-100%' }, 'seat_position_mm': { 'bits': [15, 9], 'scale': 1, 'offset': 0, 'range': '0-511 mm' }, 'torso_angle_deg': { 'bits': [24, 7], 'scale': 0.5, 'offset': -30, 'range': '-30 to +30 deg' }, 'seatbelt_status': { 'bits': [31, 3], 'values': { 0: 'unbuckled', 1: 'buckled_correct', 2: 'buckled_misuse_behind', 3: 'buckled_misuse_under_arm', 4: 'buckled_loose', 5: 'buckled_twisted', 6: 'unknown', 7: 'invalid' } }, 'checksum': {'bits': [56, 8]} } }, 'RESTRAINT_DEPLOYMENT': { 'can_id': 0x721, 'length': 8, 'signals': { 'airbag_volume_mode': { 'bits': [0, 3], 'values': { 0: 'small_60L', 1: 'medium_75L', 2: 'large_90L', 3: 'adaptive' } }, 'venting_mode': { 'bits': [3, 2], 'values': { 0: 'closed', 1: 'small', 2: 'medium', 3: 'large' } }, 'belt_pretension_N': { 'bits': [5, 10], 'scale': 1, 'range': '0-1023 N' }, 'belt_load_limit_N': { 'bits': [15, 10], 'scale': 10, 'range': '0-10230 N' } } } }
for msg_name, msg_def in RESTRAINT_MESSAGES.items(): print(f"\n=== {msg_name} (ID: 0x{msg_def['can_id']:03X}) ===") for sig_name, sig_def in msg_def['signals'].items(): if 'values' in sig_def: print(f" {sig_name}: {sig_def['bits']} " f"({len(sig_def['values'])} states)") elif 'scale' in sig_def: print(f" {sig_name}: {sig_def['bits']} " f"scale={sig_def['scale']} " f"range={sig_def.get('range', 'N/A')}")
|