766 lines
36 KiB
Python
766 lines
36 KiB
Python
|
|
import struct
|
|
# 高压母线配电反馈
|
|
class msg_disHighVolBusFbMsg:
|
|
def __init__(self):
|
|
self.start1 = 0x40
|
|
self.start2 = 0x40
|
|
self.id = 0x0005
|
|
self.length = 59
|
|
self.checkCode = 0x00
|
|
|
|
# disHighVolBusState成员
|
|
self.fuelCellCircuitBreaker = 0x00
|
|
self.powerLithiumBatteryCircuitBreaker = 0x00
|
|
self.propulsionMotorCircuitBreaker = 0x00
|
|
self.lithiumBatteryGroupInstrumentCircuitBreaker = 0x00
|
|
self.dcDc5ModuleCircuitBreaker = 0x00
|
|
self.bowHighVoltageDistributionBoxCircuitBreaker = 0x00
|
|
self.sternFTDevice45CircuitBreaker = 0x00
|
|
self.sternRudderSwitch1CircuitBreaker = 0x00
|
|
self.sternRudderSwitch2CircuitBreaker = 0x00
|
|
self.fbReservedCircuitBreaker = 0x00
|
|
self.tyzReservedCircuitBreaker = 0x00
|
|
self.reservedCircuitBreaker = 0x00
|
|
self.dcDcFaultWord1 = 0x00
|
|
self.dcDcFaultWord2 = 0x00
|
|
self.powerBusInsulationStatus = 0x00
|
|
self.aBusInsulationStatus = 0x00
|
|
self.meterPowerLossSignal = 0x00
|
|
self.emergencyPowerLossSignal = 0x00
|
|
self.dcdcTemperature = 0x00
|
|
self.powerBusVoltage = 0
|
|
self.dcDc5ModuleCurrent = 0
|
|
self.powerBusCurrent = 0
|
|
self.busbarAVoltage = 0
|
|
self.propulsionMotorControlBoxCurrent = 0
|
|
self.busbarACurrent = 0
|
|
self.lithiumBatteryGroupMeterCurrent = 0
|
|
self.bowHighVoltageDistributionBoxCurrent = 0
|
|
self.sternFTDevice45Current = 0
|
|
self.tyzReservedSwitchCurrent = 0
|
|
self.sternRudderSwitch1Current = 0
|
|
self.reservedCurrent1 = 0
|
|
self.sternRudderSwitch2Current = 0
|
|
self.reservedCurrent2 = 0
|
|
self.fbReservedSwitchCurrent = 0
|
|
self.reservedCurrent3 = 0
|
|
self.coolWaterPressure = 0
|
|
|
|
def pack(self):
|
|
self.checkCode = 0x00
|
|
data = struct.pack('<B', self.start1)
|
|
data += struct.pack('<B', self.start2)
|
|
data += struct.pack('<H', self.id)
|
|
data += struct.pack('<H', self.length)
|
|
|
|
# 打包数据部分
|
|
data += struct.pack('<B', self.fuelCellCircuitBreaker)
|
|
data += struct.pack('<B', self.powerLithiumBatteryCircuitBreaker)
|
|
data += struct.pack('<B', self.propulsionMotorCircuitBreaker)
|
|
data += struct.pack('<B', self.lithiumBatteryGroupInstrumentCircuitBreaker)
|
|
data += struct.pack('<B', self.dcDc5ModuleCircuitBreaker)
|
|
data += struct.pack('<B', self.bowHighVoltageDistributionBoxCircuitBreaker)
|
|
data += struct.pack('<B', self.sternFTDevice45CircuitBreaker)
|
|
data += struct.pack('<B', self.sternRudderSwitch1CircuitBreaker)
|
|
data += struct.pack('<B', self.sternRudderSwitch2CircuitBreaker)
|
|
data += struct.pack('<B', self.fbReservedCircuitBreaker)
|
|
data += struct.pack('<B', self.tyzReservedCircuitBreaker)
|
|
data += struct.pack('<B', self.reservedCircuitBreaker)
|
|
data += struct.pack('<B', self.dcDcFaultWord1)
|
|
data += struct.pack('<B', self.dcDcFaultWord2)
|
|
data += struct.pack('<B', self.powerBusInsulationStatus)
|
|
data += struct.pack('<B', self.aBusInsulationStatus)
|
|
data += struct.pack('<B', self.meterPowerLossSignal)
|
|
data += struct.pack('<B', self.emergencyPowerLossSignal)
|
|
data += struct.pack('<B', self.dcdcTemperature)
|
|
data += struct.pack('<H', self.powerBusVoltage)
|
|
data += struct.pack('<H', self.dcDc5ModuleCurrent)
|
|
data += struct.pack('<H', self.powerBusCurrent)
|
|
data += struct.pack('<H', self.busbarAVoltage)
|
|
data += struct.pack('<H', self.propulsionMotorControlBoxCurrent)
|
|
data += struct.pack('<H', self.busbarACurrent)
|
|
data += struct.pack('<H', self.lithiumBatteryGroupMeterCurrent)
|
|
data += struct.pack('<H', self.bowHighVoltageDistributionBoxCurrent)
|
|
data += struct.pack('<H', self.sternFTDevice45Current)
|
|
data += struct.pack('<H', self.tyzReservedSwitchCurrent)
|
|
data += struct.pack('<H', self.sternRudderSwitch1Current)
|
|
data += struct.pack('<H', self.reservedCurrent1)
|
|
data += struct.pack('<H', self.sternRudderSwitch2Current)
|
|
data += struct.pack('<H', self.reservedCurrent2)
|
|
data += struct.pack('<H', self.fbReservedSwitchCurrent)
|
|
data += struct.pack('<H', self.reservedCurrent3)
|
|
data += struct.pack('<H', self.coolWaterPressure)
|
|
|
|
# 计算校验码
|
|
for byte in data:
|
|
self.checkCode = (self.checkCode + byte) & 0xFF
|
|
data += struct.pack('<B', self.checkCode)
|
|
print("size",len(data))
|
|
return data
|
|
|
|
def unpack(self, data):
|
|
# if len(data) < 4 + self.length + 1:
|
|
# return False
|
|
|
|
self.start1 = data[0]
|
|
self.start2 = data[1]
|
|
self.id = struct.unpack_from('<H', data, 2)[0]
|
|
self.length = struct.unpack_from('<H', data, 4)[0]
|
|
|
|
offset = 6
|
|
self.fuelCellCircuitBreaker = data[offset]; offset +=1
|
|
self.powerLithiumBatteryCircuitBreaker = data[offset]; offset +=1
|
|
self.propulsionMotorCircuitBreaker = data[offset]; offset +=1
|
|
self.lithiumBatteryGroupInstrumentCircuitBreaker = data[offset]; offset +=1
|
|
self.dcDc5ModuleCircuitBreaker = data[offset]; offset +=1
|
|
self.bowHighVoltageDistributionBoxCircuitBreaker = data[offset]; offset +=1
|
|
self.sternFTDevice45CircuitBreaker = data[offset]; offset +=1
|
|
self.sternRudderSwitch1CircuitBreaker = data[offset]; offset +=1
|
|
self.sternRudderSwitch2CircuitBreaker = data[offset]; offset +=1
|
|
self.fbReservedCircuitBreaker = data[offset]; offset +=1
|
|
self.tyzReservedCircuitBreaker = data[offset]; offset +=1
|
|
self.reservedCircuitBreaker = data[offset]; offset +=1
|
|
self.dcDcFaultWord1 = data[offset]; offset +=1
|
|
self.dcDcFaultWord2 = data[offset]; offset +=1
|
|
self.powerBusInsulationStatus = data[offset]; offset +=1
|
|
self.aBusInsulationStatus = data[offset]; offset +=1
|
|
self.meterPowerLossSignal = data[offset]; offset +=1
|
|
self.emergencyPowerLossSignal = data[offset]; offset +=1
|
|
self.dcdcTemperature = data[offset]; offset +=1 # 新增的温度信号解包
|
|
|
|
self.powerBusVoltage = struct.unpack_from('<H', data, offset)[0]; offset +=2
|
|
self.dcDc5ModuleCurrent = struct.unpack_from('<H', data, offset)[0]; offset +=2
|
|
self.powerBusCurrent = struct.unpack_from('<H', data, offset)[0]; offset +=2
|
|
self.busbarAVoltage = struct.unpack_from('<H', data, offset)[0]; offset +=2
|
|
self.propulsionMotorControlBoxCurrent = struct.unpack_from('<H', data, offset)[0]; offset +=2
|
|
self.busbarACurrent = struct.unpack_from('<H', data, offset)[0]; offset +=2
|
|
self.lithiumBatteryGroupMeterCurrent = struct.unpack_from('<H', data, offset)[0]; offset +=2
|
|
self.bowHighVoltageDistributionBoxCurrent = struct.unpack_from('<H', data, offset)[0]; offset +=2
|
|
self.sternFTDevice45Current = struct.unpack_from('<H', data, offset)[0]; offset +=2
|
|
self.tyzReservedSwitchCurrent = struct.unpack_from('<H', data, offset)[0]; offset +=2
|
|
self.sternRudderSwitch1Current = struct.unpack_from('<H', data, offset)[0]; offset +=2
|
|
self.reservedCurrent1 = struct.unpack_from('<H', data, offset)[0]; offset +=2
|
|
self.sternRudderSwitch2Current = struct.unpack_from('<H', data, offset)[0]; offset +=2
|
|
self.reservedCurrent2 = struct.unpack_from('<H', data, offset)[0]; offset +=2
|
|
self.fbReservedSwitchCurrent = struct.unpack_from('<H', data, offset)[0]; offset +=2
|
|
self.reservedCurrent3 = struct.unpack_from('<H', data, offset)[0]; offset +=2
|
|
self.coolWaterPressure = struct.unpack_from('<H', data, offset)[0]; offset +=2
|
|
|
|
# 校验校验码
|
|
checkCode = 0
|
|
for byte in data[:-1]: # 不包括校验码本身
|
|
checkCode = (checkCode + byte) & 0xFF
|
|
|
|
return checkCode == data[-1]
|
|
# 高压母线A配电反馈
|
|
class msg_disHighAVolBusFbMsg:
|
|
def __init__(self):
|
|
self.start1 = 0x40
|
|
self.start2 = 0x40
|
|
self.id = 0x0006
|
|
self.length = 18 # disHighAVolBusState结构体大小
|
|
self.checkCode = 0x00
|
|
|
|
# disHighAVolBusState成员
|
|
self.bowFTDevice123CircuitBreaker = 0x00
|
|
self.actuatorCircuitBreaker = 0x00
|
|
self.mastSteeringGearControlBoxCircuitBreaker = 0x00
|
|
self.xczCircuitBreaker = 0x00
|
|
self.bowRudderControlBoxCircuitBreaker = 0x00
|
|
self.openWaterCoverStartCylinderCircuitBreaker = 0x00
|
|
self.instrumentPowerFailureSignal = 0x00
|
|
self.emergencyPowerFailureSignal = 0x00
|
|
self.waterIngressionAlarm = 0x00
|
|
self.busbarBVoltage = 0
|
|
self.busbarBCurrent = 0
|
|
self.bowFTDevice123Current = 0
|
|
self.actuatorCurrent = 0
|
|
self.mastSteeringGearControlBoxCurrent = 0
|
|
self.xczCurrent = 0
|
|
self.bowRudderControlBoxCurrent = 0
|
|
self.openWaterCoverStartCylinderCurrent = 0
|
|
|
|
def pack(self):
|
|
self.checkCode = 0x00
|
|
data = struct.pack('<B', self.start1)
|
|
data += struct.pack('<B', self.start2)
|
|
data += struct.pack('<H', self.id)
|
|
data += struct.pack('<H', self.length)
|
|
|
|
# 打包数据部分
|
|
data += struct.pack('<B', self.bowFTDevice123CircuitBreaker)
|
|
data += struct.pack('<B', self.actuatorCircuitBreaker)
|
|
data += struct.pack('<B', self.mastSteeringGearControlBoxCircuitBreaker)
|
|
data += struct.pack('<B', self.xczCircuitBreaker)
|
|
data += struct.pack('<B', self.bowRudderControlBoxCircuitBreaker)
|
|
data += struct.pack('<B', self.openWaterCoverStartCylinderCircuitBreaker)
|
|
data += struct.pack('<B', self.instrumentPowerFailureSignal)
|
|
data += struct.pack('<B', self.emergencyPowerFailureSignal)
|
|
data += struct.pack('<B', self.waterIngressionAlarm)
|
|
data += struct.pack('<H', self.busbarBVoltage)
|
|
data += struct.pack('<H', self.busbarBCurrent)
|
|
data += struct.pack('<H', self.bowFTDevice123Current)
|
|
data += struct.pack('<H', self.actuatorCurrent)
|
|
data += struct.pack('<H', self.mastSteeringGearControlBoxCurrent)
|
|
data += struct.pack('<H', self.xczCurrent)
|
|
data += struct.pack('<H', self.bowRudderControlBoxCurrent)
|
|
data += struct.pack('<H', self.openWaterCoverStartCylinderCurrent)
|
|
|
|
# 计算校验码
|
|
for byte in data:
|
|
self.checkCode = (self.checkCode + byte) & 0xFF
|
|
data += struct.pack('<B', self.checkCode)
|
|
|
|
return data
|
|
|
|
def unpack(self, data):
|
|
if len(data) < 4 + self.length + 1: # 头部4字节+数据长度+校验码1字节
|
|
return False
|
|
|
|
self.start1 = data[0]
|
|
self.start2 = data[1]
|
|
self.id = struct.unpack_from('<H', data, 2)[0]
|
|
self.length = struct.unpack_from('<H', data, 4)[0]
|
|
|
|
offset = 6 # 头部结束位置
|
|
self.bowFTDevice123CircuitBreaker = data[offset]; offset +=1
|
|
self.actuatorCircuitBreaker = data[offset]; offset +=1
|
|
self.mastSteeringGearControlBoxCircuitBreaker = data[offset]; offset +=1
|
|
self.xczCircuitBreaker = data[offset]; offset +=1
|
|
self.bowRudderControlBoxCircuitBreaker = data[offset]; offset +=1
|
|
self.openWaterCoverStartCylinderCircuitBreaker = data[offset]; offset +=1
|
|
self.instrumentPowerFailureSignal = data[offset]; offset +=1
|
|
self.emergencyPowerFailureSignal = data[offset]; offset +=1
|
|
self.waterIngressionAlarm = data[offset]; offset +=1
|
|
self.busbarBVoltage = struct.unpack_from('<H', data, offset)[0]; offset +=2
|
|
self.busbarBCurrent = struct.unpack_from('<H', data, offset)[0]; offset +=2
|
|
self.bowFTDevice123Current = struct.unpack_from('<H', data, offset)[0]; offset +=2
|
|
self.actuatorCurrent = struct.unpack_from('<H', data, offset)[0]; offset +=2
|
|
self.mastSteeringGearControlBoxCurrent = struct.unpack_from('<H', data, offset)[0]; offset +=2
|
|
self.xczCurrent = struct.unpack_from('<H', data, offset)[0]; offset +=2
|
|
self.bowRudderControlBoxCurrent = struct.unpack_from('<H', data, offset)[0]; offset +=2
|
|
self.openWaterCoverStartCylinderCurrent = struct.unpack_from('<H', data, offset)[0]; offset +=2
|
|
|
|
# 校验校验码
|
|
checkCode = 0
|
|
for byte in data[:-1]: # 不包括校验码本身
|
|
checkCode = (checkCode + byte) & 0xFF
|
|
|
|
return checkCode == data[-1]
|
|
|
|
# 仪表母线配电反馈
|
|
class msg_disLowMainBusFbMsg:
|
|
def __init__(self):
|
|
self.start1 = 0x40
|
|
self.start2 = 0x40
|
|
self.id = 0x0007
|
|
self.length = 36 # disLowMainBusState结构体大小
|
|
self.checkCode = 0x00
|
|
|
|
# disLowMainBusState成员
|
|
self.lithiumBatteryGroupInstrumentCircuitBreaker = 0x00
|
|
self.bowLowVoltageDistributionBoxCircuitBreaker = 0x00
|
|
self.unit4InstrumentDC48VCircuitBreaker = 0x00
|
|
self.dcC1DCDistributionPanelCircuitBreaker = 0x00
|
|
self.reservedCircuitBreaker1 = 0x00
|
|
self.reservedCircuitBreaker2 = 0x00
|
|
self.emergencyLithiumBatteryGroup2CircuitBreaker = 0x00
|
|
self.instrumentPowerFailureSignal = 0x00
|
|
self.emergencyPowerFailureSignal = 0x00
|
|
self.instrumentBusbarInsulationLow = 0x00
|
|
self.instrumentBusbarVoltage = 0
|
|
self.bowLowVoltageDistributionBoxCurrent = 0
|
|
self.dcC1InstrumentDC48VCurrent = 0
|
|
self.reservedCurrent1 = 0
|
|
self.emergencyLithiumBatteryGroup2Current = 0
|
|
self.lithiumBatteryGroupInstrumentCurrent = 0
|
|
self.unit4InstrumentDC48VCurrent = 0
|
|
self.reservedCurrent2 = 0
|
|
self.emergency2BusbarVoltage = 0
|
|
self.compositeEnergyManagementSystemEmergencyDC48VCurrent = 0
|
|
self.fuelCellSecuritySystemEmergencyDC48VCurrent = 0
|
|
self.plcControlPowerCurrent = 0
|
|
|
|
def pack(self):
|
|
self.checkCode = 0x00
|
|
data = struct.pack('<B', self.start1)
|
|
data += struct.pack('<B', self.start2)
|
|
data += struct.pack('<H', self.id)
|
|
data += struct.pack('<H', self.length)
|
|
|
|
# 打包数据部分
|
|
data += struct.pack('<B', self.lithiumBatteryGroupInstrumentCircuitBreaker)
|
|
data += struct.pack('<B', self.bowLowVoltageDistributionBoxCircuitBreaker)
|
|
data += struct.pack('<B', self.unit4InstrumentDC48VCircuitBreaker)
|
|
data += struct.pack('<B', self.dcC1DCDistributionPanelCircuitBreaker)
|
|
data += struct.pack('<B', self.reservedCircuitBreaker1)
|
|
data += struct.pack('<B', self.reservedCircuitBreaker2)
|
|
data += struct.pack('<B', self.emergencyLithiumBatteryGroup2CircuitBreaker)
|
|
data += struct.pack('<B', self.instrumentPowerFailureSignal)
|
|
data += struct.pack('<B', self.emergencyPowerFailureSignal)
|
|
data += struct.pack('<B', self.instrumentBusbarInsulationLow)
|
|
data += struct.pack('<H', self.instrumentBusbarVoltage)
|
|
data += struct.pack('<H', self.bowLowVoltageDistributionBoxCurrent)
|
|
data += struct.pack('<H', self.dcC1InstrumentDC48VCurrent)
|
|
data += struct.pack('<H', self.reservedCurrent1)
|
|
data += struct.pack('<H', self.emergencyLithiumBatteryGroup2Current)
|
|
data += struct.pack('<H', self.lithiumBatteryGroupInstrumentCurrent)
|
|
data += struct.pack('<H', self.unit4InstrumentDC48VCurrent)
|
|
data += struct.pack('<H', self.reservedCurrent2)
|
|
data += struct.pack('<H', self.emergency2BusbarVoltage)
|
|
data += struct.pack('<H', self.compositeEnergyManagementSystemEmergencyDC48VCurrent)
|
|
data += struct.pack('<H', self.fuelCellSecuritySystemEmergencyDC48VCurrent)
|
|
data += struct.pack('<H', self.plcControlPowerCurrent)
|
|
|
|
# 计算校验码
|
|
for byte in data:
|
|
self.checkCode = (self.checkCode + byte) & 0xFF
|
|
data += struct.pack('<B', self.checkCode)
|
|
|
|
return data
|
|
|
|
def unpack(self, data):
|
|
if len(data) < 4 + self.length + 1: # 头部4字节+数据长度+校验码1字节
|
|
return False
|
|
|
|
self.start1 = data[0]
|
|
self.start2 = data[1]
|
|
self.id = struct.unpack_from('<H', data, 2)[0]
|
|
self.length = struct.unpack_from('<H', data, 4)[0]
|
|
|
|
offset = 6 # 头部结束位置
|
|
self.lithiumBatteryGroupInstrumentCircuitBreaker = data[offset]; offset +=1
|
|
self.bowLowVoltageDistributionBoxCircuitBreaker = data[offset]; offset +=1
|
|
self.unit4InstrumentDC48VCircuitBreaker = data[offset]; offset +=1
|
|
self.dcC1DCDistributionPanelCircuitBreaker = data[offset]; offset +=1
|
|
self.reservedCircuitBreaker1 = data[offset]; offset +=1
|
|
self.reservedCircuitBreaker2 = data[offset]; offset +=1
|
|
self.emergencyLithiumBatteryGroup2CircuitBreaker = data[offset]; offset +=1
|
|
self.instrumentPowerFailureSignal = data[offset]; offset +=1
|
|
self.emergencyPowerFailureSignal = data[offset]; offset +=1
|
|
self.instrumentBusbarInsulationLow = data[offset]; offset +=1
|
|
self.instrumentBusbarVoltage = struct.unpack_from('<H', data, offset)[0]; offset +=2
|
|
self.bowLowVoltageDistributionBoxCurrent = struct.unpack_from('<H', data, offset)[0]; offset +=2
|
|
self.dcC1InstrumentDC48VCurrent = struct.unpack_from('<H', data, offset)[0]; offset +=2
|
|
self.reservedCurrent1 = struct.unpack_from('<H', data, offset)[0]; offset +=2
|
|
self.emergencyLithiumBatteryGroup2Current = struct.unpack_from('<H', data, offset)[0]; offset +=2
|
|
self.lithiumBatteryGroupInstrumentCurrent = struct.unpack_from('<H', data, offset)[0]; offset +=2
|
|
self.unit4InstrumentDC48VCurrent = struct.unpack_from('<H', data, offset)[0]; offset +=2
|
|
self.reservedCurrent2 = struct.unpack_from('<H', data, offset)[0]; offset +=2
|
|
self.emergency2BusbarVoltage = struct.unpack_from('<H', data, offset)[0]; offset +=2
|
|
self.compositeEnergyManagementSystemEmergencyDC48VCurrent = struct.unpack_from('<H', data, offset)[0]; offset +=2
|
|
self.fuelCellSecuritySystemEmergencyDC48VCurrent = struct.unpack_from('<H', data, offset)[0]; offset +=2
|
|
self.plcControlPowerCurrent = struct.unpack_from('<H', data, offset)[0]; offset +=2
|
|
|
|
# 校验校验码
|
|
checkCode = 0
|
|
for byte in data[:-1]: # 不包括校验码本身
|
|
checkCode = (checkCode + byte) & 0xFF
|
|
|
|
return checkCode == data[-1]
|
|
|
|
# 仪表汇流排配电反馈
|
|
class msg_disLowBusFbMsg:
|
|
def __init__(self):
|
|
self.start1 = 0x40
|
|
self.start2 = 0x40
|
|
self.id = 0x0008
|
|
self.length = 25 # disLowBusState结构体大小
|
|
self.checkCode = 0x00
|
|
|
|
# disLowBusState成员
|
|
self.unit1CircuitBreaker = 0x00
|
|
self.unit2CircuitBreaker = 0x00
|
|
self.unit3CircuitBreaker = 0x00
|
|
self.unit5CircuitBreaker = 0x00
|
|
self.bowPZDeviceCircuitBreaker = 0x00
|
|
self.reservedCircuitBreaker1 = 0x00
|
|
self.reservedCircuitBreaker2 = 0x00
|
|
self.emergencyLithiumBatteryGroup1CircuitBreaker = 0x00
|
|
self.instrumentPowerFailureSignal = 0x00
|
|
self.emergencyPowerFailureSignal = 0x00
|
|
self.waterIngressionAlarm = 0x00
|
|
self.instrumentBusbarVoltage = 0
|
|
self.instrumentBusbarCurrent = 0
|
|
self.unit1Current = 0
|
|
self.unit2Current = 0
|
|
self.unit3Current = 0
|
|
self.unit5Current = 0
|
|
self.bowPZDeviceCurrent = 0
|
|
self.emergencyLithiumBatteryGroup1Current = 0
|
|
self.emergency1BusbarVoltage = 0
|
|
|
|
def pack(self):
|
|
self.checkCode = 0x00
|
|
data = struct.pack('<B', self.start1)
|
|
data += struct.pack('<B', self.start2)
|
|
data += struct.pack('<H', self.id)
|
|
data += struct.pack('<H', self.length)
|
|
|
|
# 打包数据部分
|
|
data += struct.pack('<B', self.unit1CircuitBreaker)
|
|
data += struct.pack('<B', self.unit2CircuitBreaker)
|
|
data += struct.pack('<B', self.unit3CircuitBreaker)
|
|
data += struct.pack('<B', self.unit5CircuitBreaker)
|
|
data += struct.pack('<B', self.bowPZDeviceCircuitBreaker)
|
|
data += struct.pack('<B', self.reservedCircuitBreaker1)
|
|
data += struct.pack('<B', self.reservedCircuitBreaker2)
|
|
data += struct.pack('<B', self.emergencyLithiumBatteryGroup1CircuitBreaker)
|
|
data += struct.pack('<B', self.instrumentPowerFailureSignal)
|
|
data += struct.pack('<B', self.emergencyPowerFailureSignal)
|
|
data += struct.pack('<B', self.waterIngressionAlarm)
|
|
data += struct.pack('<H', self.instrumentBusbarVoltage)
|
|
data += struct.pack('<H', self.instrumentBusbarCurrent)
|
|
data += struct.pack('<H', self.unit1Current)
|
|
data += struct.pack('<H', self.unit2Current)
|
|
data += struct.pack('<H', self.unit3Current)
|
|
data += struct.pack('<H', self.unit5Current)
|
|
data += struct.pack('<H', self.bowPZDeviceCurrent)
|
|
data += struct.pack('<H', self.emergencyLithiumBatteryGroup1Current)
|
|
data += struct.pack('<H', self.emergency1BusbarVoltage)
|
|
|
|
# 计算校验码
|
|
for byte in data:
|
|
self.checkCode = (self.checkCode + byte) & 0xFF
|
|
data += struct.pack('<B', self.checkCode)
|
|
|
|
return data
|
|
|
|
def unpack(self, data):
|
|
# if len(data) < 4 + self.length + 1: # 头部4字节+数据长度+校验码1字节
|
|
# return False
|
|
|
|
self.start1 = data[0]
|
|
self.start2 = data[1]
|
|
self.id = struct.unpack_from('<H', data, 2)[0]
|
|
self.length = struct.unpack_from('<H', data, 4)[0]
|
|
|
|
offset = 6 # 头部结束位置
|
|
self.unit1CircuitBreaker = data[offset]; offset +=1
|
|
self.unit2CircuitBreaker = data[offset]; offset +=1
|
|
self.unit3CircuitBreaker = data[offset]; offset +=1
|
|
self.unit5CircuitBreaker = data[offset]; offset +=1
|
|
self.bowPZDeviceCircuitBreaker = data[offset]; offset +=1
|
|
self.reservedCircuitBreaker1 = data[offset]; offset +=1
|
|
self.reservedCircuitBreaker2 = data[offset]; offset +=1
|
|
self.emergencyLithiumBatteryGroup1CircuitBreaker = data[offset]; offset +=1
|
|
# self.powerFailureSignal = data[offset]; offset +=1
|
|
self.instrumentPowerFailureSignal = data[offset]; offset +=1
|
|
self.emergencyPowerFailureSignal = data[offset]; offset +=1
|
|
self.waterIngressionAlarm = data[offset]; offset +=1
|
|
self.instrumentBusbarVoltage = struct.unpack_from('<H', data, offset)[0]; offset +=2
|
|
self.instrumentBusbarCurrent = struct.unpack_from('<H', data, offset)[0]; offset +=2
|
|
self.unit1Current = struct.unpack_from('<H', data, offset)[0]; offset +=2
|
|
self.unit2Current = struct.unpack_from('<H', data, offset)[0]; offset +=2
|
|
self.unit3Current = struct.unpack_from('<H', data, offset)[0]; offset +=2
|
|
self.unit5Current = struct.unpack_from('<H', data, offset)[0]; offset +=2
|
|
self.bowPZDeviceCurrent = struct.unpack_from('<H', data, offset)[0]; offset +=2
|
|
self.emergencyLithiumBatteryGroup1Current = struct.unpack_from('<H', data, offset)[0]; offset +=2
|
|
self.emergency1BusbarVoltage = struct.unpack_from('<H', data, offset)[0]; offset +=2
|
|
|
|
# 校验校验码
|
|
checkCode = 0
|
|
for byte in data[:-1]: # 不包括校验码本身
|
|
checkCode = (checkCode + byte) & 0xFF
|
|
|
|
return checkCode == data[-1]
|
|
|
|
# 动力母线配电指令
|
|
class msg_disHVBCmdMsg:
|
|
def __init__(self):
|
|
self.start1 = 0x40
|
|
self.start2 = 0x40
|
|
self.id = 0x0001
|
|
self.length = 18 # disHighVolBusCmd结构体大小
|
|
self.checkCode = 0x00
|
|
|
|
# disHighVolBusCmd成员
|
|
self.fuelCellCircuitBreaker = 0x00
|
|
self.powerLithiumBatteryCircuitBreaker = 0x00
|
|
self.propulsionMotorCircuitBreaker = 0x00
|
|
self.lithiumBatteryGroupInstrumentCircuitBreaker = 0x00
|
|
self.dcDc5ModuleCircuitBreaker = 0x00
|
|
self.bowHighVoltageDistributionBoxCircuitBreaker = 0x00
|
|
self.sternFTDevice45CircuitBreaker = 0x00
|
|
self.sternRudderSwitch1CircuitBreaker = 0x00
|
|
self.sternRudderSwitch2CircuitBreaker = 0x00
|
|
self.fbReservedCircuitBreaker = 0x00
|
|
self.tyzReservedCircuitBreaker = 0x00
|
|
self.reservedCircuitBreaker = 0x00
|
|
self.dcdc5Module = 0x00
|
|
self.coolingSystem = 0x00
|
|
|
|
def pack(self):
|
|
self.checkCode = 0x00
|
|
data = struct.pack('<B', self.start1)
|
|
data += struct.pack('<B', self.start2)
|
|
data += struct.pack('<H', self.id)
|
|
data += struct.pack('<H', self.length)
|
|
|
|
# 打包数据部分
|
|
data += struct.pack('<B', self.fuelCellCircuitBreaker)
|
|
data += struct.pack('<B', self.powerLithiumBatteryCircuitBreaker)
|
|
data += struct.pack('<B', self.propulsionMotorCircuitBreaker)
|
|
data += struct.pack('<B', self.lithiumBatteryGroupInstrumentCircuitBreaker)
|
|
data += struct.pack('<B', self.dcDc5ModuleCircuitBreaker)
|
|
data += struct.pack('<B', self.bowHighVoltageDistributionBoxCircuitBreaker)
|
|
data += struct.pack('<B', self.sternFTDevice45CircuitBreaker)
|
|
data += struct.pack('<B', self.sternRudderSwitch1CircuitBreaker)
|
|
data += struct.pack('<B', self.sternRudderSwitch2CircuitBreaker)
|
|
data += struct.pack('<B', self.fbReservedCircuitBreaker)
|
|
data += struct.pack('<B', self.tyzReservedCircuitBreaker)
|
|
data += struct.pack('<B', self.reservedCircuitBreaker)
|
|
data += struct.pack('<B', self.dcdc5Module)
|
|
data += struct.pack('<B', self.coolingSystem)
|
|
|
|
# 计算校验码
|
|
for byte in data:
|
|
self.checkCode = (self.checkCode + byte) & 0xFF
|
|
data += struct.pack('<B', self.checkCode)
|
|
|
|
return data
|
|
|
|
def unpack(self, data):
|
|
if len(data) < 4 + self.length + 1: # 头部4字节+数据长度+校验码1字节
|
|
return False
|
|
|
|
self.start1 = data[0]
|
|
self.start2 = data[1]
|
|
self.id = struct.unpack_from('<H', data, 2)[0]
|
|
self.length = struct.unpack_from('<H', data, 4)[0]
|
|
|
|
offset = 6 # 头部结束位置
|
|
self.fuelCellCircuitBreaker = data[offset]; offset +=1
|
|
self.powerLithiumBatteryCircuitBreaker = data[offset]; offset +=1
|
|
self.propulsionMotorCircuitBreaker = data[offset]; offset +=1
|
|
self.lithiumBatteryGroupInstrumentCircuitBreaker = data[offset]; offset +=1
|
|
self.dcDc5ModuleCircuitBreaker = data[offset]; offset +=1
|
|
self.bowHighVoltageDistributionBoxCircuitBreaker = data[offset]; offset +=1
|
|
self.sternFTDevice45CircuitBreaker = data[offset]; offset +=1
|
|
self.sternRudderSwitch1CircuitBreaker = data[offset]; offset +=1
|
|
self.sternRudderSwitch2CircuitBreaker = data[offset]; offset +=1
|
|
self.fbReservedCircuitBreaker = data[offset]; offset +=1
|
|
self.tyzReservedCircuitBreaker = data[offset]; offset +=1
|
|
self.reservedCircuitBreaker = data[offset]; offset +=1
|
|
self.dcdc5Module = data[offset]; offset +=1
|
|
self.coolingSystem = data[offset]; offset +=1
|
|
|
|
# 校验校验码
|
|
checkCode = 0
|
|
for byte in data[:-1]: # 不包括校验码本身
|
|
checkCode = (checkCode + byte) & 0xFF
|
|
|
|
return checkCode == data[-1]
|
|
|
|
# 动力汇流排A配电指令
|
|
class msg_disHVBACmdMsg:
|
|
def __init__(self):
|
|
self.start1 = 0x40
|
|
self.start2 = 0x40
|
|
self.id = 0x0002
|
|
self.length = 6 # disHighAVolBusCmd结构体大小(6个unsigned char)
|
|
self.checkCode = 0x00
|
|
|
|
# disHighAVolBusCmd成员
|
|
self.bowFTDevice123CircuitBreaker = 0x00
|
|
self.actuatorCircuitBreaker = 0x00
|
|
self.mastSteeringGearControlBoxCircuitBreaker = 0x00
|
|
self.xczCircuitBreaker = 0x00
|
|
self.bowRudderControlBoxCircuitBreaker = 0x00
|
|
self.openWaterCoverStartCylinderCircuitBreaker = 0x00
|
|
|
|
def pack(self):
|
|
self.checkCode = 0x00
|
|
data = struct.pack('<B', self.start1)
|
|
data += struct.pack('<B', self.start2)
|
|
data += struct.pack('<H', self.id)
|
|
data += struct.pack('<H', self.length)
|
|
|
|
# 打包数据部分(6个断路器)
|
|
data += struct.pack('<B', self.bowFTDevice123CircuitBreaker)
|
|
data += struct.pack('<B', self.actuatorCircuitBreaker)
|
|
data += struct.pack('<B', self.mastSteeringGearControlBoxCircuitBreaker)
|
|
data += struct.pack('<B', self.xczCircuitBreaker)
|
|
data += struct.pack('<B', self.bowRudderControlBoxCircuitBreaker)
|
|
data += struct.pack('<B', self.openWaterCoverStartCylinderCircuitBreaker)
|
|
|
|
# 计算校验码
|
|
for byte in data:
|
|
self.checkCode = (self.checkCode + byte) & 0xFF
|
|
data += struct.pack('<B', self.checkCode)
|
|
|
|
return data
|
|
|
|
def unpack(self, data):
|
|
if len(data) < 4 + self.length + 1: # 头部4字节+数据长度+校验码1字节
|
|
return False
|
|
|
|
self.start1 = data[0]
|
|
self.start2 = data[1]
|
|
self.id = struct.unpack_from('<H', data, 2)[0]
|
|
self.length = struct.unpack_from('<H', data, 4)[0]
|
|
|
|
offset = 6 # 头部结束位置
|
|
self.bowFTDevice123CircuitBreaker = data[offset]; offset +=1
|
|
self.actuatorCircuitBreaker = data[offset]; offset +=1
|
|
self.mastSteeringGearControlBoxCircuitBreaker = data[offset]; offset +=1
|
|
self.xczCircuitBreaker = data[offset]; offset +=1
|
|
self.bowRudderControlBoxCircuitBreaker = data[offset]; offset +=1
|
|
self.openWaterCoverStartCylinderCircuitBreaker = data[offset]; offset +=1
|
|
self.bowRudderControlBoxCurrent = struct.unpack_from('<H', data, offset)[0]; offset +=2
|
|
self.openWaterCoverStartCylinderCurrent = struct.unpack_from('<H', data, offset)[0]; offset +=2
|
|
|
|
# 校验校验码
|
|
checkCode = 0
|
|
for byte in data[:-1]: # 不包括校验码本身
|
|
checkCode = (checkCode + byte) & 0xFF
|
|
|
|
return checkCode == data[-1]
|
|
# 仪表母线配电指令
|
|
class msg_disLVMBCmdMsg:
|
|
def __init__(self):
|
|
self.start1 = 0x40
|
|
self.start2 = 0x40
|
|
self.id = 0x0003
|
|
self.length = 8 # disLowMainBusCmd结构体大小
|
|
self.checkCode = 0x00
|
|
|
|
# disLowMainBusCmd成员
|
|
self.lithiumBatteryGroupInstrumentCircuitBreaker = 0x00
|
|
self.bowLowVoltageDistributionBoxCircuitBreaker = 0x00
|
|
self.unit4InstrumentDC48VCircuitBreaker = 0x00
|
|
self.dcC1DCDistributionPanelCircuitBreaker = 0x00
|
|
self.reservedCircuitBreaker1 = 0x00
|
|
self.reservedCircuitBreaker2 = 0x00
|
|
self.emergencyLithiumBatteryGroup2CircuitBreaker = 0x00
|
|
|
|
def pack(self):
|
|
self.checkCode = 0x00
|
|
data = struct.pack('<B', self.start1)
|
|
data += struct.pack('<B', self.start2)
|
|
data += struct.pack('<H', self.id)
|
|
data += struct.pack('<H', self.length)
|
|
|
|
# 打包数据部分
|
|
data += struct.pack('<B', self.lithiumBatteryGroupInstrumentCircuitBreaker)
|
|
data += struct.pack('<B', self.bowLowVoltageDistributionBoxCircuitBreaker)
|
|
data += struct.pack('<B', self.unit4InstrumentDC48VCircuitBreaker)
|
|
data += struct.pack('<B', self.dcC1DCDistributionPanelCircuitBreaker)
|
|
data += struct.pack('<B', self.reservedCircuitBreaker1)
|
|
data += struct.pack('<B', self.reservedCircuitBreaker2)
|
|
data += struct.pack('<B', self.emergencyLithiumBatteryGroup2CircuitBreaker)
|
|
|
|
# 计算校验码
|
|
for byte in data:
|
|
self.checkCode = (self.checkCode + byte) & 0xFF
|
|
data += struct.pack('<B', self.checkCode)
|
|
|
|
#打印data
|
|
print("data:", data)
|
|
return data
|
|
|
|
def unpack(self, data):
|
|
if len(data) < 4 + self.length + 1: # 头部4字节+数据长度+校验码1字节
|
|
return False
|
|
|
|
self.start1 = data[0]
|
|
self.start2 = data[1]
|
|
self.id = struct.unpack_from('<H', data, 2)[0]
|
|
self.length = struct.unpack_from('<H', data, 4)[0]
|
|
|
|
offset = 6 # 头部结束位置
|
|
self.lithiumBatteryGroupInstrumentCircuitBreaker = data[offset]; offset +=1
|
|
self.bowLowVoltageDistributionBoxCircuitBreaker = data[offset]; offset +=1
|
|
self.unit4InstrumentDC48VCircuitBreaker = data[offset]; offset +=1
|
|
self.dcC1DCDistributionPanelCircuitBreaker = data[offset]; offset +=1
|
|
self.reservedCircuitBreaker1 = data[offset]; offset +=1
|
|
self.reservedCircuitBreaker2 = data[offset]; offset +=1
|
|
self.emergencyLithiumBatteryGroup2CircuitBreaker = data[offset]; offset +=1
|
|
|
|
# 校验校验码
|
|
checkCode = 0
|
|
for byte in data[:-1]: # 不包括校验码本身
|
|
checkCode = (checkCode + byte) & 0xFF
|
|
|
|
return checkCode == data[-1]
|
|
|
|
# 仪表汇流排配电指令
|
|
class msg_disLVBCmdMsg:
|
|
def __init__(self):
|
|
self.start1 = 0x40
|
|
self.start2 = 0x40
|
|
self.id = 0x0004
|
|
self.length = 8 # disLowBusCmd结构体大小
|
|
self.checkCode = 0x00
|
|
|
|
# disLowBusCmd成员
|
|
self.unit1CircuitBreaker = 0x00
|
|
self.unit2CircuitBreaker = 0x00
|
|
self.unit3CircuitBreaker = 0x00
|
|
self.unit5CircuitBreaker = 0x00
|
|
self.bowPZDeviceCircuitBreaker = 0x00
|
|
self.reservedCircuitBreaker1 = 0x00
|
|
self.reservedCircuitBreaker2 = 0x00
|
|
self.emergencyLithiumBatteryGroup1CircuitBreaker = 0x00
|
|
|
|
def pack(self):
|
|
self.checkCode = 0x00
|
|
data = struct.pack('<B', self.start1)
|
|
data += struct.pack('<B', self.start2)
|
|
data += struct.pack('<H', self.id)
|
|
data += struct.pack('<H', self.length)
|
|
|
|
# 打包数据部分
|
|
data += struct.pack('<B', self.unit1CircuitBreaker)
|
|
data += struct.pack('<B', self.unit2CircuitBreaker)
|
|
data += struct.pack('<B', self.unit3CircuitBreaker)
|
|
data += struct.pack('<B', self.unit5CircuitBreaker)
|
|
data += struct.pack('<B', self.bowPZDeviceCircuitBreaker)
|
|
data += struct.pack('<B', self.reservedCircuitBreaker1)
|
|
data += struct.pack('<B', self.reservedCircuitBreaker2)
|
|
data += struct.pack('<B', self.emergencyLithiumBatteryGroup1CircuitBreaker)
|
|
|
|
# 计算校验码
|
|
for byte in data:
|
|
self.checkCode = (self.checkCode + byte) & 0xFF
|
|
data += struct.pack('<B', self.checkCode)
|
|
|
|
return data
|
|
|
|
def unpack(self, data):
|
|
if len(data) < 4 + self.length + 1: # 头部4字节+数据长度+校验码1字节
|
|
return False
|
|
|
|
self.start1 = data[0]
|
|
self.start2 = data[1]
|
|
self.id = struct.unpack_from('<H', data, 2)[0]
|
|
self.length = struct.unpack_from('<H', data, 4)[0]
|
|
|
|
offset = 6 # 头部结束位置
|
|
self.unit1CircuitBreaker = data[offset]; offset +=1
|
|
self.unit2CircuitBreaker = data[offset]; offset +=1
|
|
self.unit3CircuitBreaker = data[offset]; offset +=1
|
|
self.unit5CircuitBreaker = data[offset]; offset +=1
|
|
self.bowPZDeviceCircuitBreaker = data[offset]; offset +=1
|
|
self.reservedCircuitBreaker1 = data[offset]; offset +=1
|
|
self.reservedCircuitBreaker2 = data[offset]; offset +=1
|
|
self.emergencyLithiumBatteryGroup1CircuitBreaker = data[offset]; offset +=1
|
|
|
|
# 校验校验码
|
|
checkCode = 0
|
|
for byte in data[:-1]: # 不包括校验码本身
|
|
checkCode = (checkCode + byte) & 0xFF
|
|
|
|
return checkCode == data[-1]
|
|
|
|
|
|
if __name__ == "__main__":
|
|
# 测试打包和解包
|
|
msg = msg_disLVMBCmdMsg()
|
|
packed_data = msg.pack()
|
|
# 方便复制,将每个字节转换为十六进制字符串并添加空格分隔 数字前+ox
|
|
|
|
hex_string = ' '.join(format(byte, '02x') for byte in packed_data)
|
|
print("Packed data (hex):", hex_string)
|