增加了配电app

This commit is contained in:
zjk
2025-05-05 19:03:57 +08:00
parent 97a86acae4
commit 3e33c95cb1
25 changed files with 4583 additions and 233 deletions
File diff suppressed because it is too large Load Diff
+649
View File
@@ -0,0 +1,649 @@
import sqlite3
import threading
from datetime import datetime
from udpMsg import (
msg_disHighVolBusFbMsg,
msg_disHighAVolBusFbMsg,
msg_disLowMainBusFbMsg,
msg_disLowBusFbMsg,
msg_disHVBCmdMsg,
msg_disHVBACmdMsg,
msg_disLVMBCmdMsg,
msg_disLVBCmdMsg
)
class DB:
def __init__(self, db_name):
self.db_name = db_name
self.conn = None
self.lock = threading.Lock()
def setPath(self, path):
self.db_name = path
def connect(self):
self.conn = sqlite3.connect(self.db_name, check_same_thread=False)
self.conn.row_factory = sqlite3.Row
self.createTable()
print("数据库连接成功")
def createTable(self):
'''创建UDP消息数据表'''
cursor = self.conn.cursor()
# 高压母线配电反馈表
cursor.execute('''
CREATE TABLE IF NOT EXISTS msg_disHighVolBusFbMsg (
id INTEGER PRIMARY KEY AUTOINCREMENT,
timestamp DATETIME DEFAULT CURRENT_TIMESTAMP,
fuelCellCircuitBreaker INTEGER,
powerLithiumBatteryCircuitBreaker INTEGER,
propulsionMotorCircuitBreaker INTEGER,
lithiumBatteryGroupInstrumentCircuitBreaker INTEGER,
dcDc5ModuleCircuitBreaker INTEGER,
bowHighVoltageDistributionBoxCircuitBreaker INTEGER,
sternFTDevice45CircuitBreaker INTEGER,
sternRudderSwitch1CircuitBreaker INTEGER,
sternRudderSwitch2CircuitBreaker INTEGER,
fbReservedCircuitBreaker INTEGER,
tyzReservedCircuitBreaker INTEGER,
reservedCircuitBreaker INTEGER,
dcDcFaultWord1 INTEGER,
dcDcFaultWord2 INTEGER,
powerBusInsulationStatus INTEGER,
aBusInsulationStatus INTEGER,
meterPowerLossSignal INTEGER,
emergencyPowerLossSignal INTEGER,
powerBusVoltage INTEGER,
dcDc5ModuleCurrent INTEGER,
powerBusCurrent INTEGER,
busbarAVoltage INTEGER,
propulsionMotorControlBoxCurrent INTEGER,
busbarACurrent INTEGER,
lithiumBatteryGroupMeterCurrent INTEGER,
bowHighVoltageDistributionBoxCurrent INTEGER,
sternFTDevice45Current INTEGER,
tyzReservedSwitchCurrent INTEGER,
sternRudderSwitch1Current INTEGER,
reservedCurrent1 INTEGER,
sternRudderSwitch2Current INTEGER,
reservedCurrent2 INTEGER,
fbReservedSwitchCurrent INTEGER,
reservedCurrent3 INTEGER,
coolWaterPressure INTEGER
)
''')
# 高压母线A配电反馈表
cursor.execute('''
CREATE TABLE IF NOT EXISTS msg_disHighAVolBusFbMsg (
id INTEGER PRIMARY KEY AUTOINCREMENT,
timestamp DATETIME DEFAULT CURRENT_TIMESTAMP,
bowFTDevice123CircuitBreaker INTEGER,
actuatorCircuitBreaker INTEGER,
mastSteeringGearControlBoxCircuitBreaker INTEGER,
xczCircuitBreaker INTEGER,
bowRudderControlBoxCircuitBreaker INTEGER,
openWaterCoverStartCylinderCircuitBreaker INTEGER,
instrumentPowerFailureSignal INTEGER,
emergencyPowerFailureSignal INTEGER,
waterIngressionAlarm INTEGER,
busbarBVoltage INTEGER,
busbarBCurrent INTEGER,
bowFTDevice123Current INTEGER,
actuatorCurrent INTEGER,
mastSteeringGearControlBoxCurrent INTEGER,
xczCurrent INTEGER,
bowRudderControlBoxCurrent INTEGER,
openWaterCoverStartCylinderCurrent INTEGER
)
''')
# 仪表母线配电反馈表
cursor.execute('''
CREATE TABLE IF NOT EXISTS msg_disLowMainBusFbMsg (
id INTEGER PRIMARY KEY AUTOINCREMENT,
timestamp DATETIME DEFAULT CURRENT_TIMESTAMP,
lithiumBatteryGroupInstrumentCircuitBreaker INTEGER,
bowLowVoltageDistributionBoxCircuitBreaker INTEGER,
unit4InstrumentDC48VCircuitBreaker INTEGER,
dcC1DCDistributionPanelCircuitBreaker INTEGER,
reservedCircuitBreaker1 INTEGER,
reservedCircuitBreaker2 INTEGER,
emergencyLithiumBatteryGroup2CircuitBreaker INTEGER,
instrumentPowerFailureSignal INTEGER,
emergencyPowerFailureSignal INTEGER,
instrumentBusbarInsulationLow INTEGER,
instrumentBusbarVoltage INTEGER,
bowLowVoltageDistributionBoxCurrent INTEGER,
dcC1InstrumentDC48VCurrent INTEGER,
reservedCurrent1 INTEGER,
emergencyLithiumBatteryGroup2Current INTEGER,
lithiumBatteryGroupInstrumentCurrent INTEGER,
unit4InstrumentDC48VCurrent INTEGER,
reservedCurrent2 INTEGER,
emergency2BusbarVoltage INTEGER,
compositeEnergyManagementSystemEmergencyDC48VCurrent INTEGER,
fuelCellSecuritySystemEmergencyDC48VCurrent INTEGER,
plcControlPowerCurrent INTEGER
)
''')
# 仪表汇流排配电反馈表
cursor.execute('''
CREATE TABLE IF NOT EXISTS msg_disLowBusFbMsg (
id INTEGER PRIMARY KEY AUTOINCREMENT,
timestamp DATETIME DEFAULT CURRENT_TIMESTAMP,
unit1CircuitBreaker INTEGER,
unit2CircuitBreaker INTEGER,
unit3CircuitBreaker INTEGER,
unit5CircuitBreaker INTEGER,
bowPZDeviceCircuitBreaker INTEGER,
reservedCircuitBreaker1 INTEGER,
reservedCircuitBreaker2 INTEGER,
emergencyLithiumBatteryGroup1CircuitBreaker INTEGER,
powerFailureSignal INTEGER,
waterIngressionAlarm INTEGER,
instrumentBusbarVoltage INTEGER,
instrumentBusbarCurrent INTEGER,
unit1Current INTEGER,
unit2Current INTEGER,
unit3Current INTEGER,
unit5Current INTEGER,
bowPZDeviceCurrent INTEGER,
emergencyLithiumBatteryGroup1Current INTEGER,
emergency1BusbarVoltage INTEGER
)
''')
# 高压母线命令表
cursor.execute('''
CREATE TABLE IF NOT EXISTS msg_disHVBCmdMsg (
id INTEGER PRIMARY KEY AUTOINCREMENT,
timestamp DATETIME DEFAULT CURRENT_TIMESTAMP,
fuelCellCircuitBreakerCmd INTEGER,
powerLithiumBatteryCircuitBreakerCmd INTEGER,
propulsionMotorCircuitBreakerCmd INTEGER,
lithiumBatteryGroupInstrumentCircuitBreakerCmd INTEGER,
dcDc5ModuleCircuitBreakerCmd INTEGER,
bowHighVoltageDistributionBoxCircuitBreakerCmd INTEGER,
sternFTDevice45CircuitBreakerCmd INTEGER,
sternRudderSwitch1CircuitBreakerCmd INTEGER,
sternRudderSwitch2CircuitBreakerCmd INTEGER,
fbReservedCircuitBreakerCmd INTEGER,
tyzReservedCircuitBreakerCmd INTEGER,
reservedCircuitBreakerCmd INTEGER,
dcdc5ModuleCmd INTEGER,
coolingSystemCmd INTEGER
)
''')
# 高压母线A命令表
cursor.execute('''
CREATE TABLE IF NOT EXISTS msg_disHVBACmdMsg (
id INTEGER PRIMARY KEY AUTOINCREMENT,
timestamp DATETIME DEFAULT CURRENT_TIMESTAMP,
bowFTDevice123CircuitBreakerCmd INTEGER,
actuatorCircuitBreakerCmd INTEGER,
mastSteeringGearControlBoxCircuitBreakerCmd INTEGER,
xczCircuitBreakerCmd INTEGER,
bowRudderControlBoxCircuitBreakerCmd INTEGER,
openWaterCoverStartCylinderCircuitBreakerCmd INTEGER
)
''')
# 仪表母线命令表
cursor.execute('''
CREATE TABLE IF NOT EXISTS msg_disLVMBCmdMsg (
id INTEGER PRIMARY KEY AUTOINCREMENT,
timestamp DATETIME DEFAULT CURRENT_TIMESTAMP,
lithiumBatteryGroupInstrumentCircuitBreakerCmd INTEGER,
bowLowVoltageDistributionBoxCircuitBreakerCmd INTEGER,
unit4InstrumentDC48VCircuitBreakerCmd INTEGER,
dcC1DCDistributionPanelCircuitBreakerCmd INTEGER,
reservedCircuitBreakerCmd1 INTEGER,
reservedCircuitBreakerCmd2 INTEGER,
emergencyLithiumBatteryGroup2CircuitBreakerCmd INTEGER
)
''')
# 仪表汇流排命令表
cursor.execute('''
CREATE TABLE IF NOT EXISTS msg_disLVBCmdMsg (
id INTEGER PRIMARY KEY AUTOINCREMENT,
timestamp DATETIME DEFAULT CURRENT_TIMESTAMP,
unit1CircuitBreakerCmd INTEGER,
unit2CircuitBreakerCmd INTEGER,
unit3CircuitBreakerCmd INTEGER,
unit5CircuitBreakerCmd INTEGER,
bowPZDeviceCircuitBreakerCmd INTEGER,
reservedCircuitBreakerCmd1 INTEGER,
reservedCircuitBreakerCmd2 INTEGER,
emergencyLithiumBatteryGroup1CircuitBreakerCmd INTEGER
)
''')
self.conn.commit()
def _insert_data(self, table_name, data_dict):
print('-----------------insert_data start')
'''内部方法:执行实际的数据库插入操作'''
with self.lock:
try:
# 检查并建立连接
if not self.conn:
print('-----------------connecting to database')
self.connect()
print(f'-----------------connection status: {"connected" if self.conn else "disconnected"}')
if not self.conn:
print('-----------------connection failed')
return False
print(f'-----------------connection object: {self.conn}')
# 创建cursor
try:
print('-----------------creating cursor')
cursor = self.conn.cursor()
print('-----------------cursor created successfully')
except sqlite3.Error as e:
print(f'-----------------cursor creation failed: {e}')
return False
# 准备查询
columns = ', '.join(data_dict.keys())
placeholders = ', '.join(['?'] * len(data_dict))
query = f'INSERT INTO {table_name} ({columns}) VALUES ({placeholders})'
print(f'-----------------prepared query: {query}')
# 执行查询
try:
print('-----------------executing query')
cursor.execute(query, list(data_dict.values()))
self.conn.commit()
print(f"-----------------Data inserted successfully into {table_name}")
return True
except sqlite3.Error as e:
print(f"-----------------Error executing query: {e}")
return False
except Exception as e:
print(f'-----------------unexpected error in _insert_data: {e}')
return False
def insertHighVolBusData(self, data:msg_disHighVolBusFbMsg):
'''插入高压母线配电反馈数据'''
print('-----------------insertHighVolBusData')
data_dict = {
'fuelCellCircuitBreaker': data.fuelCellCircuitBreaker,
'powerLithiumBatteryCircuitBreaker': data.powerLithiumBatteryCircuitBreaker,
'propulsionMotorCircuitBreaker': data.propulsionMotorCircuitBreaker,
'lithiumBatteryGroupInstrumentCircuitBreaker': data.lithiumBatteryGroupInstrumentCircuitBreaker,
'dcDc5ModuleCircuitBreaker': data.dcDc5ModuleCircuitBreaker,
'bowHighVoltageDistributionBoxCircuitBreaker': data.bowHighVoltageDistributionBoxCircuitBreaker,
'sternFTDevice45CircuitBreaker': data.sternFTDevice45CircuitBreaker,
'sternRudderSwitch1CircuitBreaker': data.sternRudderSwitch1CircuitBreaker,
'sternRudderSwitch2CircuitBreaker': data.sternRudderSwitch2CircuitBreaker,
'fbReservedCircuitBreaker': data.fbReservedCircuitBreaker,
'tyzReservedCircuitBreaker': data.tyzReservedCircuitBreaker,
'reservedCircuitBreaker': data.reservedCircuitBreaker,
'dcDcFaultWord1': data.dcDcFaultWord1,
'dcDcFaultWord2': data.dcDcFaultWord2,
'powerBusInsulationStatus': data.powerBusInsulationStatus,
'aBusInsulationStatus': data.aBusInsulationStatus,
'meterPowerLossSignal': data.meterPowerLossSignal,
'emergencyPowerLossSignal': data.emergencyPowerLossSignal,
'powerBusVoltage': data.powerBusVoltage,
'dcDc5ModuleCurrent': data.dcDc5ModuleCurrent,
'powerBusCurrent': data.powerBusCurrent,
'busbarAVoltage': data.busbarAVoltage,
'propulsionMotorControlBoxCurrent': data.propulsionMotorControlBoxCurrent,
'busbarACurrent': data.busbarACurrent,
'lithiumBatteryGroupMeterCurrent': data.lithiumBatteryGroupMeterCurrent,
'bowHighVoltageDistributionBoxCurrent': data.bowHighVoltageDistributionBoxCurrent,
'sternFTDevice45Current': data.sternFTDevice45Current,
'tyzReservedSwitchCurrent': data.tyzReservedSwitchCurrent,
'sternRudderSwitch1Current': data.sternRudderSwitch1Current,
'reservedCurrent1': data.reservedCurrent1,
'sternRudderSwitch2Current': data.sternRudderSwitch2Current,
'reservedCurrent2': data.reservedCurrent2,
'fbReservedSwitchCurrent': data.fbReservedSwitchCurrent,
'reservedCurrent3': data.reservedCurrent3,
'coolWaterPressure': data.coolWaterPressure
}
return self._insert_data('msg_disHighVolBusFbMsg', data_dict)
def insertHighAVolBusData(self, data:msg_disHighAVolBusFbMsg):
'''插入高压母线A配电反馈数据'''
data_dict = {
'bowFTDevice123CircuitBreaker': data.bowFTDevice123CircuitBreaker,
'actuatorCircuitBreaker': data.actuatorCircuitBreaker,
'mastSteeringGearControlBoxCircuitBreaker': data.mastSteeringGearControlBoxCircuitBreaker,
'xczCircuitBreaker': data.xczCircuitBreaker,
'bowRudderControlBoxCircuitBreaker': data.bowRudderControlBoxCircuitBreaker,
'openWaterCoverStartCylinderCircuitBreaker': data.openWaterCoverStartCylinderCircuitBreaker,
'instrumentPowerFailureSignal': data.instrumentPowerFailureSignal,
'emergencyPowerFailureSignal': data.emergencyPowerFailureSignal,
'waterIngressionAlarm': data.waterIngressionAlarm,
'busbarBVoltage': data.busbarBVoltage,
'busbarBCurrent': data.busbarBCurrent,
'bowFTDevice123Current': data.bowFTDevice123Current,
'actuatorCurrent': data.actuatorCurrent,
'mastSteeringGearControlBoxCurrent': data.mastSteeringGearControlBoxCurrent,
'xczCurrent': data.xczCurrent,
'bowRudderControlBoxCurrent': data.bowRudderControlBoxCurrent,
'openWaterCoverStartCylinderCurrent': data.openWaterCoverStartCylinderCurrent
}
return self._insert_data('msg_disHighAVolBusFbMsg', data_dict)
def insertLowMainBusData(self, data:msg_disLowMainBusFbMsg):
'''插入仪表母线配电反馈数据'''
data_dict = {
'lithiumBatteryGroupInstrumentCircuitBreaker': data.lithiumBatteryGroupInstrumentCircuitBreaker,
'bowLowVoltageDistributionBoxCircuitBreaker': data.bowLowVoltageDistributionBoxCircuitBreaker,
'unit4InstrumentDC48VCircuitBreaker': data.unit4InstrumentDC48VCircuitBreaker,
'dcC1DCDistributionPanelCircuitBreaker': data.dcC1DCDistributionPanelCircuitBreaker,
'reservedCircuitBreaker1': data.reservedCircuitBreaker1,
'reservedCircuitBreaker2': data.reservedCircuitBreaker2,
'emergencyLithiumBatteryGroup2CircuitBreaker': data.emergencyLithiumBatteryGroup2CircuitBreaker,
'instrumentPowerFailureSignal': data.instrumentPowerFailureSignal,
'emergencyPowerFailureSignal': data.emergencyPowerFailureSignal,
'instrumentBusbarInsulationLow': data.instrumentBusbarInsulationLow,
'instrumentBusbarVoltage': data.instrumentBusbarVoltage,
'bowLowVoltageDistributionBoxCurrent': data.bowLowVoltageDistributionBoxCurrent,
'dcC1InstrumentDC48VCurrent': data.dcC1InstrumentDC48VCurrent,
'reservedCurrent1': data.reservedCurrent1,
'emergencyLithiumBatteryGroup2Current': data.emergencyLithiumBatteryGroup2Current,
'lithiumBatteryGroupInstrumentCurrent': data.lithiumBatteryGroupInstrumentCurrent,
'unit4InstrumentDC48VCurrent': data.unit4InstrumentDC48VCurrent,
'reservedCurrent2': data.reservedCurrent2,
'emergency2BusbarVoltage': data.emergency2BusbarVoltage,
'compositeEnergyManagementSystemEmergencyDC48VCurrent': data.compositeEnergyManagementSystemEmergencyDC48VCurrent,
'fuelCellSecuritySystemEmergencyDC48VCurrent': data.fuelCellSecuritySystemEmergencyDC48VCurrent,
'plcControlPowerCurrent': data.plcControlPowerCurrent
}
return self._insert_data('msg_disLowMainBusFbMsg', data_dict)
def insertLowBusData(self, data:msg_disLowBusFbMsg):
'''插入仪表汇流排配电反馈数据'''
data_dict = {
'unit1CircuitBreaker': data.unit1CircuitBreaker,
'unit2CircuitBreaker': data.unit2CircuitBreaker,
'unit3CircuitBreaker': data.unit3CircuitBreaker,
'unit5CircuitBreaker': data.unit5CircuitBreaker,
'bowPZDeviceCircuitBreaker': data.bowPZDeviceCircuitBreaker,
'reservedCircuitBreaker1': data.reservedCircuitBreaker1,
'reservedCircuitBreaker2': data.reservedCircuitBreaker2,
'emergencyLithiumBatteryGroup1CircuitBreaker': data.emergencyLithiumBatteryGroup1CircuitBreaker,
'powerFailureSignal': data.powerFailureSignal,
'waterIngressionAlarm': data.waterIngressionAlarm,
'instrumentBusbarVoltage': data.instrumentBusbarVoltage,
'instrumentBusbarCurrent': data.instrumentBusbarCurrent,
'unit1Current': data.unit1Current,
'unit2Current': data.unit2Current,
'unit3Current': data.unit3Current,
'unit5Current': data.unit5Current,
'bowPZDeviceCurrent': data.bowPZDeviceCurrent,
'emergencyLithiumBatteryGroup1Current': data.emergencyLithiumBatteryGroup1Current,
'emergency1BusbarVoltage': data.emergency1BusbarVoltage
}
return self._insert_data('msg_disLowBusFbMsg', data_dict)
def insertHighVolBusCmd(self, data:msg_disHVBCmdMsg):
'''插入高压母线命令数据'''
data_dict = {
'fuelCellCircuitBreakerCmd': data.fuelCellCircuitBreaker,
'powerLithiumBatteryCircuitBreakerCmd': data.powerLithiumBatteryCircuitBreaker,
'propulsionMotorCircuitBreakerCmd': data.propulsionMotorCircuitBreaker,
'lithiumBatteryGroupInstrumentCircuitBreakerCmd': data.lithiumBatteryGroupInstrumentCircuitBreaker,
'dcDc5ModuleCircuitBreakerCmd': data.dcDc5ModuleCircuitBreaker,
'bowHighVoltageDistributionBoxCircuitBreakerCmd': data.bowHighVoltageDistributionBoxCircuitBreaker,
'sternFTDevice45CircuitBreakerCmd': data.sternFTDevice45CircuitBreaker,
'sternRudderSwitch1CircuitBreakerCmd': data.sternRudderSwitch1CircuitBreaker,
'sternRudderSwitch2CircuitBreakerCmd': data.sternRudderSwitch2CircuitBreaker,
'fbReservedCircuitBreakerCmd': data.fbReservedCircuitBreaker,
'tyzReservedCircuitBreakerCmd': data.tyzReservedCircuitBreaker,
'reservedCircuitBreakerCmd': data.reservedCircuitBreaker,
'dcdc5ModuleCmd': data.dcdc5Module,
'coolingSystemCmd': data.coolingSystem
}
return self._insert_data('msg_disHVBCmdMsg', data_dict)
def insertHighAVolBusCmd(self, data:msg_disHVBACmdMsg):
'''插入高压母线A命令数据'''
data_dict = {
'bowFTDevice123CircuitBreakerCmd': data.bowFTDevice123CircuitBreaker,
'actuatorCircuitBreakerCmd': data.actuatorCircuitBreaker,
'mastSteeringGearControlBoxCircuitBreakerCmd': data.mastSteeringGearControlBoxCircuitBreaker,
'xczCircuitBreakerCmd': data.xczCircuitBreaker,
'bowRudderControlBoxCircuitBreakerCmd': data.bowRudderControlBoxCircuitBreaker,
'openWaterCoverStartCylinderCircuitBreakerCmd': data.openWaterCoverStartCylinderCircuitBreaker
}
return self._insert_data('msg_disHVBACmdMsg', data_dict)
def insertLowMainBusCmd(self, data:msg_disLVMBCmdMsg):
'''插入仪表母线命令数据'''
data_dict = {
'lithiumBatteryGroupInstrumentCircuitBreakerCmd': data.lithiumBatteryGroupInstrumentCircuitBreaker,
'bowLowVoltageDistributionBoxCircuitBreakerCmd': data.bowLowVoltageDistributionBoxCircuitBreaker,
'unit4InstrumentDC48VCircuitBreakerCmd': data.unit4InstrumentDC48VCircuitBreaker,
'dcC1DCDistributionPanelCircuitBreakerCmd': data.dcC1DCDistributionPanelCircuitBreaker,
'reservedCircuitBreakerCmd1': data.reservedCircuitBreaker1,
'reservedCircuitBreakerCmd2': data.reservedCircuitBreaker2,
'emergencyLithiumBatteryGroup2CircuitBreakerCmd': data.emergencyLithiumBatteryGroup2CircuitBreaker
}
return self._insert_data('msg_disLVMBCmdMsg', data_dict)
def insertLowBusCmd(self, data:msg_disLVBCmdMsg):
'''插入仪表汇流排命令数据'''
data_dict = {
'unit1CircuitBreakerCmd': data.unit1CircuitBreaker,
'unit2CircuitBreakerCmd': data.unit2CircuitBreaker,
'unit3CircuitBreakerCmd': data.unit3CircuitBreaker,
'unit5CircuitBreakerCmd': data.unit5CircuitBreaker,
'bowPZDeviceCircuitBreakerCmd': data.bowPZDeviceCircuitBreaker,
'reservedCircuitBreakerCmd1': data.reservedCircuitBreaker1,
'reservedCircuitBreakerCmd2': data.reservedCircuitBreaker2,
'emergencyLithiumBatteryGroup1CircuitBreakerCmd': data.emergencyLithiumBatteryGroup1CircuitBreaker
}
return self._insert_data('msg_disLVBCmdMsg', data_dict)
def close(self):
if self.conn:
self.conn.close()
if __name__ == "__main__":
# 创建数据库实例
db = DB('/home/zjk/project/H100/H100PowerManger/test/disSysTest/test.db')
db.connect()
# 创建测试数据
from udpMsg import (
msg_disHighVolBusFbMsg,
msg_disHighAVolBusFbMsg,
msg_disLowMainBusFbMsg,
msg_disLowBusFbMsg,
msg_disHVBCmdMsg,
msg_disHVBACmdMsg,
msg_disLVMBCmdMsg,
msg_disLVBCmdMsg
)
# 测试反馈消息存储
fb1 = msg_disHighVolBusFbMsg()
fb1.fuelCellCircuitBreaker = 1
fb1.powerLithiumBatteryCircuitBreaker = 1
fb1.propulsionMotorCircuitBreaker = 1
fb1.lithiumBatteryGroupInstrumentCircuitBreaker = 1
fb1.dcDc5ModuleCircuitBreaker = 1
fb1.bowHighVoltageDistributionBoxCircuitBreaker = 1
fb1.sternFTDevice45CircuitBreaker = 1
fb1.sternRudderSwitch1CircuitBreaker = 1
fb1.sternRudderSwitch2CircuitBreaker = 1
fb1.fbReservedCircuitBreaker = 1
fb1.tyzReservedCircuitBreaker = 1
fb1.reservedCircuitBreaker = 1
fb1.dcDcFaultWord1 = 0
fb1.dcDcFaultWord2 = 0
fb1.powerBusInsulationStatus = 1
fb1.aBusInsulationStatus = 1
fb1.meterPowerLossSignal = 0
fb1.emergencyPowerLossSignal = 0
fb1.powerBusVoltage = 220
fb1.dcDc5ModuleCurrent = 10
fb1.powerBusCurrent = 100
fb1.busbarAVoltage = 220
fb1.propulsionMotorControlBoxCurrent = 50
fb1.busbarACurrent = 100
fb1.lithiumBatteryGroupMeterCurrent = 10
fb1.bowHighVoltageDistributionBoxCurrent = 20
fb1.sternFTDevice45Current = 30
fb1.tyzReservedSwitchCurrent = 0
fb1.sternRudderSwitch1Current = 10
fb1.reservedCurrent1 = 0
fb1.sternRudderSwitch2Current = 10
fb1.reservedCurrent2 = 0
fb1.fbReservedSwitchCurrent = 0
fb1.reservedCurrent3 = 0
fb1.coolWaterPressure = 100
fb2 = msg_disHighAVolBusFbMsg()
fb2.bowFTDevice123CircuitBreaker = 1
fb2.actuatorCircuitBreaker = 1
fb2.mastSteeringGearControlBoxCircuitBreaker = 1
fb2.xczCircuitBreaker = 1
fb2.bowRudderControlBoxCircuitBreaker = 1
fb2.openWaterCoverStartCylinderCircuitBreaker = 1
fb2.instrumentPowerFailureSignal = 0
fb2.emergencyPowerFailureSignal = 0
fb2.waterIngressionAlarm = 0
fb2.busbarBVoltage = 220
fb2.busbarBCurrent = 100
fb2.bowFTDevice123Current = 20
fb2.actuatorCurrent = 30
fb2.mastSteeringGearControlBoxCurrent = 10
fb2.xczCurrent = 5
fb2.bowRudderControlBoxCurrent = 15
fb2.openWaterCoverStartCylinderCurrent = 5
fb3 = msg_disLowMainBusFbMsg()
fb3.lithiumBatteryGroupInstrumentCircuitBreaker = 1
fb3.bowLowVoltageDistributionBoxCircuitBreaker = 1
fb3.unit4InstrumentDC48VCircuitBreaker = 1
fb3.dcC1DCDistributionPanelCircuitBreaker = 1
fb3.reservedCircuitBreaker1 = 0
fb3.reservedCircuitBreaker2 = 0
fb3.emergencyLithiumBatteryGroup2CircuitBreaker = 1
fb3.instrumentPowerFailureSignal = 0
fb3.emergencyPowerFailureSignal = 0
fb3.instrumentBusbarInsulationLow = 0
fb3.instrumentBusbarVoltage = 48
fb3.bowLowVoltageDistributionBoxCurrent = 10
fb3.dcC1InstrumentDC48VCurrent = 5
fb3.reservedCurrent1 = 0
fb3.emergencyLithiumBatteryGroup2Current = 10
fb3.lithiumBatteryGroupInstrumentCurrent = 5
fb3.unit4InstrumentDC48VCurrent = 5
fb3.reservedCurrent2 = 0
fb3.emergency2BusbarVoltage = 48
fb3.compositeEnergyManagementSystemEmergencyDC48VCurrent = 5
fb3.fuelCellSecuritySystemEmergencyDC48VCurrent = 5
fb3.plcControlPowerCurrent = 5
fb4 = msg_disLowBusFbMsg()
fb4.unit1CircuitBreaker = 1
fb4.unit2CircuitBreaker = 1
fb4.unit3CircuitBreaker = 1
fb4.unit5CircuitBreaker = 1
fb4.bowPZDeviceCircuitBreaker = 1
fb4.reservedCircuitBreaker1 = 0
fb4.reservedCircuitBreaker2 = 0
fb4.emergencyLithiumBatteryGroup1CircuitBreaker = 1
fb4.powerFailureSignal = 0
fb4.waterIngressionAlarm = 0
fb4.instrumentBusbarVoltage = 48
fb4.instrumentBusbarCurrent = 10
fb4.unit1Current = 2
fb4.unit2Current = 2
fb4.unit3Current = 2
fb4.unit5Current = 2
fb4.bowPZDeviceCurrent = 2
fb4.emergencyLithiumBatteryGroup1Current = 10
fb4.emergency1BusbarVoltage = 48
db.insertHighVolBusData(fb1)
db.insertHighAVolBusData(fb2)
db.insertLowMainBusData(fb3)
db.insertLowBusData(fb4)
db.insertHighVolBusData(fb1)
db.insertHighAVolBusData(fb2)
db.insertLowMainBusData(fb3)
db.insertLowBusData(fb4)
db.insertHighVolBusData(fb1)
db.insertHighAVolBusData(fb2)
db.insertLowMainBusData(fb3)
db.insertLowBusData(fb4)
# 测试命令消息存储
cmd1 = msg_disHVBCmdMsg()
cmd1.fuelCellCircuitBreaker = 1
cmd1.powerLithiumBatteryCircuitBreaker = 1
cmd1.propulsionMotorCircuitBreaker = 1
cmd1.lithiumBatteryGroupInstrumentCircuitBreaker = 1
cmd1.dcDc5ModuleCircuitBreaker = 1
cmd1.bowHighVoltageDistributionBoxCircuitBreaker = 1
cmd1.sternFTDevice45CircuitBreaker = 1
cmd1.sternRudderSwitch1CircuitBreaker = 1
cmd1.sternRudderSwitch2CircuitBreaker = 1
cmd1.fbReservedCircuitBreaker = 0
cmd1.tyzReservedCircuitBreaker = 0
cmd1.reservedCircuitBreaker = 0
cmd1.dcdc5Module = 1
cmd1.coolingSystem = 1
cmd2 = msg_disHVBACmdMsg()
cmd2.bowFTDevice123CircuitBreaker = 1
cmd2.actuatorCircuitBreaker = 1
cmd2.mastSteeringGearControlBoxCircuitBreaker = 1
cmd2.xczCircuitBreaker = 1
cmd2.bowRudderControlBoxCircuitBreaker = 1
cmd2.openWaterCoverStartCylinderCircuitBreaker = 1
cmd3 = msg_disLVMBCmdMsg()
cmd3.lithiumBatteryGroupInstrumentCircuitBreaker = 1
cmd3.bowLowVoltageDistributionBoxCircuitBreaker = 1
cmd3.unit4InstrumentDC48VCircuitBreaker = 1
cmd3.dcC1DCDistributionPanelCircuitBreaker = 1
cmd3.reservedCircuitBreaker1 = 0
cmd3.reservedCircuitBreaker2 = 0
cmd3.emergencyLithiumBatteryGroup2CircuitBreaker = 1
cmd4 = msg_disLVBCmdMsg()
cmd4.unit1CircuitBreaker = 1
cmd4.unit2CircuitBreaker = 1
cmd4.unit3CircuitBreaker = 1
cmd4.unit5CircuitBreaker = 1
cmd4.bowPZDeviceCircuitBreaker = 1
cmd4.reservedCircuitBreaker1 = 0
cmd4.reservedCircuitBreaker2 = 0
cmd4.emergencyLithiumBatteryGroup1CircuitBreaker = 1
db.insertHighVolBusCmd(cmd1)
db.insertHighAVolBusCmd(cmd2)
db.insertLowMainBusCmd(cmd3)
db.insertLowBusCmd(cmd4)
db.insertHighVolBusCmd(cmd1)
db.insertHighAVolBusCmd(cmd2)
db.insertLowMainBusCmd(cmd3)
db.insertLowBusCmd(cmd4)
db.insertHighVolBusCmd(cmd1)
db.insertHighAVolBusCmd(cmd2)
db.insertLowMainBusCmd(cmd3)
db.insertLowBusCmd(cmd4)
print("测试数据已成功插入数据库")
+19
View File
@@ -0,0 +1,19 @@
import tkinter as tk
from PowerManagerApp import PowerManagerApp
from db import DB
def main():
# 创建Tkinter根窗口
root = tk.Tk()
# 创建PowerManagerApp实例
app = PowerManagerApp(root)
# 设置窗口关闭事件处理
root.protocol("WM_DELETE_WINDOW", app.on_closing)
# 启动主循环
root.mainloop()
if __name__ == "__main__":
main()
File diff suppressed because it is too large Load Diff
+230
View File
@@ -0,0 +1,230 @@
import socket
import struct
import threading
import time
from udpMsg import (
msg_disHighVolBusFbMsg,
msg_disHighAVolBusFbMsg,
msg_disLowMainBusFbMsg,
msg_disLowBusFbMsg,
msg_disHVBCmdMsg,
msg_disHVBACmdMsg,
msg_disLVMBCmdMsg,
msg_disLVBCmdMsg
)
class PowerManagerSimulator:
def __init__(self, host='127.0.0.1', port=5001):
self.host = host
self.port = port
self.running = False
self.sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
self.sock.bind((host, port))
# 初始化消息对象
self.high_vol_fb = msg_disHighVolBusFbMsg()
self.high_a_vol_fb = msg_disHighAVolBusFbMsg()
self.low_main_fb = msg_disLowMainBusFbMsg()
self.low_bus_fb = msg_disLowBusFbMsg()
# 模拟数据初始化
self._init_sim_data()
def _init_sim_data(self):
"""初始化模拟数据"""
# 高压母线反馈数据 - 测试所有成员
self.high_vol_fb.fuelCellCircuitBreaker = 1
self.high_vol_fb.powerLithiumBatteryCircuitBreaker = 1
self.high_vol_fb.propulsionMotorCircuitBreaker = 1
self.high_vol_fb.lithiumBatteryGroupInstrumentCircuitBreaker = 1
self.high_vol_fb.dcDc5ModuleCircuitBreaker = 1
self.high_vol_fb.bowHighVoltageDistributionBoxCircuitBreaker = 1
self.high_vol_fb.sternFTDevice45CircuitBreaker = 1
self.high_vol_fb.sternRudderSwitch1CircuitBreaker = 1
self.high_vol_fb.sternRudderSwitch2CircuitBreaker = 1
self.high_vol_fb.fbReservedCircuitBreaker = 0
self.high_vol_fb.tyzReservedCircuitBreaker = 0
self.high_vol_fb.reservedCircuitBreaker = 0
self.high_vol_fb.dcDcFaultWord1 = 0x55 # 测试故障模式
self.high_vol_fb.dcDcFaultWord2 = 0xAA
self.high_vol_fb.powerBusInsulationStatus = 1
self.high_vol_fb.aBusInsulationStatus = 1
self.high_vol_fb.meterPowerLossSignal = 0
self.high_vol_fb.emergencyPowerLossSignal = 0
self.high_vol_fb.powerBusVoltage = 600 # 正常值
self.high_vol_fb.dcDc5ModuleCurrent = 50
self.high_vol_fb.powerBusCurrent = 100
self.high_vol_fb.busbarAVoltage = 600
self.high_vol_fb.propulsionMotorControlBoxCurrent = 80
self.high_vol_fb.busbarACurrent = 50
self.high_vol_fb.lithiumBatteryGroupMeterCurrent = 30
self.high_vol_fb.bowHighVoltageDistributionBoxCurrent = 20
self.high_vol_fb.sternFTDevice45Current = 15
self.high_vol_fb.tyzReservedSwitchCurrent = 0
self.high_vol_fb.sternRudderSwitch1Current = 10
self.high_vol_fb.reservedCurrent1 = 0
self.high_vol_fb.sternRudderSwitch2Current = 10
self.high_vol_fb.reservedCurrent2 = 0
self.high_vol_fb.fbReservedSwitchCurrent = 0
self.high_vol_fb.reservedCurrent3 = 0
self.high_vol_fb.coolWaterPressure = 100
# 高压A母线反馈数据 - 测试所有成员
self.high_a_vol_fb.bowFTDevice123CircuitBreaker = 1
self.high_a_vol_fb.actuatorCircuitBreaker = 1
self.high_a_vol_fb.mastSteeringGearControlBoxCircuitBreaker = 1
self.high_a_vol_fb.xczCircuitBreaker = 1
self.high_a_vol_fb.bowRudderControlBoxCircuitBreaker = 1
self.high_a_vol_fb.openWaterCoverStartCylinderCircuitBreaker = 0
self.high_a_vol_fb.instrumentPowerFailureSignal = 0
self.high_a_vol_fb.emergencyPowerFailureSignal = 0
self.high_a_vol_fb.waterIngressionAlarm = 0
self.high_a_vol_fb.busbarBVoltage = 600
self.high_a_vol_fb.busbarBCurrent = 30
self.high_a_vol_fb.bowFTDevice123Current = 20
self.high_a_vol_fb.actuatorCurrent = 15
self.high_a_vol_fb.mastSteeringGearControlBoxCurrent = 10
self.high_a_vol_fb.xczCurrent = 5
self.high_a_vol_fb.bowRudderControlBoxCurrent = 8
self.high_a_vol_fb.openWaterCoverStartCylinderCurrent = 0
# 仪表主母线反馈数据 - 测试所有成员
self.low_main_fb.lithiumBatteryGroupInstrumentCircuitBreaker = 1
self.low_main_fb.bowLowVoltageDistributionBoxCircuitBreaker = 1
self.low_main_fb.unit4InstrumentDC48VCircuitBreaker = 1
self.low_main_fb.dcC1DCDistributionPanelCircuitBreaker = 1
self.low_main_fb.reservedCircuitBreaker1 = 0
self.low_main_fb.reservedCircuitBreaker2 = 0
self.low_main_fb.emergencyLithiumBatteryGroup2CircuitBreaker = 0
self.low_main_fb.instrumentPowerFailureSignal = 0
self.low_main_fb.emergencyPowerFailureSignal = 0
self.low_main_fb.instrumentBusbarInsulationLow = 0
self.low_main_fb.instrumentBusbarVoltage = 48
self.low_main_fb.bowLowVoltageDistributionBoxCurrent = 10
self.low_main_fb.dcC1InstrumentDC48VCurrent = 5
self.low_main_fb.reservedCurrent1 = 0
self.low_main_fb.emergencyLithiumBatteryGroup2Current = 0
self.low_main_fb.lithiumBatteryGroupInstrumentCurrent = 20
self.low_main_fb.unit4InstrumentDC48VCurrent = 5
self.low_main_fb.reservedCurrent2 = 0
self.low_main_fb.emergency2BusbarVoltage = 48
self.low_main_fb.compositeEnergyManagementSystemEmergencyDC48VCurrent = 2
self.low_main_fb.fuelCellSecuritySystemEmergencyDC48VCurrent = 2
self.low_main_fb.plcControlPowerCurrent = 1
# 仪表汇流排反馈数据 - 测试所有成员
self.low_bus_fb.unit1CircuitBreaker = 1
self.low_bus_fb.unit2CircuitBreaker = 1
self.low_bus_fb.unit3CircuitBreaker = 1
self.low_bus_fb.unit5CircuitBreaker = 1
self.low_bus_fb.bowPZDeviceCircuitBreaker = 1
self.low_bus_fb.reservedCircuitBreaker1 = 0
self.low_bus_fb.reservedCircuitBreaker2 = 0
self.low_bus_fb.emergencyLithiumBatteryGroup1CircuitBreaker = 0
self.low_bus_fb.powerFailureSignal = 0
self.low_bus_fb.waterIngressionAlarm = 0
self.low_bus_fb.instrumentBusbarVoltage = 48
self.low_bus_fb.instrumentBusbarCurrent = 500
self.low_bus_fb.unit1Current = 100
self.low_bus_fb.unit2Current = 100
self.low_bus_fb.unit3Current = 100
self.low_bus_fb.unit5Current = 100
self.low_bus_fb.bowPZDeviceCurrent = 50
self.low_bus_fb.emergencyLithiumBatteryGroup1Current = 0
self.low_bus_fb.emergency1BusbarVoltage = 48
def start(self):
"""启动模拟器"""
self.running = True
# 启动发送线程
self.send_thread = threading.Thread(target=self._send_loop)
self.send_thread.daemon = True
self.send_thread.start()
# 启动接收线程
self.recv_thread = threading.Thread(target=self._recv_loop)
self.recv_thread.daemon = True
self.recv_thread.start()
def stop(self):
"""停止模拟器"""
self.running = False
self.sock.close()
def _send_loop(self):
"""周期性发送反馈消息"""
while self.running:
try:
# 发送高压母线反馈
data = self.high_vol_fb.pack()
self.sock.sendto(data, (self.host, 5000))
# 发送高压A母线反馈
data = self.high_a_vol_fb.pack()
self.sock.sendto(data, (self.host, 5000))
# 发送仪表主母线反馈
data = self.low_main_fb.pack()
self.sock.sendto(data, (self.host, 5000))
# 发送仪表汇流排反馈
data = self.low_bus_fb.pack()
self.sock.sendto(data, (self.host, 5000))
time.sleep(1) # 每秒发送一次
except Exception as e:
print(f"发送消息出错: {e}")
break
def _recv_loop(self):
"""接收并处理命令消息"""
while self.running:
try:
data, addr = self.sock.recvfrom(1024)
if len(data) < 6: # 最小消息长度检查
continue
msg_id = struct.unpack_from('<H', data, 2)[0]
# 根据消息ID处理不同类型的命令
if msg_id == 0x0001: # 动力母线配电指令
cmd = msg_disHVBCmdMsg()
if cmd.unpack(data):
print("收到动力母线配电指令")
# 这里可以添加命令处理逻辑
elif msg_id == 0x0002: # 动力母线A配电指令
cmd = msg_disHVBACmdMsg()
if cmd.unpack(data):
print("收到动力母线A配电指令")
elif msg_id == 0x0003: # 仪表主母线配电指令
cmd = msg_disLVMBCmdMsg()
if cmd.unpack(data):
print("收到仪表主母线配电指令")
elif msg_id == 0x0004: # 仪表汇流排配电指令
cmd = msg_disLVBCmdMsg()
if cmd.unpack(data):
print("收到仪表汇流排配电指令")
except Exception as e:
print(f"接收消息出错: {e}")
break
def update_sim_data(self):
"""更新模拟数据,可以扩展实现更复杂的模拟逻辑"""
# 这里可以添加数据变化的逻辑
pass
if __name__ == "__main__":
simulator = PowerManagerSimulator()
try:
simulator.start()
print("PowerManager模拟器已启动,按Ctrl+C停止...")
while True:
time.sleep(1)
except KeyboardInterrupt:
simulator.stop()
print("PowerManager模拟器已停止")
+768
View File
@@ -0,0 +1,768 @@
import struct
# 高压母线配电反馈
class msg_disHighVolBusFbMsg:
def __init__(self):
self.start1 = 0x20
self.start2 = 0x20
self.id = 0x0005
self.length = 38 # disHighVolBusState结构体大小
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.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('<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)
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.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 = 0x20
self.start2 = 0x20
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 = 0x20
self.start2 = 0x20
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 = 0x20
self.start2 = 0x20
self.id = 0x0008
self.length = 24 # 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.powerFailureSignal = 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.powerFailureSignal)
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.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 = 0x20
self.start2 = 0x20
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 = 0x20
self.start2 = 0x20
self.id = 0x0002
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]
# 仪表母线配电指令
class msg_disLVMBCmdMsg:
def __init__(self):
self.start1 = 0x20
self.start2 = 0x20
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)
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 = 0x20
self.start2 = 0x20
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]