结论:Polaris Sportsman 的这份 J1939 档案给出 250 kbit/s、29 位扩展 ID 下 12 个 PGN 的信号定义,但它们是 2022 款 Sportsman 570 的逆向结果,工具面向的 2026 车型仍需逐条复验。另外两处硬边界必须知道:仓库未找到许可证文件,且工具导出的 DBC 因多信号 PGN 会重复占用同一 CAN ID,未被作为可用文件归档。
12 个 PGN 分成两类看
整车走 J1939,位速率 250 kbps、29 位扩展 ID,硬件链路是 Polaris 8 针诊断口 → GT150 → DB9 → PCAN DSUB9,配合 PEAK PCAN-USB FD 适配器与 PCAN-Basic 驱动,Python 侧通过 python-can 的 pcan 接口调用 PCANBasic.dll。配置集中在 polaris_can/config.py:interface 为 pcan,channel 为 PCAN_USBBUS1,bitrate 为 250000。
把 12 个 PGN 按性质分类,比按地址排序有用得多:一类是状态枚举(取值是离散码),另一类是数值量(需要字节序与缩放)。
| PGN(含字节位) | 信号 | 取值 / 换算 | 类别 |
|---|---|---|---|
0x18F00500[5] |
挡位 | 0x4C = L、0x48 = H、0x4E = N、0x52 = R、0x50 = P | 状态枚举 |
0x18FEF100[0] |
手刹 | 0x37 = 已拉起、0x33 = 已释放 | 状态枚举 |
0x18FEF1FE[3] |
脚刹 | 0xDF = 踩下、0xCF = 释放 | 状态枚举 |
0x18FF6CFE[1] |
安全带 | 0xF7 = 系好、0xF3 = 解开 | 状态枚举 |
0x18F006FE[1] |
差速锁 | 0xDF = 锁止、0xCF = 打开 | 状态枚举 |
0x18FDDFFE[0] |
四驱模式 | 0xFC = 2WD、0xFD = 4WD | 状态枚举 |
0x18FEF200[6] |
油门 | 0x19–0xFA 映射为 0–100% | 数值量,有量程端点 |
0x18FEF100[1:2] |
车速 | 小端 uint16 除以 500,单位 mph | 数值量,需字节序 |
0x18FF6600[0:1] |
发动机转速 | 小端 uint16 | 数值量,未给缩放 |
0x18FEEEFE[0] |
冷却液温度 | 字节值 + 40°C 偏移 | 数值量,偏移方向需复核 |
0x18FEFC00[1] |
油量 | 0–254 | 数值量,未给百分比换算 |
0x18FEE500[0:1] |
发动机小时计 | 小端 uint16 | 数值量,未给缩放 |
这张表里最值得注意的是最后一列。状态枚举只要码值对得上就能用;而转速、油量、小时计三项只给了类型与字节序,没有给缩放因子,水温那条甚至写成「字节 + 40°C 偏移」——与常见的减 40 相反。这四项在使用前都必须用已知工况反推。
为什么导出的 DBC 不能直接用
工具提供了 polaris-can export-dbc,输出 cantools 兼容格式,可导入 SavvyCAN、Cabana、Vector CANoe。但归档说明明确指出:导出函数会为多信号 PGN 创建多个使用同一 CAN ID 的独立报文,因此该输出未被作为经过验证的 DBC 归档。
这个坑在 J1939 场景下很典型。像 0x18FEF100 这样同时承载手刹与车速的 PGN,在 DBC 里应当是同一条报文下的两个信号;若导出成两条同 ID 报文,解析器要么只认第一条,要么按 ID 覆盖,结果就是丢信号。因此正确做法是把这份 PGN 表当作原始事实,手工建 DBC,而不是依赖自动导出。
五种模式:哪一种是真正的逆向工具
工具提供 decode、log、discover、replay、export-dbc 五种模式,其中 discover 才是为新车型定位信号的核心手段。
| 模式 | 命令 | 输出 | 适用场景 |
|---|---|---|---|
| 实时解码 | polaris-can decode |
终端仪表盘,10 Hz 刷新,含帧率、总线负载百分比、唯一 ID 计数 | 已知信号的日常查看,可加 --output 落盘 |
| 记录 | polaris-can log session1.log |
微秒级时间戳的 candump 兼容日志 | 外场采集,后续导入 SavvyCAN 等工具 |
| 发现 | polaris-can discover --warmup 30 |
基线冻结后报告新 ID 与变化字节 | 新车型定位信号:怠速 30 秒建基线,再逐个操作开关 |
| 回放 | polaris-can replay session1.log --dashboard |
离线回放,可实时或加速 | 无硬件时开发与验证 |
| 导出 | polaris-can export-dbc polaris.dbc |
DBC 文件 | 仅作起点,多信号 PGN 需手工修正 |
discover 的工作流是:预热阶段(默认 30 秒,可用 --warmup 60 延长)记录基线流量并冻结,随后进入发现阶段,监控新出现的 ID 与发生变化的字节。文档给出的示例输出显示基线里冻结了 47 个 CAN ID,随后报告新 ID 与具体字节的旧值到新值变化。操作要领是预热期间车辆真正处于怠速,之后一次只动一个开关或踏板。
解码时匹配成功的信号会打印 [KNOWN],不匹配的被标为需要重新映射的候选——2026 与 2022 的差异正是靠这个标记暴露出来的。
常见问题
2022 年的 PGN 表能直接用在 2026 车型上吗?
不能直接套用。README 明确说明工具面向 2026 款 Sportsman 570 EPS,但内置的 12 个 PGN 定义来自 2022 款 Sportsman 570,属于基线事实,需要在目标车型上逐条验证。若发现不匹配,应用 discover 模式重建:先怠速建立基线,再逐个操作开关与踏板,观察新 ID 与字节变化。
为什么导出的 DBC 没有被当作可用文件归档?
因为导出函数对多信号 PGN 会生成多条使用同一 CAN ID 的独立报文。例如 0x18FEF100 同时承载手刹与车速,正确形态应是同一条报文下的两个信号;拆成两条同 ID 报文会导致解析器丢信号。因此该输出未通过验证,未被归档,建议以 PGN 表为事实源手工建库。
车速 PGN 0x18FEF100 的换算单位是什么?
原文给出的是小端 uint16 除以 500,单位为 mph。也就是说原始值需要先按小端字节序拼成 16 位无符号整数,再除以 500 得到英里每小时;若系统内部使用 km/h 或 m/s,还要再做一级单位换算。
没有 PCAN 硬件能不能用这套工具?
可以。replay 模式支持离线回放日志文件,可实时或加速播放并接入仪表盘,仓库也提供了 tests/sample.log,在硬件未连接时用示例数据即可跑通,单元测试同样不依赖硬件。真正需要硬件的只有 decode、log 与 discover 三种模式。
延伸阅读
- Indian Springfield 2017:J1939 摩托车 CAN 档案 —— 同为 J1939 体系的动力运动车型档案
- Talaria 电摩 CAN 档案:250 kbit/s 的 15 个 ID —— 同为 250 kbit/s 的两轮 / 四轮小排量总线
- 2330 份 DBC、294 个来源:公开 CAN 数据集的收录与分级 —— 未验证产物为什么不能被归档为可用文件
- 公共 CAN/DBC 数据集怎么选:四类来源与三道筛查 —— 跨年款复用信号定义时的核查顺序
参考资料
- 项目 01 ——
public-can-dbc-datasets/additional/marvbull-polaris-sportsman-can/README.md(250 kbit/s J1939 配置、12 个 PGN 的信号定义、五种工具模式与故障排查) - 项目 01 ——
public-can-dbc-datasets/additional/marvbull-polaris-sportsman-can/SOURCE.md(快照提交、证据边界、PGN_MAP 的 12 个标识符与导出 DBC 的缺陷说明、权利状态)
免责声明
本文所述 PGN、码值与换算均来自公开开源仓库的自述与工具代码,属社区逆向工程产物,不代表车辆制造商的官方数据。信号定义来自 2022 款车型,未经独立抓包验证,不同年款、市场与 ECU 版本可能存在差异。仓库未找到许可证文件,相关材料应作为私有离线研究副本,在权利确认前不得再分发或集成。
更新记录
- 2026-10-14 初稿
发表回复