# 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')