增加了配电app
This commit is contained in:
File diff suppressed because it is too large
Load Diff
@@ -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("测试数据已成功插入数据库")
|
||||
@@ -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
@@ -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模拟器已停止")
|
||||
@@ -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]
|
||||
@@ -530,14 +530,6 @@ class msg_disHVBCmd:
|
||||
self.checkCode = unpacked_data[19]
|
||||
except struct.error as e:
|
||||
print(f"Error unpacking data: msg_disHVBCmd {e}")
|
||||
|
||||
|
||||
# unsigned char bowFTDevice123CircuitBreaker;
|
||||
# unsigned char actuatorCircuitBreaker;
|
||||
# unsigned char mastSteeringGearControlBoxCircuitBreaker;
|
||||
# unsigned char xczCircuitBreaker;
|
||||
# unsigned char bowRudderControlBoxCircuitBreaker;
|
||||
# unsigned char openWaterCoverStartCylinderCircuitBreaker;
|
||||
class msg_disHVBACmd:
|
||||
def __init__(self):
|
||||
self.start1 = None
|
||||
@@ -567,13 +559,6 @@ class msg_disHVBACmd:
|
||||
self.checkCode = unpacked_data[10]
|
||||
except struct.error as e:
|
||||
print(f"Error unpacking data: msg_disHVBACmd {e}")
|
||||
# unsigned char lithiumBatteryGroupInstrumentCircuitBreaker;
|
||||
# unsigned char bowLowVoltageDistributionBoxCircuitBreaker;
|
||||
# unsigned char unit4InstrumentDC48VCircuitBreaker;
|
||||
# unsigned char dcC1DCDistributionPanelCircuitBreaker;
|
||||
# unsigned char reservedCircuitBreaker1; // 为了区分,添加了数字后缀
|
||||
# unsigned char reservedCircuitBreaker2; // 为了区分,添加了数字后缀
|
||||
# unsigned char emergencyLithiumBatteryGroup2CircuitBreaker;
|
||||
class msg_disHVBBCmd:
|
||||
def __init__(self):
|
||||
self.start1 = None
|
||||
@@ -606,16 +591,6 @@ class msg_disHVBBCmd:
|
||||
except struct.error as e:
|
||||
print(f"Error unpacking data: msg_disHVBBCmd {e}")
|
||||
|
||||
|
||||
# unsigned char unit1CircuitBreaker;
|
||||
# unsigned char unit2CircuitBreaker;
|
||||
# unsigned char unit3CircuitBreaker;
|
||||
# unsigned char unit5CircuitBreaker;
|
||||
# unsigned char bowPZDeviceCircuitBreaker;
|
||||
# unsigned char reservedCircuitBreaker1; // 为了区分,添加了数字后缀
|
||||
# unsigned char reservedCircuitBreaker2; // 为了区分,添加了数字后缀
|
||||
# unsigned char emergencyLithiumBatteryGroup1CircuitBreaker;
|
||||
|
||||
class msg_disLVBCmd:
|
||||
def __init__(self):
|
||||
self.start1 = None
|
||||
|
||||
Reference in New Issue
Block a user