feat: add VCU status feedback and map DEBUG safety inputs
This commit is contained in:
@@ -23,6 +23,7 @@ def can2_dbc_text():
|
||||
return text
|
||||
|
||||
PURPOSE = {
|
||||
0x183: 'VCU -> AMI:实际当前任务、锁定状态、EBS 状态',
|
||||
0x182: 'VCU / 测试器 -> AMI:扭矩千分、电机温度、MCU 温度',
|
||||
0x300: 'AMI -> VCU:用户确认后的任务选择请求',
|
||||
0x6A0: 'SDC -> AMI:板标识、版本、序号、上电时间',
|
||||
@@ -50,7 +51,7 @@ def render():
|
||||
'| --- | --- | --- | --- |',
|
||||
'| CAN1 | 500 kbit/s | PA11 / PA12 | [AMI.dbc](../AMI.dbc) |',
|
||||
'| CAN2 | 250 kbit/s | PB0 / PB1 | [AMI_CAN2_250k.dbc](../AMI_CAN2_250k.dbc) |', '',
|
||||
'DBC 的 `Baudrate` / `AMIPort` 分别标注所属总线。每份 DBC 均含 11 条报文、40 个信号;'
|
||||
'DBC 的 `Baudrate` / `AMIPort` 分别标注所属总线。每份 DBC 均含 12 条报文、49 个信号;'
|
||||
'同一份报文表适用于两路。CAN 工具必须按接入端口设置速率,导入 DBC 不一定自动改硬件速率。'
|
||||
'实际接法:SDC 500 kbit/s 接 CAN1,BMS 250 kbit/s 接 CAN2。', '',
|
||||
'FDCAN 时钟 64 MHz,时钟分频为 1;NominalPrescaler 为 CAN1=8、CAN2=16,'
|
||||
@@ -59,7 +60,7 @@ def render():
|
||||
'本 DBC 包含 AMI 唯一发送的 `0x300` 任务请求,以及 AMI 当前识别的 SDC / BMS 和自定义显示输入。'
|
||||
'SDC `0x6A3` DAC 控制、`0x6A5` ASSI 控制、BMS 其他电芯/故障字段不属于此接口子集。'
|
||||
'`0x182` 新增扭矩千分、电机温度和电机控制器 MCU 温度的仪表显示输入;'
|
||||
'发送者负责转换实际电机控制器协议。未定义标定后的车速、AMI 周期心跳或 VCU 执行反馈。'
|
||||
'发送者负责转换实际电机控制器协议。`0x183` 为新增 VCU 状态反馈,需 VCU 按此自定义接口发送;未定义标定后的车速或 AMI 周期心跳。'
|
||||
'旧 `0x180 / 0x181 / 0x280` 输入已停用。', '',
|
||||
'SDC 字段依据 `SDC_ACQ_DAC.dbc` VERSION 1.1,保持其信号名、位布局、缩放和单位;'
|
||||
'仅将输入接收节点设为 AMI。BMS 字段依据 '
|
||||
@@ -96,7 +97,7 @@ def render():
|
||||
lines.append(f'| `{s.name}` | {s.start} | {s.length} | '
|
||||
f'{"Intel" if s.byte_order=="little_endian" else "Motorola"} | '
|
||||
f'{s.scale:g} | {s.offset:g} | {s.unit or "-"} | '
|
||||
f'{s.minimum:g}..{s.maximum:g} |')
|
||||
f'{"0(固定)" if s.name == "Reserved" else f"{s.minimum:g}..{s.maximum:g}"} |')
|
||||
choices = [f'`{s.name}`:' + ','.join(f'{value} = {name}' for value,name in s.choices.items())
|
||||
for s in m.signals if s.choices]
|
||||
if choices:
|
||||
@@ -112,7 +113,7 @@ def render():
|
||||
'| 2..3 | 电机温度 | 小端 int16 × 0.1 ℃,仪表四舍五入到整数 ℃ |',
|
||||
'| 4..5 | MCU 温度 | 小端 int16 × 0.1 ℃,仪表四舍五入到整数 ℃ |',
|
||||
'| 6 | 有效标志 | bit0 扭矩、bit1 电机温度、bit2 MCU 温度;1 有效,0 无效;bit3..7 必须为 0 |',
|
||||
'| 7 | 帧版本 | 固定 1,与整体接口 v2.2 版本号独立 |', '',
|
||||
'| 7 | 帧版本 | 固定 1,与整体接口 v2.4 版本号独立 |', '',
|
||||
'有效值更新并显示白色;标志为 0 时立即变灰并保留历史数字。'
|
||||
'扭矩超出 -1000..1000 时仅扭矩无效,两个温度仍按各自标志处理。'
|
||||
'温度的 int16 编码范围为 -3276.8..3276.7 ℃;显示正负半值均向远离零方向取整。'
|
||||
@@ -125,6 +126,46 @@ def render():
|
||||
'# PCAN 当前接 CAN2,速率 250000;其他适配器按 python-can 接口参数设置',
|
||||
'python scripts/send_drivetrain_can.py --interface pcan --channel PCAN_USBBUS1 --bitrate 250000 --torque 500 --motor-temp 45 --mcu-temp 40 --duration 10',
|
||||
'```', '',
|
||||
'## VCU 状态反馈 0x183', '',
|
||||
'新增自定义标准数据帧,DLC 必须为 8,建议周期 100 ms;CAN1 500K 与 CAN2 250K 共用布局。'
|
||||
'只有该帧更新当前任务、锁定、EBS 主页面显示。AMI 发出任务请求后保留 VCU 上次反馈,等待新的实际状态。', '',
|
||||
'| 字节 | 字段 | 编码与规则 |', '| --- | --- | --- |',
|
||||
'| 0 | 当前任务 | 0 无;1 八字绕环;2 直线加速;3 高速循迹;4 车检测试;5 EBS 测试;6 手动驾驶 |',
|
||||
'| 1 | 锁定 | 0 已解锁(红);1 已锁定(绿) |',
|
||||
'| 2 | EBS 正常 | 0 故障(红底);1 正常(绿底) |',
|
||||
'| 3 | 有效标志 | bit0 当前任务,bit1 锁定,bit2 EBS;1 有效,0 未知;bit3..7 为 0 |',
|
||||
'| 4 | 反馈计数 | 0..255,供观察;不去重,不作为请求 ACK |',
|
||||
'| 5..6 | 保留 | 必须为 0 |',
|
||||
'| 7 | 帧版本 | 固定 1 |', '',
|
||||
'例:`02 01 01 07 00 00 00 01` 表示当前直线加速、已锁定、EBS 正常。'
|
||||
'`00 00 00 07 01 00 00 01` 表示无任务、已解锁、EBS 故障。任务 1..6 为绿字,0 无任务为红字。'
|
||||
'各有效标志为 0 时,对应项立即灰色未知;连续超过 500 ms 无合规帧后三项均未知,其他 CAN 流量不能续期。'
|
||||
'错误 DLC、版本、枚举值、保留位或扩展/远程/FD 格式整帧拒绝,不改变状态、不续期。'
|
||||
'该反馈只驱动显示,EBS 安全动作及车辆任务裁决由 VCU 实现。', '',
|
||||
'### 当前任务发送对照', '',
|
||||
'下表第 1、2 字节均为 01,只用于展示已锁定、EBS 正常;VCU 必须填写实际状态。'
|
||||
'每条合规帧同时更新三项及其有效性,不能只改任务有效位而期望另外两项继续保留。', '',
|
||||
'| 任务号 | 当前任务 | 标准 0x183 / DLC 8 数据 |', '| --- | --- | --- |',
|
||||
'| 0 | 无(红) | `00 01 01 07 00 00 00 01` |',
|
||||
'| 1 | 八字绕环 | `01 01 01 07 00 00 00 01` |',
|
||||
'| 2 | 直线加速 | `02 01 01 07 00 00 00 01` |',
|
||||
'| 3 | 高速循迹 | `03 01 01 07 00 00 00 01` |',
|
||||
'| 4 | 车检测试 | `04 01 01 07 00 00 00 01` |',
|
||||
'| 5 | EBS 测试 | `05 01 01 07 00 00 00 01` |',
|
||||
'| 6 | 手动驾驶 | `06 01 01 07 00 00 00 01` |', '',
|
||||
'任务未知通过 byte3 的 bit0=0 编码。例如 `00 01 01 06 00 00 00 01`'
|
||||
'显示任务未知、已锁定、EBS 正常;不要发送任务号 7,7 是屏内未知状态而不是 CAN 枚举。'
|
||||
'任务号、锁定、EBS 的数值范围始终校验,有效标志为 0 时也不能发送越界值。', '',
|
||||
'发送顺序:AMI 确认按钮 -> UART 任务帧 -> MCU CAN `0x300` 请求 -> VCU 裁决 -> '
|
||||
'VCU 周期 CAN `0x183` 实际状态 -> AMI 显示。确认发送后可继续显示此前实际任务,'
|
||||
'直到 VCU 更新或反馈超时。', '',
|
||||
'发送工具预览和实发示例:', '', '```powershell',
|
||||
'python scripts/send_vcu_status_can.py --task 2 --locked 1 --ebs-normal 1 --dry-run',
|
||||
'python scripts/send_vcu_status_can.py --interface pcan --channel PCAN_USBBUS1 --bitrate 500000 --task 2 --locked 1 --ebs-normal 1 --duration 10',
|
||||
'# CAN2 改为 --bitrate 250000;Windows 适配器需要时添加 --dll-dir 指定 DLL 目录',
|
||||
'```', '',
|
||||
'屏内全局变量:`current_task=0..6`(7 未知)、`lock_state=0/1/2`、`ebs_state=0/1/2`'
|
||||
'(0 未知、1 绿、2 红)。MCU 更新这些变量,dash 后初始化和 100 ms 定时器更新文案、颜色和任务按钮;切页保留反馈。', '',
|
||||
'## AMI 任务请求语义', '',
|
||||
'| Task_ID | 任务 |', '| --- | --- |',
|
||||
'| 1 | 八字绕环 |', '| 2 | 直线加速 |', '| 3 | 高速循迹 |',
|
||||
@@ -136,7 +177,7 @@ def render():
|
||||
'优先发送到最近 500 ms 内收到过有效协议报文的 CAN 口;两路活跃则发送两路;'
|
||||
'没有活跃口时尝试两路。若未连接端口自动重发导致 TX FIFO 填满,现有队列可能等待。'
|
||||
'该策略沿用当前固件。任务表示操作员请求,VCU 负责裁决和安全互锁;'
|
||||
'未定义应用层执行确认、运行完成、故障回传,也不把任务号换成 ASSI 灯状态。', '',
|
||||
'当前实际任务由 `0x183` 反馈,不按请求立即显示;未定义逐请求 ACK 或运行完成报文,也不把任务号换成 ASSI 灯状态。', '',
|
||||
'## 显示缩放与失效规则', '',
|
||||
'| 显示项 | 输入和显示规则 | 失效条件 |', '| --- | --- | --- |',
|
||||
'| 低压电池 | `0x6A1` uint16 mV;`lvbat.val=(mV+5)/10`,显示两位小数 V | 1500 ms 无有效 ADC |',
|
||||
@@ -152,13 +193,17 @@ def render():
|
||||
'第 9/10 路虚拟温度没有总线字段,最高温度也属于 MCU 派生结果,不新增虚构信号。', '',
|
||||
'BMS 扩展帧的其他字段没有纳入本 DBC,尤其字节 6..7 的低压电压不覆盖 SDC ADC。'
|
||||
'两类温度帧共用最高温度显示,后收到的温度帧更新该显示及有效性。'
|
||||
'SDC GPIO 原始电平尚无具名安全信号映射和正常极性,因此 debug 保持未知;'
|
||||
'SDC GPIO PD0..PD14 按顺序映射到 d0、d5、d2、d6、d7、d1、d3、d4、d8..d14;'
|
||||
'全部低电平正常、高电平故障,d15 无来源保持未知。心跳维持已有采样,'
|
||||
'用户最新纠正 PD1 / Safe_S 为左电机互锁(d5),屏幕已删除 BSPD/TSMS。'
|
||||
'心跳和 GPIO 均停止超过 500 ms 后全部未知,恢复需要新的 GPIO 采样;'
|
||||
'轮频 Hz 尚无周长和每圈脉冲数,不能直接当 km/h。', '',
|
||||
'有效值显示白色;未知、无效、超时显示深灰色,历史数值保留但不作为有效测量。'
|
||||
'各源独立超时,其他流量不续期。每 5 秒重新同步界面,刚连接需等待首轮同步。', '',
|
||||
'## 报文样例', '',
|
||||
'| ID / DLC | 数据(十六进制) | 解码及仪表显示 |', '| --- | --- | --- |',
|
||||
'| `0x300 / 8` | `01 02 00 01 E8 03 00 00` | 直线加速请求、序号 0、来源 AMI、上电 1000 ms |',
|
||||
'| `0x183 / 8` | `02 01 01 07 00 00 00 01` | 当前直线加速、已锁定、EBS 正常,三项有效 |',
|
||||
'| `0x182 / 8` | `F4 01 C2 01 90 01 07 01` | 500‰、45.0 ℃、40.0 ℃,三个值有效 |',
|
||||
'| `0x182 / 8` | `0C FE 9B FF 33 FF 07 01` | -500‰、-10.1 ℃、-20.5 ℃;显示 -500 / -10 / -21 |',
|
||||
'| `0x6A1 / 2` | `0C 30` | ADC 12300 mV;低压 12.30 V |',
|
||||
@@ -175,8 +220,8 @@ def render():
|
||||
'# 若同时检出 SDC 仓库,可额外比较五条输入帧的原始布局:',
|
||||
'python scripts/verify_dbc.py --sdc-dbc ../SDC_ACQ_DAC/SDC_ACQ_DAC.dbc',
|
||||
'```', '',
|
||||
'校验覆盖严格 DBC 解析(长度、信号越界与重叠)、11 个 ID 与固件宏对应、'
|
||||
'标准/扩展格式、40 个信号、发送/接收节点、SDC / 自定义帧周期、已知报文解码、'
|
||||
'校验覆盖严格 DBC 解析(长度、信号越界与重叠)、12 个 ID 与固件宏对应、'
|
||||
'标准/扩展格式、49 个信号、发送/接收节点、SDC / 自定义帧周期、已知报文解码、'
|
||||
'六个任务号与计数边界编码、大端偏置电流、无效温度枚举、全负温度和截短 DLC。'
|
||||
'已安装并验证 cantools 44.1.0,接口参考 [cantools 官方文档](https://cantools.readthedocs.io/en/latest/)。', '',
|
||||
'上述是静态及软件编解码验证,另校验两份 DBC 的速率、相同信号布局及源码 / CubeMX 位时序一致。'
|
||||
|
||||
Reference in New Issue
Block a user