Files
2025-05-23 15:38:23 +08:00

457 lines
28 KiB
Python

# requirements:
# pip install cantools
import cantools
from cantools.database.can.signal import Signal
from cantools.database.can.message import Message
from cantools.database.can import database
def build_dbc(output_path: str):
"""
"""
# 1. 初始化 Database 对象
db = database.Database()
# 2. 定义要添加的消息及其信号
# 你可以在这里添加任意多的 message 定义
messages_config = [
{
'frame_id': 0x1401A501,
'name': 'CircuitBreakerControl1',
'length': 8,
'signals': [
# Byte 0
{'name': 'FuelCellBreakerControl', 'start': 0, 'length': 2, 'byte_order': 'little_endian', 'is_signed': False},
{'name': 'BatteryBreakerControl', 'start': 2, 'length': 2, 'byte_order': 'little_endian', 'is_signed': False},
{'name': 'MotorBreakerControl', 'start': 4, 'length': 2, 'byte_order': 'little_endian', 'is_signed': False},
{'name': 'BatteryMeterBreakerControl', 'start': 6, 'length': 2, 'byte_order': 'little_endian', 'is_signed': False},
# Byte 1
{'name': 'DCDC5BreakerControl', 'start': 8, 'length': 2, 'byte_order': 'little_endian', 'is_signed': False},
{'name': 'BowPanelBreakerControl', 'start': 10, 'length': 2, 'byte_order': 'little_endian', 'is_signed': False},
{'name': 'SternFT45BreakerControl', 'start': 12, 'length': 2, 'byte_order': 'little_endian', 'is_signed': False},
{'name': 'SternSwitch1BreakerControl', 'start': 14, 'length': 2, 'byte_order': 'little_endian', 'is_signed': False},
# Byte 2
{'name': 'SternSwitch2BreakerControl', 'start': 16, 'length': 2, 'byte_order': 'little_endian', 'is_signed': False},
{'name': 'FBReserveBreakerControl', 'start': 18, 'length': 2, 'byte_order': 'little_endian', 'is_signed': False},
{'name': 'TYZReserveBreakerControl', 'start': 20, 'length': 2, 'byte_order': 'little_endian', 'is_signed': False},
{'name': 'ReserveBreakerControl', 'start': 22, 'length': 2, 'byte_order': 'little_endian', 'is_signed': False},
# Byte 3
{'name': 'DCDC5PowerControl', 'start': 24, 'length': 2, 'byte_order': 'little_endian', 'is_signed': False},
{'name': 'CoolingWaterValveControl', 'start': 26, 'length': 2, 'byte_order': 'little_endian', 'is_signed': False}
]
},
{
'frame_id': 0x1402A501,
'name': 'CircuitBreakerControl2',
'length': 8,
'signals': [
# Byte 0
{'name': 'BowFloatAdjustControl', 'start': 0, 'length': 2, 'byte_order': 'little_endian', 'is_signed': False},
{'name': 'OpeningMechanismControl', 'start': 2, 'length': 2, 'byte_order': 'little_endian', 'is_signed': False},
{'name': 'MastRudderControl', 'start': 4, 'length': 2, 'byte_order': 'little_endian', 'is_signed': False},
{'name': 'XCBreakerControl', 'start': 6, 'length': 2, 'byte_order': 'little_endian', 'is_signed': False},
# Byte 1
{'name': 'BowRudderControl', 'start': 8, 'length': 2, 'byte_order': 'little_endian', 'is_signed': False},
{'name': 'OpenWaterMechanismControl', 'start': 10, 'length': 2, 'byte_order': 'little_endian', 'is_signed': False}
]
},
{
'frame_id': 0x1403A501,
'name': 'CircuitBreakerControl3',
'length': 8,
'signals': [
# Byte 0
{'name': 'BatteryAccessControl', 'start': 0, 'length': 2, 'byte_order': 'little_endian', 'is_signed': False},
{'name': 'BowLowVoltageControl', 'start': 2, 'length': 2, 'byte_order': 'little_endian', 'is_signed': False},
{'name': 'U4BreakerControl', 'start': 4, 'length': 2, 'byte_order': 'little_endian', 'is_signed': False},
{'name': 'HighVoltageControllerControl', 'start': 6, 'length': 2, 'byte_order': 'little_endian', 'is_signed': False},
# Byte 1
{'name': 'Reserve1Control', 'start': 8, 'length': 2, 'byte_order': 'little_endian', 'is_signed': False},
{'name': 'Reserve2Control', 'start': 10, 'length': 2, 'byte_order': 'little_endian', 'is_signed': False},
{'name': 'SternEmergencyBatteryControl', 'start': 12, 'length': 2, 'byte_order': 'little_endian', 'is_signed': False}
]
},
{
'frame_id': 0x1404A501,
'name': 'CircuitBreakerControl4',
'length': 8,
'signals': [
# Byte 0
{'name': 'U1BreakerControl', 'start': 0, 'length': 2, 'byte_order': 'little_endian', 'is_signed': False},
{'name': 'U2BreakerControl', 'start': 2, 'length': 2, 'byte_order': 'little_endian', 'is_signed': False},
{'name': 'U3BreakerControl', 'start': 4, 'length': 2, 'byte_order': 'little_endian', 'is_signed': False},
{'name': 'U5BreakerControl', 'start': 6, 'length': 2, 'byte_order': 'little_endian', 'is_signed': False},
# Byte 1
{'name': 'BowJettisonControl', 'start': 8, 'length': 2, 'byte_order': 'little_endian', 'is_signed': False},
{'name': 'Reserve3Control', 'start': 10, 'length': 2, 'byte_order': 'little_endian', 'is_signed': False},
{'name': 'Reserve4Control', 'start': 12, 'length': 2, 'byte_order': 'little_endian', 'is_signed': False},
{'name': 'BowEmergencyBatteryControl', 'start': 14, 'length': 2, 'byte_order': 'little_endian', 'is_signed': False}
]
},
{
'frame_id': 0x18A50101,
'name': 'CircuitBreakerFeedback',
'length': 8,
'signals': [
# Byte 0
{'name': 'FuelCellBreaker_Status', 'start': 0, 'length': 2, 'byte_order': 'little_endian', 'is_signed': False},
{'name': 'BatteryBreaker_Status', 'start': 2, 'length': 2, 'byte_order': 'little_endian', 'is_signed': False},
{'name': 'MotorBreaker_Status', 'start': 4, 'length': 2, 'byte_order': 'little_endian', 'is_signed': False},
{'name': 'BatteryMeterBreaker_Status', 'start': 6, 'length': 2, 'byte_order': 'little_endian', 'is_signed': False},
# Byte 1
{'name': 'DCDC5Breaker_Status', 'start': 8, 'length': 2, 'byte_order': 'little_endian', 'is_signed': False},
{'name': 'BowPanelBreaker_Status', 'start': 10, 'length': 2, 'byte_order': 'little_endian', 'is_signed': False},
{'name': 'SternFT45Breaker_Status', 'start': 12, 'length': 2, 'byte_order': 'little_endian', 'is_signed': False},
{'name': 'SternSwitch1Breaker_Status', 'start': 14, 'length': 2, 'byte_order': 'little_endian', 'is_signed': False},
# Byte 2
{'name': 'SternSwitch2Breaker_Status', 'start': 16, 'length': 2, 'byte_order': 'little_endian', 'is_signed': False},
{'name': 'FBReserveBreaker_Status', 'start': 18, 'length': 2, 'byte_order': 'little_endian', 'is_signed': False},
{'name': 'TYZReserveBreaker_Status', 'start': 20, 'length': 2, 'byte_order': 'little_endian', 'is_signed': False},
{'name': 'ReserveBreaker_Status', 'start': 22, 'length': 2, 'byte_order': 'little_endian', 'is_signed': False},
# Byte 3
{'name': 'DCDC_OverTemp', 'start': 24, 'length': 1, 'byte_order': 'little_endian', 'is_signed': False},
{'name': 'DCDC_OverCurrent', 'start': 25, 'length': 1, 'byte_order': 'little_endian', 'is_signed': False},
{'name': 'DCDC_OverVoltage', 'start': 26, 'length': 1, 'byte_order': 'little_endian', 'is_signed': False},
{'name': 'DCDC_UnderVoltage', 'start': 27, 'length': 1, 'byte_order': 'little_endian', 'is_signed': False},
{'name': 'DCDC_InputOverVoltage', 'start': 28, 'length': 1, 'byte_order': 'little_endian', 'is_signed': False},
{'name': 'DCDC_InputUnderVoltage', 'start': 29, 'length': 1, 'byte_order': 'little_endian', 'is_signed': False},
{'name': 'DCDC_ShortCircuit', 'start': 30, 'length': 1, 'byte_order': 'little_endian', 'is_signed': False},
{'name': 'DCDC_InternalFault', 'start': 31, 'length': 1, 'byte_order': 'little_endian', 'is_signed': False},
# Byte 4
{'name': 'DCDC_CommFault', 'start': 32, 'length': 1, 'byte_order': 'little_endian', 'is_signed': False},
{'name': 'DCDC_Running', 'start': 33, 'length': 1, 'byte_order': 'little_endian', 'is_signed': False},
{'name': 'CoolingPump1_Fault', 'start': 34, 'length': 1, 'byte_order': 'little_endian', 'is_signed': False},
{'name': 'CoolingPump2_Fault', 'start': 35, 'length': 1, 'byte_order': 'little_endian', 'is_signed': False},
{'name': 'CoolingWaterLeak', 'start': 36, 'length': 1, 'byte_order': 'little_endian', 'is_signed': False},
{'name': 'CoolingPump1_Running', 'start': 37, 'length': 1, 'byte_order': 'little_endian', 'is_signed': False},
{'name': 'CoolingPump2_Running', 'start': 38, 'length': 1, 'byte_order': 'little_endian', 'is_signed': False},
# Byte 5
{'name': 'PowerBus_InsulationLow', 'start': 40, 'length': 1, 'byte_order': 'little_endian', 'is_signed': False},
{'name': 'BusA_InsulationLow', 'start': 41, 'length': 1, 'byte_order': 'little_endian', 'is_signed': False},
{'name': 'MeterPowerLoss', 'start': 42, 'length': 1, 'byte_order': 'little_endian', 'is_signed': False},
{'name': 'EmergencyPowerLoss', 'start': 43, 'length': 1, 'byte_order': 'little_endian', 'is_signed': False},
# Byte 6 (Temperature)
{'name': 'DCDC_Temperature', 'start': 48, 'length': 8, 'byte_order': 'little_endian', 'is_signed': True, 'offset': -40, 'unit': '°C'}
]
},
{
'frame_id': 0x18A50201,
'name': 'PowerBusFeedback',
'length': 8,
'signals': [
# Byte 0-1: 动力汇流排电压 (16bit, 0.1V)
{'name': 'PowerBus_Voltage', 'start': 0, 'length': 16, 'byte_order': 'little_endian', 'is_signed': False, 'scale': 0.1, 'unit': 'V'},
# Byte 2-3: DC/DC5模块电流 (16bit, 0.1A)
{'name': 'DCDC5_Current', 'start': 16, 'length': 16, 'byte_order': 'little_endian', 'is_signed': False, 'scale': 0.1, 'unit': 'A'},
# Byte 4-5: 动力汇流排电流 (16bit, 0.1A)
{'name': 'PowerBus_Current', 'start': 32, 'length': 16, 'byte_order': 'little_endian', 'is_signed': False, 'scale': 0.1, 'unit': 'A'},
# Byte 6-7: A汇流排电压 (16bit, 0.1V)
{'name': 'BusA_Voltage', 'start': 48, 'length': 16, 'byte_order': 'little_endian', 'is_signed': False, 'scale': 0.1, 'unit': 'V'}
]
},
{
'frame_id': 0x18A50301,
'name': 'CurrentFeedback',
'length': 8,
'signals': [
# Byte 0: 推进电机控制箱电流 (16bit, 0.1A)
{'name': 'PropulsionMotor_Current', 'start': 0, 'length': 16, 'byte_order': 'little_endian', 'is_signed': False, 'scale': 0.1, 'unit': 'A'},
# Byte 2: A汇流排电流 (16bit, 0.1A)
{'name': 'BusA_Current', 'start': 16, 'length': 16, 'byte_order': 'little_endian', 'is_signed': False, 'scale': 0.1, 'unit': 'A'},
# Byte 4: 锂电池组(仪表)电流 (16bit, 0.1A)
{'name': 'BatteryMeter_Current', 'start': 32, 'length': 16, 'byte_order': 'little_endian', 'is_signed': False, 'scale': 0.1, 'unit': 'A'},
# Byte 6: 艏部高压配电箱电流 (16bit, 0.1A)
{'name': 'BowPowerBox_Current', 'start': 48, 'length': 16, 'byte_order': 'little_endian', 'is_signed': False, 'scale': 0.1, 'unit': 'A'}
]
},
{
'frame_id': 0x18A50401,
'name': 'SternCurrentFeedback',
'length': 8,
'signals': [
# Byte 0: 艉部FT装置4/5电流 (16bit, 0.1A)
{'name': 'SternFT45_Current', 'start': 0, 'length': 16, 'byte_order': 'little_endian', 'is_signed': False, 'scale': 0.1, 'unit': 'A'},
# Byte 2: TYZ预留开关电流 (16bit, 0.1A)
{'name': 'TYZReserve_Current', 'start': 16, 'length': 16, 'byte_order': 'little_endian', 'is_signed': False, 'scale': 0.1, 'unit': 'A'},
# Byte 4: 艉舵开关1电流 (16bit, 0.1A)
{'name': 'SternSwitch1_Current', 'start': 32, 'length': 16, 'byte_order': 'little_endian', 'is_signed': False, 'scale': 0.1, 'unit': 'A'},
# Byte 6: 预留电流 (16bit, 0.1A)
{'name': 'Reserve_Current', 'start': 48, 'length': 16, 'byte_order': 'little_endian', 'is_signed': False, 'scale': 0.1, 'unit': 'A'}
]
},
{
'frame_id': 0x18A50501,
'name': 'SternAdditionalFeedback',
'length': 8,
'signals': [
# Byte 0: 艉舵开关2电流 (16bit, 0.1A)
{'name': 'SternSwitch2_Current', 'start': 0, 'length': 16, 'byte_order': 'little_endian', 'is_signed': False, 'scale': 0.1, 'unit': 'A'},
# Byte 2: 预留电流 (16bit, 0.1A)
{'name': 'Reserve2_Current', 'start': 16, 'length': 16, 'byte_order': 'little_endian', 'is_signed': False, 'scale': 0.1, 'unit': 'A'},
# Byte 4: FB预留开关电流 (16bit, 0.1A)
{'name': 'FBReserve_Current', 'start': 32, 'length': 16, 'byte_order': 'little_endian', 'is_signed': False, 'scale': 0.1, 'unit': 'A'},
# Byte 6: 冷却水泄漏压力 (16bit, 0.1kPa)
{'name': 'CoolingWater_Pressure', 'start': 48, 'length': 16, 'byte_order': 'little_endian', 'is_signed': False, 'scale': 0.1, 'unit': 'kPa'}
]
},
{
'frame_id': 0x18A50601,
'name': 'BowBreakerFeedback',
'length': 8,
'signals': [
# Byte 0
{'name': 'BowFT13Breaker_Status', 'start': 0, 'length': 2, 'byte_order': 'little_endian', 'is_signed': False},
{'name': 'OpeningMechanismBreaker_Status', 'start': 2, 'length': 2, 'byte_order': 'little_endian', 'is_signed': False},
{'name': 'MastRudderBreaker_Status', 'start': 4, 'length': 2, 'byte_order': 'little_endian', 'is_signed': False},
{'name': 'XCZBreaker_Status', 'start': 6, 'length': 2, 'byte_order': 'little_endian', 'is_signed': False},
# Byte 1
{'name': 'BowRudderBreaker_Status', 'start': 8, 'length': 2, 'byte_order': 'little_endian', 'is_signed': False},
{'name': 'OpenWaterMechanismBreaker_Status', 'start': 10, 'length': 2, 'byte_order': 'little_endian', 'is_signed': False},
{'name': 'MeterPowerLoss', 'start': 12, 'length': 1, 'byte_order': 'little_endian', 'is_signed': False},
{'name': 'EmergencyPowerLoss', 'start': 13, 'length': 1, 'byte_order': 'little_endian', 'is_signed': False},
{'name': 'WaterLeakAlarm', 'start': 14, 'length': 1, 'byte_order': 'little_endian', 'is_signed': False}
]
},
{
'frame_id': 0x18A50701,
'name': 'BusBFeedback',
'length': 8,
'signals': [
# Byte 0-1: 汇流排B电压 (16bit, 0.1V)
{'name': 'BusB_Voltage', 'start': 0, 'length': 16, 'byte_order': 'little_endian', 'is_signed': False, 'scale': 0.1, 'unit': 'V'},
# Byte 2-3: 汇流排B电流 (16bit, 0.1A)
{'name': 'BusB_Current', 'start': 16, 'length': 16, 'byte_order': 'little_endian', 'is_signed': False, 'scale': 0.1, 'unit': 'A'},
# Byte 4-5: 艏部FT装置1-3电流 (16bit, 0.1A)
{'name': 'BowFT13_Current', 'start': 32, 'length': 16, 'byte_order': 'little_endian', 'is_signed': False, 'scale': 0.1, 'unit': 'A'},
# Byte 6-7: 启闭机构电流 (16bit, 0.1A)
{'name': 'OpeningMechanism_Current', 'start': 48, 'length': 16, 'byte_order': 'little_endian', 'is_signed': False, 'scale': 0.1, 'unit': 'A'}
]
},
{
'frame_id': 0x18A50801,
'name': 'BowMechanismFeedback',
'length': 8,
'signals': [
# Byte 0-1: 桅杆舵机控制箱电流 (16bit, 0.1A)
{'name': 'MastRudder_Current', 'start': 0, 'length': 16, 'byte_order': 'little_endian', 'is_signed': False, 'scale': 0.1, 'unit': 'A'},
# Byte 2-3: XCZ电流 (16bit, 0.1A)
{'name': 'XCZ_Current', 'start': 16, 'length': 16, 'byte_order': 'little_endian', 'is_signed': False, 'scale': 0.1, 'unit': 'A'},
# Byte 4-5: 艏舵控制箱电流 (16bit, 0.1A)
{'name': 'BowRudder_Current', 'start': 32, 'length': 16, 'byte_order': 'little_endian', 'is_signed': False, 'scale': 0.1, 'unit': 'A'},
# Byte 6-7: 敞水盖启动电缸电流 (16bit, 0.1A)
{'name': 'OpenWaterMechanism_Current', 'start': 48, 'length': 16, 'byte_order': 'little_endian', 'is_signed': False, 'scale': 0.1, 'unit': 'A'}
]
},
{
'frame_id': 0x18A50901,
'name': 'MeterBreakerFeedback',
'length': 8,
'signals': [
# Byte 0
{'name': 'BatteryMeterBreaker_Status', 'start': 0, 'length': 2, 'byte_order': 'little_endian', 'is_signed': False},
{'name': 'BowLowVoltageBoxBreaker_Status', 'start': 2, 'length': 2, 'byte_order': 'little_endian', 'is_signed': False},
{'name': 'Unit4MeterBreaker_Status', 'start': 4, 'length': 2, 'byte_order': 'little_endian', 'is_signed': False},
{'name': 'DCC1Breaker_Status', 'start': 6, 'length': 2, 'byte_order': 'little_endian', 'is_signed': False},
# Byte 1
{'name': 'Reserve1Breaker_Status', 'start': 8, 'length': 2, 'byte_order': 'little_endian', 'is_signed': False},
{'name': 'Reserve2Breaker_Status', 'start': 10, 'length': 2, 'byte_order': 'little_endian', 'is_signed': False},
{'name': 'EmergencyBattery2Breaker_Status', 'start': 12, 'length': 1, 'byte_order': 'little_endian', 'is_signed': False},
# Byte 2
{'name': 'MeterPowerLoss', 'start': 16, 'length': 1, 'byte_order': 'little_endian', 'is_signed': False},
{'name': 'EmergencyPowerLoss', 'start': 17, 'length': 1, 'byte_order': 'little_endian', 'is_signed': False},
{'name': 'MeterBusInsulationLow', 'start': 18, 'length': 1, 'byte_order': 'little_endian', 'is_signed': False}
]
},
{
'frame_id': 0x18A50A01,
'name': 'MeterBusFeedback',
'length': 8,
'signals': [
# Byte 0-1: 仪表母排电压 (16bit, 0.1V)
{'name': 'MeterBus_Voltage', 'start': 0, 'length': 16, 'byte_order': 'little_endian', 'is_signed': False, 'scale': 0.1, 'unit': 'V'},
# Byte 2-3: 艏部低压配电箱电流 (16bit, 0.1A)
{'name': 'BowLowVoltageBox_Current', 'start': 16, 'length': 16, 'byte_order': 'little_endian', 'is_signed': False, 'scale': 0.1, 'unit': 'A'},
# Byte 4-5: DC-C1仪表DC48V电流 (16bit, 0.1A)
{'name': 'DCC1Meter_Current', 'start': 32, 'length': 16, 'byte_order': 'little_endian', 'is_signed': False, 'scale': 0.1, 'unit': 'A'},
# Byte 6-7: 预留电流 (16bit, 0.1A)
{'name': 'Reserve3_Current', 'start': 48, 'length': 16, 'byte_order': 'little_endian', 'is_signed': False, 'scale': 0.1, 'unit': 'A'}
]
},
{
'frame_id': 0x18A50B01,
'name': 'EmergencyBatteryFeedback',
'length': 8,
'signals': [
# Byte 0-1: 应急锂电池组2电流 (16bit, 0.1A)
{'name': 'EmergencyBattery2_Current', 'start': 0, 'length': 16, 'byte_order': 'little_endian', 'is_signed': False, 'scale': 0.1, 'unit': 'A'},
# Byte 2-3: 锂电池组(仪表)电流 (16bit, 0.1A)
{'name': 'BatteryMeter_Current', 'start': 16, 'length': 16, 'byte_order': 'little_endian', 'is_signed': False, 'scale': 0.1, 'unit': 'A'},
# Byte 4-5: UNIT4仪表DC48V电流 (16bit, 0.1A)
{'name': 'Unit4Meter_Current', 'start': 32, 'length': 16, 'byte_order': 'little_endian', 'is_signed': False, 'scale': 0.1, 'unit': 'A'},
# Byte 6-7: 预留电流 (16bit, 0.1A)
{'name': 'Reserve4_Current', 'start': 48, 'length': 16, 'byte_order': 'little_endian', 'is_signed': False, 'scale': 0.1, 'unit': 'A'}
]
},
{
'frame_id': 0x18A50C01,
'name': 'EmergencyBus2Feedback',
'length': 8,
'signals': [
# Byte 0-1: 应急2汇流排电压 (16bit, 0.1V)
{'name': 'EmergencyBus2_Voltage', 'start': 0, 'length': 16, 'byte_order': 'little_endian', 'is_signed': False, 'scale': 0.1, 'unit': 'V'},
# Byte 2-3: 复合能源管控系统应急DC48V电流 (16bit, 0.1A)
{'name': 'EnergySystemEmergency_Current', 'start': 16, 'length': 16, 'byte_order': 'little_endian', 'is_signed': False, 'scale': 0.1, 'unit': 'A'},
# Byte 4-5: 燃料电池安保系统应急DC48V电流 (16bit, 0.1A)
{'name': 'FuelCellEmergency_Current', 'start': 32, 'length': 16, 'byte_order': 'little_endian', 'is_signed': False, 'scale': 0.1, 'unit': 'A'},
# Byte 6-7: PLC控制电源电流 (16bit, 0.1A)
{'name': 'PLCPower_Current', 'start': 48, 'length': 16, 'byte_order': 'little_endian', 'is_signed': False, 'scale': 0.1, 'unit': 'A'}
]
},
{
'frame_id': 0x18A50D01,
'name': 'UnitBreakerFeedback',
'length': 8,
'signals': [
# Byte 0
{'name': 'Unit1Breaker_Status', 'start': 0, 'length': 2, 'byte_order': 'little_endian', 'is_signed': False},
{'name': 'Unit2Breaker_Status', 'start': 2, 'length': 2, 'byte_order': 'little_endian', 'is_signed': False},
{'name': 'Unit3Breaker_Status', 'start': 4, 'length': 2, 'byte_order': 'little_endian', 'is_signed': False},
{'name': 'Unit5Breaker_Status', 'start': 6, 'length': 2, 'byte_order': 'little_endian', 'is_signed': False},
# Byte 1
{'name': 'BowPZBreaker_Status', 'start': 8, 'length': 2, 'byte_order': 'little_endian', 'is_signed': False},
{'name': 'Reserve5Breaker_Status', 'start': 10, 'length': 2, 'byte_order': 'little_endian', 'is_signed': False},
{'name': 'Reserve6Breaker_Status', 'start': 12, 'length': 2, 'byte_order': 'little_endian', 'is_signed': False},
{'name': 'EmergencyBattery1Breaker_Status', 'start': 14, 'length': 2, 'byte_order': 'little_endian', 'is_signed': False},
# Byte 2
{'name': 'MeterPowerLoss', 'start': 16, 'length': 1, 'byte_order': 'little_endian', 'is_signed': False},
{'name': 'EmergencyPowerLoss', 'start': 17, 'length': 1, 'byte_order': 'little_endian', 'is_signed': False},
{'name': 'WaterLeakAlarm', 'start': 18, 'length': 1, 'byte_order': 'little_endian', 'is_signed': False}
]
},
{
'frame_id': 0x18A50E01,
'name': 'MeterBus2Feedback',
'length': 8,
'signals': [
# Byte 0-1: 仪表母排电压 (16bit, 0.1V)
{'name': 'MeterBus2_Voltage', 'start': 0, 'length': 16, 'byte_order': 'little_endian', 'is_signed': False, 'scale': 0.1, 'unit': 'V'},
# Byte 2-3: 仪表母排电流 (16bit, 0.1A)
{'name': 'MeterBus2_Current', 'start': 16, 'length': 16, 'byte_order': 'little_endian', 'is_signed': False, 'scale': 0.1, 'unit': 'A'},
# Byte 4-5: UNIT1电流 (16bit, 0.1A)
{'name': 'Unit1_Current', 'start': 32, 'length': 16, 'byte_order': 'little_endian', 'is_signed': False, 'scale': 0.1, 'unit': 'A'},
# Byte 6-7: UNIT2电流 (16bit, 0.1A)
{'name': 'Unit2_Current', 'start': 48, 'length': 16, 'byte_order': 'little_endian', 'is_signed': False, 'scale': 0.1, 'unit': 'A'}
]
},
{
'frame_id': 0x18A50F01,
'name': 'UnitCurrentFeedback',
'length': 8,
'signals': [
# Byte 0-1: UNIT3电流 (16bit, 0.1A)
{'name': 'Unit3_Current', 'start': 0, 'length': 16, 'byte_order': 'little_endian', 'is_signed': False, 'scale': 0.1, 'unit': 'A'},
# Byte 2-3: UNIT5电流 (16bit, 0.1A)
{'name': 'Unit5_Current', 'start': 16, 'length': 16, 'byte_order': 'little_endian', 'is_signed': False, 'scale': 0.1, 'unit': 'A'},
# Byte 4-5: 艏部PZ装置电流 (16bit, 0.1A)
{'name': 'BowPZ_Current', 'start': 32, 'length': 16, 'byte_order': 'little_endian', 'is_signed': False, 'scale': 0.1, 'unit': 'A'},
# Byte 6-7: 应急锂电池组1电流 (16bit, 0.1A)
{'name': 'EmergencyBattery1_Current', 'start': 48, 'length': 16, 'byte_order': 'little_endian', 'is_signed': False, 'scale': 0.1, 'unit': 'A'}
]
},
{
'frame_id': 0x18A51001,
'name': 'EmergencyBus1Feedback',
'length': 8,
'signals': [
# Byte 0-1: 应急1汇流排电压 (16bit, 0.1V)
{'name': 'EmergencyBus1_Voltage', 'start': 0, 'length': 16, 'byte_order': 'little_endian', 'is_signed': False, 'scale': 0.1, 'unit': 'V'},
# Byte 2-3: 24V控制电源电流测量 (16bit, 0.1A)
{'name': 'ControlPower24V_Current', 'start': 16, 'length': 16, 'byte_order': 'little_endian', 'is_signed': False, 'scale': 0.1, 'unit': 'A'}
]
}
]
# 3. 遍历配置,创建 Message 和 Signal 对象并加入到 db
for msg_cfg in messages_config:
sig_list = []
for s in msg_cfg['signals']:
sig = Signal(
name=s['name'],
start=s['start'],
length=s['length'],
byte_order=s['byte_order'],
is_signed=s['is_signed']
)
sig_list.append(sig)
msg = Message(
frame_id=msg_cfg['frame_id'],
name=msg_cfg['name'],
length=msg_cfg['length'],
signals=sig_list,
is_extended_frame=True
)
db.messages.append(msg)
# 4. 将构造好的数据库导出为 DBC 字符串并写入文件
dbc_string = db.as_dbc_string()
with open(output_path, 'w', encoding='utf-8') as f:
f.write(dbc_string)
print(f"DBC 文件已生成:{output_path}")
if __name__ == '__main__':
build_dbc('output.dbc')