如何在Cantools生成的DBC文件中正确配置J1939协议消息?
问题描述
使用Cantools编写Python脚本实现DBC与Excel互转时,从Excel生成DBC的过程中,为消息设置protocol="j1939"属性后,Vector CANdb中仍显示为CAN扩展格式,而非J1939。查看正常的J1939 DBC文件发现,数据库存在ProtocolType属性,消息也带有j1939属性,但不清楚如何通过Cantools创建这些属性;使用J1939模板DBC添加消息虽能生效,但会将所有CAN标准/扩展消息也转为J1939格式。
解决方案
Cantools支持生成带J1939协议的DBC,但仅设置消息的protocol参数不足以让Vector工具识别,需要同时配置数据库级属性和消息级属性,具体步骤如下:
1. 配置数据库属性
根据需求设置全局协议类型:
- 若数据库仅包含J1939消息:将数据库的
ProtocolType属性设为J1939 - 若需混合CAN标准/扩展与J1939消息:将数据库的
ProtocolType属性设为CAN,仅给J1939消息添加专属属性
2. 配置J1939消息属性
给J1939消息添加j1939属性,这是Vector CANdb识别J1939消息的关键标记。
修改后的示例代码
import cantools from cantools.db.can import Signal, Message, Database # 创建J1939信号(带SPN参数) signal1 = Signal(name="signal1", start=1, length=8, is_signed=True, scale=1, offset=0, unit=None, spn=1586) # 创建J1939消息,确保frame_id为J1939格式的扩展帧ID frame1 = Message(name="Msg1", frame_id=0x16fd3b09, protocol="j1939", is_extended_frame=True, length=8, signals=[signal1], cycle_time=50, senders=["A"]) # 添加消息级J1939属性,供Vector工具识别 frame1.attributes = {'j1939': ''} # 创建普通CAN扩展消息(用于混合协议场景) signal2 = Signal(name="signal2", start=0, length=16, is_signed=False) frame2 = Message(name="Msg2", frame_id=0x123, is_extended_frame=True, length=4, signals=[signal2], cycle_time=100, senders=["B"]) # 初始化数据库,设置全局协议类型为CAN(支持混合协议) db_cantools = Database(messages=[frame1, frame2]) db_cantools.attributes = {'ProtocolType': 'CAN'} # 保存DBC文件 cantools.db.dump_file(db_cantools, "mixed_protocol_db.dbc")
关键说明
- DBC本身没有原生的J1939字段,Vector工具通过自定义属性识别J1939协议,因此必须添加对应的属性配置
- 混合协议场景下,全局
ProtocolType设为CAN,仅给需要的消息添加j1939属性,即可区分不同协议的消息 - 消息的
protocol="j1939"参数主要用于Cantools内部的J1939逻辑处理(如PGN解析),需配合属性配置才能在DBC中生效
内容的提问来源于stack exchange,提问作者Sebastian Tramposch
相关产品推荐
相关产品推荐

