457 lines
28 KiB
Python
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')
|