增加了配电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
+12 -1
View File
@@ -74,7 +74,18 @@
"thread": "cpp",
"typeindex": "cpp",
"variant": "cpp",
"*.ipp": "cpp"
"*.ipp": "cpp",
"cassert": "cpp",
"cerrno": "cpp",
"cfloat": "cpp",
"ciso646": "cpp",
"climits": "cpp",
"filesystem": "cpp",
"ios": "cpp",
"locale": "cpp",
"stack": "cpp",
"cstdbool": "cpp",
"version": "cpp"
},
"C_Cpp.errorSquiggles": "disabled",
"marscode.chatLanguage": "cn",
+47 -48
View File
@@ -1,48 +1,47 @@
{"uPower_currentState_st":{
"HVABFTDev123Cur_uint16" : 0,
"HVABactCur_uint16" : 0,
"HVABbowRudCur_uint16" : 0,
"HVABbusBCur_uint16" : 0,
"HVABbusBVol_uint16" : 0,
"HVABmastSteGeaCur_uint16" : 0,
"HVABopenWaterCur_uint16" : 0,
"HVABxczCur_uint16" : 0,
"HVBBCCUCur_uint16" : 0,
"HVBBFCSSecurSysCur_uint16" : 0,
"HVBBbatInsCur_uint16" : 0,
"HVBBbowLowVolDisBoxCur_uint16" : 0,
"HVBBdcC1InsCur_uint16" : 0,
"HVBBemer2BusVol_uint16" : 0,
"HVBBemerBatCur_uint16" : 0,
"HVBBinsBusVol_uint16" : 0,
"HVBBplcCur_uint16" : 0,
"HVBBreservedCur1_uint16" : 0,
"HVBBreservedCur2_uint16" : 0,
"HVBBunit4Cur_uint16" : 0,
"HVBFTDev45Cur_uint16" : 0,
"HVBbatGroupCur_uint16" : 0,
"HVBbowHVolDisBoxCur_uint16" : 0,
"HVBbusACur_uint16" : 0,
"HVBbusAVol_uint16" : 0,
"HVBdcDc5Cur_uint16" : 0,
"HVBfbCur_uint16" : 0,
"HVBmotorCur_uint16" : 0,
"HVBpowerBusCur_uint16" : 0,
"HVBpowerBusVol_uint16" : 0,
"HVBreservedCur1_uint16" : 0,
"HVBreservedCur2_uint16" : 0,
"HVBreservedCur3_uint16" : 0,
"HVBsternRud1Cur_uint16" : 0,
"HVBsternRud2Cur_uint16" : 0,
"HVBtyzCur_uint16" : 0,
"LVBBbowPZDevCur_uint16" : 0,
"LVBBemerBatCur_uint16" : 0,
"LVBBemerBusVol_uint16" : 0,
"LVBBinsBusCur_uint16" : 0,
"LVBBunit1Cur_uint16" : 0,
"LVBBunit2Cur_uint16" : 0,
"LVBBunit3Cur_uint16" : 0,
"LVBBunit5Cur_uint16" : 0,
"LVBinsBusVol_uint16" : 0
}
}
{
"HVABFTDev123Cur_uint16": 0,
"HVABactCur_uint16": 0,
"HVABbowRudCur_uint16": 0,
"HVABbusBCur_uint16": 0,
"HVABbusBVol_uint16": 0,
"HVABmastSteGeaCur_uint16": 0,
"HVABopenWaterCur_uint16": 0,
"HVABxczCur_uint16": 0,
"HVBBCCUCur_uint16": 0,
"HVBBFCSSecurSysCur_uint16": 0,
"HVBBbatInsCur_uint16": 0,
"HVBBbowLowVolDisBoxCur_uint16": 0,
"HVBBdcC1InsCur_uint16": 0,
"HVBBemer2BusVol_uint16": 0,
"HVBBemerBatCur_uint16": 0,
"HVBBinsBusVol_uint16": 0,
"HVBBplcCur_uint16": 0,
"HVBBreservedCur1_uint16": 0,
"HVBBreservedCur2_uint16": 0,
"HVBBunit4Cur_uint16": 0,
"HVBFTDev45Cur_uint16": 0,
"HVBbatGroupCur_uint16": 0,
"HVBbowHVolDisBoxCur_uint16": 0,
"HVBbusACur_uint16": 0,
"HVBbusAVol_uint16": 0,
"HVBdcDc5Cur_uint16": 0,
"HVBfbCur_uint16": 0,
"HVBmotorCur_uint16": 0,
"HVBpowerBusCur_uint16": 0,
"HVBpowerBusVol_uint16": 0,
"HVBreservedCur1_uint16": 0,
"HVBreservedCur2_uint16": 0,
"HVBreservedCur3_uint16": 0,
"HVBsternRud1Cur_uint16": 0,
"HVBsternRud2Cur_uint16": 0,
"HVBtyzCur_uint16": 0,
"LVBBbowPZDevCur_uint16": 0,
"LVBBemerBatCur_uint16": 0,
"LVBBemerBusVol_uint16": 0,
"LVBBinsBusCur_uint16": 0,
"LVBBunit1Cur_uint16": 0,
"LVBBunit2Cur_uint16": 0,
"LVBBunit3Cur_uint16": 0,
"LVBBunit5Cur_uint16": 0,
"LVBinsBusVol_uint16": 0
}
+10 -11
View File
@@ -1,11 +1,10 @@
{"uPower_disSysState_st":{
"HVolABusBreaker_unit16" : 0,
"HVolBBusBreaker_unit16" : 0,
"HVolBusBreaker_uint16" : 0,
"LVolBusBreaker_uint16" : 0,
"faultCode_array" :
[
0
]
}
}
{
"HVolABusBreaker_unit16": 0,
"HVolBBusBreaker_unit16": 0,
"HVolBusBreaker_uint16": 0,
"LVolBusBreaker_uint16": 0,
"faultCode_array":
[
0
]
}
+30 -31
View File
@@ -1,31 +1,30 @@
{"uPower_fcsState_st":{
"backpressure1_fp32" : 0.0,
"backpressure2_fp32" : 0.0,
"ch4oConcent1_fp32" : 0.0,
"ch4oConcent2_fp32" : 0.0,
"ch4o_fp32" : 0.0,
"excTemp_fp32" : 0.0,
"faultCode1_uint16" : 0,
"faultCode2_uint16" : 0,
"faultCode3_uint16" : 0,
"fcuCurIns_fp32" : 0.0,
"fcuCurPower_fp32" : 0.0,
"fcuCur_fp32" : 0.0,
"fcuFaultLeve_uint8" : 0,
"fcuOutIns_fp32" : 0.0,
"fcuOutPower_fp32" : 0.0,
"fcuState_uint8" : 0,
"fcuVolIns_fp32" : 0.0,
"fcuVolPower_fp32" : 0.0,
"fcuVol_fp32" : 0.0,
"flameDet_uint8" : 0,
"h2Concent1_fp32" : 0.0,
"h2Concent2_fp32" : 0.0,
"o2Concent1_fp32" : 0.0,
"o2Concent2_fp32" : 0.0,
"o2Level_fp32" : 0.0,
"o2_fp32" : 0.0,
"powLimit_fp32" : 0.0,
"powerGen_fp32" : 0.0
}
}
{
"backpressure1_fp32": 0.0,
"backpressure2_fp32": 0.0,
"ch4oConcent1_fp32": 0.0,
"ch4oConcent2_fp32": 0.0,
"ch4o_fp32": 0.0,
"excTemp_fp32": 0.0,
"faultCode1_uint16": 0,
"faultCode2_uint16": 0,
"faultCode3_uint16": 0,
"fcuCurIns_fp32": 0.0,
"fcuCurPower_fp32": 0.0,
"fcuCur_fp32": 0.0,
"fcuFaultLeve_uint8": 0,
"fcuOutIns_fp32": 0.0,
"fcuOutPower_fp32": 0.0,
"fcuState_uint8": 0,
"fcuVolIns_fp32": 0.0,
"fcuVolPower_fp32": 0.0,
"fcuVol_fp32": 0.0,
"flameDet_uint8": 0,
"h2Concent1_fp32": 0.0,
"h2Concent2_fp32": 0.0,
"o2Concent1_fp32": 0.0,
"o2Concent2_fp32": 0.0,
"o2Level_fp32": 0.0,
"o2_fp32": 0.0,
"powLimit_fp32": 0.0,
"powerGen_fp32": 0.0
}
+38 -39
View File
@@ -1,39 +1,38 @@
{"uPower_liBatState_st":{
"fcuCurToInsLimit1_uint8" : 0,
"fcuCurToinsLimit2_uint8" : 0,
"insBatCurElect_uint16" : 0,
"insBatLimit_uint16" : 0,
"insBatSoc_uint8" : 0,
"insBatTotalElect_uint16" : 0,
"insChargeState_uint8" : 0,
"insCurSocHold1_uint8" : 0,
"insCurSocHold2_uint8" : 0,
"insCurSocHold3_uint8" : 0,
"insCurrent_uint16" : 0,
"insLinkVol_uint16" : 0,
"insNegRelayState_uint8" : 0,
"insNegRes_uint16" : 0,
"insPackVol_uint16" : 0,
"insPosRelayState_uint8" : 0,
"insPosRes_uint16" : 0,
"insfaultCode_uint8" : 0,
"powBatCurElect_uint16" : 0,
"powBatSoc_uint8" : 0,
"powBatTotalElect_uint16" : 0,
"powChargeState_uint8" : 0,
"powCurSocHold1_uint8" : 0,
"powCurSocHold2_uint8" : 0,
"powCurSocHold3_uint8" : 0,
"powCurToInsLimit1_uint8" : 0,
"powCurToinsLimit2_uint8" : 0,
"powCur_uint16" : 0,
"powLinkVol_uint16" : 0,
"powNegRelayState_uint8" : 0,
"powNegRes_uint16" : 0,
"powPosRelayState_uint8" : 0,
"powPosRes_uint16" : 0,
"powerBatLimit_uint16" : 0,
"powerPackVol_uint16" : 0,
"powfaultCode_uint8" : 0
}
}
{
"fcuCurToInsLimit1_uint8": 0,
"fcuCurToinsLimit2_uint8": 0,
"insBatCurElect_uint16": 0,
"insBatLimit_uint16": 0,
"insBatSoc_uint8": 0,
"insBatTotalElect_uint16": 0,
"insChargeState_uint8": 0,
"insCurSocHold1_uint8": 0,
"insCurSocHold2_uint8": 0,
"insCurSocHold3_uint8": 0,
"insCurrent_uint16": 0,
"insLinkVol_uint16": 0,
"insNegRelayState_uint8": 0,
"insNegRes_uint16": 0,
"insPackVol_uint16": 0,
"insPosRelayState_uint8": 0,
"insPosRes_uint16": 0,
"insfaultCode_uint8": 0,
"powBatCurElect_uint16": 0,
"powBatSoc_uint8": 0,
"powBatTotalElect_uint16": 0,
"powChargeState_uint8": 0,
"powCurSocHold1_uint8": 0,
"powCurSocHold2_uint8": 0,
"powCurSocHold3_uint8": 0,
"powCurToInsLimit1_uint8": 0,
"powCurToinsLimit2_uint8": 0,
"powCur_uint16": 0,
"powLinkVol_uint16": 0,
"powNegRelayState_uint8": 0,
"powNegRes_uint16": 0,
"powPosRelayState_uint8": 0,
"powPosRes_uint16": 0,
"powerBatLimit_uint16": 0,
"powerPackVol_uint16": 0,
"powfaultCode_uint8": 0
}
+6 -5
View File
@@ -1,12 +1,13 @@
{
"currentMod_uint8": 1,
"falutLevel_uint8": 0,
"currentMod_uint8": 0,
"faultCode_array":
[
0
],
"faultLevel_uint8": 0,
"leakage_uint8": 0,
"powerState_uint8": 0,
"soc_uint32": 0,
"sustainableTime_uint32": 0,
"workCondition_uint8": 5
"soc_uint16": 0,
"sustainableTime_int64": 0,
"workCondition_uint8": 1
}
+277
View File
@@ -0,0 +1,277 @@
# 上位机控制程序设计文档
## 1. 程序架构设计
采用MVC模式设计,主要分为以下模块:
### 1.0 系统架构图
```mermaid
graph TD
A[用户界面] -->|控制指令| B[控制器]
B -->|发送命令| C[通信模块]
C -->|UDP协议| D[下位机]
D -->|状态反馈| C
C -->|解析数据| B
B -->|更新状态| A
B -->|记录数据| E[数据库]
```
### 1.1 消息处理流程
1. 接收原始UDP数据
2. 根据消息ID选择解析器
3. 验证校验码
4. 解析为结构化数据
5. 触发状态更新事件
6. 存储到数据库
### 1.1 通信模块 (Model) - 详细设计
#### 消息类型映射表
| 消息ID | 消息名称 | 处理函数 | 更新频率 |
|--------|----------|----------|----------|
| 0x0005 | 高压母线状态 | parse_high_vol_bus | 1Hz |
| 0x0006 | 高压A母线状态 | parse_high_a_vol_bus | 1Hz |
| 0x0007 | 低压主母线状态 | parse_low_main_bus | 1Hz |
| 0x0008 | 低压汇流排状态 | parse_low_bus | 1Hz |
#### 异常处理机制
1. 校验失败:丢弃数据并记录错误日志
2. 超时处理:3次重试后标记设备离线
3. 数据异常:触发告警并显示在界面
```python
class UDPMessageHandler:
"""UDP消息处理基类"""
def __init__(self, ip, port):
self.ip = ip
self.port = port
self.socket = None
def connect(self):
"""建立UDP连接"""
pass
def send_message(self, msg):
"""发送消息"""
pass
def receive_message(self):
"""接收消息"""
pass
def close(self):
"""关闭连接"""
pass
class PowerMessageHandler(UDPMessageHandler):
"""电源管理专用消息处理器"""
def __init__(self, ip, port):
super().__init__(ip, port)
self.message_parsers = {
0x0005: self.parse_high_vol_bus,
0x0006: self.parse_high_a_vol_bus,
# 其他消息类型...
}
def parse_high_vol_bus(self, data):
"""解析高压母线消息"""
pass
# 其他消息解析方法...
```
### 1.2 界面模块 (View) - 详细设计
#### 主界面布局
```mermaid
graph LR
A[标题栏] --> B[状态区]
B --> C[电压电流仪表盘]
B --> D[断路器状态指示灯]
A --> E[控制区]
E --> F[电源控制按钮组]
E --> G[参数设置面板]
A --> H[日志区]
H --> I[实时消息列表]
H --> J[历史记录查询]
```
#### 组件说明
1. 电压电流仪表盘:实时显示各母线电压电流值
2. 断路器状态指示灯:绿色-闭合,红色-断开
3. 电源控制按钮组:带防误触保护(需长按3秒)
4. 参数设置面板:输入验证和范围检查
```python
class MainWindow(tk.Tk):
"""主窗口"""
def __init__(self):
super().__init__()
self.title("电源管理系统")
self.geometry("1200x800")
self.create_widgets()
def create_widgets(self):
"""创建界面组件"""
self.status_frame = StatusFrame(self)
self.control_frame = ControlFrame(self)
self.log_frame = LogFrame(self)
# 布局管理
self.status_frame.pack(side=tk.TOP, fill=tk.X)
self.control_frame.pack(side=tk.LEFT, fill=tk.Y)
self.log_frame.pack(side=tk.RIGHT, expand=True, fill=tk.BOTH)
class StatusFrame(tk.Frame):
"""状态显示面板"""
def update_status(self, data):
"""更新状态显示"""
pass
class ControlFrame(tk.Frame):
"""控制面板"""
def create_buttons(self):
"""创建控制按钮"""
pass
```
### 1.3 控制器模块 (Controller) - 详细设计
#### 状态管理机制
1. 使用有限状态机(FSM)管理电源系统状态
2. 状态转换规则:
- 仅当所有预检通过才允许上电
- 故障时自动进入安全状态
- 人工确认后才能复位
#### 命令处理流程
```mermaid
sequenceDiagram
用户->>界面: 点击控制按钮
界面->>控制器: 发送控制命令
控制器->>业务逻辑: 验证命令有效性
业务逻辑->>通信模块: 发送UDP指令
通信模块->>下位机: 传输控制报文
下位机-->>通信模块: 返回应答
通信模块->>控制器: 更新命令状态
控制器->>界面: 显示操作结果
控制器->>数据库: 记录操作日志
```
```python
class PowerManagerController:
"""主控制器"""
def __init__(self):
self.message_handler = PowerMessageHandler("192.168.1.100", 5000)
self.view = MainWindow()
# 绑定事件
self.bind_events()
def bind_events(self):
"""绑定UI事件"""
self.view.control_frame.on_button_click = self.handle_control_command
def handle_control_command(self, cmd):
"""处理控制命令"""
pass
def start(self):
"""启动应用程序"""
self.message_handler.connect()
self.view.mainloop()
```
## 2. 接口规范
### 2.1 模块交互架构
```mermaid
classDiagram
class Communication {
+send_command(cmd: dict) bool
+get_status() dict
+subscribe(callback: function)
+on_message_received(data: bytes)
}
class Controller {
+handle_ui_event(event: dict)
+update_system_status(status: dict)
+log_operation(log: dict)
}
class UI {
+update_status(data: dict)
+show_alert(level: int, msg: str)
+log_message(source: str, msg: str)
}
Communication --> Controller : 状态更新通知
Controller --> UI : 界面更新指令
UI --> Controller : 用户操作事件
```
### 2.2 详细接口定义
#### 通信模块 → 控制器
```python
# 状态更新通知
{
"msg_type": "status_update",
"timestamp": "2025-05-04T10:20:00",
"data": {
"voltage": 220.5,
"current": 15.2,
"breaker_state": True
}
}
# 错误通知
{
"msg_type": "error",
"code": 1001,
"message": "校验失败"
}
```
#### 控制器 → 界面
```python
# 状态显示更新
{
"component": "voltage_meter",
"value": 220.5,
"unit": "V",
"normal_range": [210, 230]
}
# 告警信息
{
"level": 2, # 1-警告 2-错误 3-严重
"message": "A相电压过高",
"suggestion": "检查A相负载"
}
```
#### 界面 → 控制器
```python
# 按钮操作事件
{
"event_type": "button_click",
"button_id": "power_on",
"timestamp": "2025-05-04T10:20:01"
}
# 参数设置事件
{
"event_type": "param_set",
"param": "voltage_limit",
"value": 230,
"unit": "V"
}
```
### 2.3 错误处理规范
1. 通信错误:自动重试3次后通知控制器
2. 业务逻辑错误:记录详细日志并通知界面
3. 界面错误:显示友好提示并保持最后正常状态
## 3. 数据库设计
(之前已完成的数据库表结构...)
+1 -1
View File
@@ -54,7 +54,7 @@ public:
msg_CcuStateFbMsg m_CcuCurrentState;
msg_disHighVolBusFbMsg m_disHighVolBusCurrentState;
msg_disHighAVolBusFbMsg m_disHighAVolBusCurrentState;
msg_disHighBVolBusFbMsg m_disHighBVolBusCurrentState;
msg_disLowMainBusFbMsg m_disHighBVolBusCurrentState;
msg_disLowBusFbMsg m_disLowBusState;
// 配电和CCU的反馈状态时间戳
double msg_CcuStateFbMsg_Update_time;
+63 -2
View File
@@ -11,6 +11,37 @@ void PowerManagerFsm::react(TaskStopEvent const &e) {
transit<RemoteControl>();
LOG_F(INFO, "使命结束");
};
void PowerManagerFsm::react(CycleTriggeredEvent const &){
if(pm->currentMod != RunMode::Debug)
{
}
}
bool PowerManagerFsm::handPowerProtection(DevCmdExt const &e){
if(pm->workCondition > WorkCondition::REMOTE_CONTROL){
LOG_F(INFO, "上电保护,执行任务时候禁止操作设备");
return false;
}
if(e.id == DeviceId::singleBeamSonar1 ||
e.id == DeviceId::singleBeamSonar2 ||
e.id == DeviceId::singleBeamSonar3 ||
e.id == DeviceId::singleBeamSonar4 ||
e.id == DeviceId::singleBeamSonar5 ||
e.id == DeviceId::singleBeamSonar6 ||
e.id == DeviceId::singleBeamSonar7 ||
e.id == DeviceId::singleBeamSonar8 ||
e.id == DeviceId::sideSonar ||
e.id == DeviceId::forwardSonar ||
e.id == DeviceId::lowFreqSonar ||
e.id == DeviceId::DVL ||
e.id == DeviceId::USBL){
if(e.cmd == 1){
LOG_F(INFO, "水声设备操作上电保护 %d 已关闭", e.id);
return false;
}
}
}
void PowerManagerFsm::react(TaskStartEvent const &e){
LOG_F(INFO, "TaskStartEvent received - type: %d, enableBowRudder: %d, enableBuoyancyAdjustment: %d", e.type, e.enableBowRudder, e.enableBuoyancyAdjustment);
switch (e.type)
@@ -44,7 +75,7 @@ void PowerManagerFsm::react(TaskStartEvent const &e){
}
}
void PowerManagerFsm::react(DevCmdExt const &e) {
void PowerManagerFsm::react(DevCmdExt const &e) {
LOG_F(INFO, "DevCmdExt received - id: %d, cmd: %d", e.id, e.cmd);
switch (e.id)
{
@@ -1704,6 +1735,33 @@ void PowerManagerFsm::react(DevCmdExt const &e) {
break;
}
}
void StandbyState::react(DevCmdExt const &e)
{
LOG_F(INFO, "StandbyState::react(DevCmdExt const &e)");
//正常模式下,不允许执行DevCmdExt
if (pm->currentMod == RunMode::Normal )
{
LOG_F(INFO, "正常模式下,不允许执行DevCmdExt");
}
else if (pm->currentMod == RunMode::Test)
{
if(handPowerProtection(e))
PowerManagerFsm::react(e);
else
LOG_F(INFO, "DevCmdExt 执行失败");
}
else if (pm->currentMod == RunMode::Debug)
{
LOG_F(INFO, "调试模式下,直接执行DevCmdExt");
PowerManagerFsm::react(e);
}
else
{
LOG_F(INFO, "当前模式未知");
}
}
void PowerManagerFsm::basicNavigationFault(FaultEvent const &e)
{
LOG_F(INFO, "basicNavigationFault");
@@ -1712,6 +1770,7 @@ void PowerManagerFsm::basicNavigationFault(FaultEvent const &e)
LOG_F(INFO, "部分深度计失效");
pm->faultCode.push_back(0x1102);
pm->faultCode.push_back(0x1103);
pm->faultCode.push_back(0x1104);
}
if(FaultEnable::BasicNavigationFault_2)
{
@@ -2003,7 +2062,7 @@ void StandbyState::react(MasterCommandEvent const &) {
}
void StandbyState::handlePowerOn() {
PowerManagerFsm::pm->m_pmEvent = "动力电上电";
LOG_F(INFO,"动力电上电");
PowerManagerFsm::pm->m_CcuColCmd.powerBatCmd = 0x10;
if(PowerManagerFsm::pm->m_pmCurrentState.ccustate.fcuState == 0x04)
PowerManagerFsm::pm->m_CcuColCmd.fcuCmd = 0x02;
@@ -2326,6 +2385,8 @@ void RemoteControl::entry() {
LOG_F(INFO, "进入遥控工况");
}
// void StandbyState::react(TaskStart const &)
// {
// LOG_F(INFO, "接收到任务启动信息");
+9 -5
View File
@@ -23,9 +23,6 @@ enum class PowerSystemState {
struct InitEvent : tinyfsm::Event { };
struct StandbyEvent : tinyfsm::Event { };
struct TaskStopEvent : tinyfsm::Event { };
//==================状态流程事件============================
struct MasterCommandEvent : tinyfsm::Event {};
struct TaskStartEvent : tinyfsm::Event {
int type;
bool enableBowRudder;
@@ -33,14 +30,17 @@ struct TaskStartEvent : tinyfsm::Event {
TaskStartEvent() : type(0), enableBowRudder(false), enableBuoyancyAdjustment(false) {};
TaskStartEvent(int type, bool bowRudder, bool buoyancyAdjustment) : type(type), enableBowRudder(bowRudder), enableBuoyancyAdjustment(buoyancyAdjustment) {};
};
struct DeviceCmd : tinyfsm::Event { };
//==================状态流程事件============================
struct CycleTriggeredEvent : tinyfsm::Event {};
struct MasterCommandEvent : tinyfsm::Event {};
struct DeviceCmd : tinyfsm::Event {};
struct DevCmdExt : tinyfsm::Event {
int id;
int cmd;
DevCmdExt() : id(0), cmd(0) {};
DevCmdExt(int id, int cmd) : id(id), cmd(cmd) {};
};
struct FaultEvent : tinyfsm::Event {
struct FaultEvent : tinyfsm::Event {
unsigned int subDisSysFaultCode;
unsigned int disSysFaultCode;
unsigned int powerFaultCode;
@@ -78,12 +78,15 @@ public:
virtual void react(TaskStartEvent const &e);
virtual void react(FaultEvent const &e);
virtual void react(TaskStopEvent const &e);
virtual void react(CycleTriggeredEvent const &);
//操作函数
void handelPowerCmd();
void handleModCmd();
void handleWorkCmd();
void handleDeviceCmd();
bool handPowerProtection(DevCmdExt const &e);
//故障处理
void basicNavigationFault(FaultEvent const &e);
void extendedNavigationFault(FaultEvent const &e);
@@ -141,6 +144,7 @@ class StandbyState : public PowerManagerFsm {
public:
void entry() override;
void react(StandbyEvent const &) override;
void react(DevCmdExt const &e) override;
void react(MasterCommandEvent const &) override;
private:
void handlePowerOn();
+1
View File
@@ -34,6 +34,7 @@ PowerManger::PowerManger()
sustainableTime = 0;
m_faultNum = 0;
m_ticker = 0;
m_leakage = 0;
faultCode.push_back(0);
m_pmCurrentState = {};
+2 -2
View File
@@ -98,7 +98,8 @@ class PowerManger : public AppCastingMOOSApp
unsigned int sustainableTime;
unsigned int m_faultNum;
Driver m_driver; //设备表处理
std::string m_pmEvent; // 状态机事件描述
unsigned char m_leakage;
// std::string m_pmEvent; // 状态机事件描述
//===========================CONFIG========================================
long m_lPort;
unsigned int m_nReceiveBufferSizeKB;
@@ -106,7 +107,6 @@ class PowerManger : public AppCastingMOOSApp
double m_current_time;
unsigned int m_ticker;
int connectState;
//=============================过程函数======================================
void initControlCmd();
+2
View File
@@ -385,6 +385,8 @@ void UpperCommManager::buildSystemReport() {
suffix = getTypeName(typeid(m_pm->sustainableTime).name());
pms["sustainableTime_int64"] = m_pm->sustainableTime;
pms["leakage_uint8"] = m_pm->m_leakage;
//2.构建燃料电池状态报告
suffix = getTypeName(typeid(m_pm->m_pmCurrentState.ccustate.fcuState).name());
+1 -1
View File
@@ -27,7 +27,7 @@ using namespace std;
//决策消息
#define DB_TO_PM_DEEPTH "uDevice_depth_st"
#define DB_TO_PM_MISSION "uPlan_taskReport_st"
#define DB_TO_PM_MISSION "uPlan_taskStart_cmd"
#define DB_TO_PM_TASKSTOP "uPlan_planStop_cmd"
//外部通信消息
+5 -5
View File
@@ -77,12 +77,12 @@ typedef struct
cChecksum checkCode;
}msg_disHVBACmd;
typedef struct
typedef struct msg_disHVBBCmd
{
m_header header;
disHighBVolBusCmd data;
cChecksum checkCode;
}msg_disHVBBCmd;
}msg_disLVMBCmd;
typedef struct
{
@@ -121,12 +121,12 @@ typedef struct {
cChecksum checkCode;
} msg_disHighAVolBusFbMsg;
// 高压母线B配电反馈
// 仪表母线配电反馈
typedef struct {
m_header header;
disHighBVolBusState data;
disLowMainBusState data;
cChecksum checkCode;
} msg_disHighBVolBusFbMsg;
} msg_disLowMainBusFbMsg;
//仪表汇流排配电反馈
typedef struct {
+269 -48
View File
@@ -120,149 +120,292 @@ typedef struct {
typedef struct disHighVolBusState
{
//断路器状态
// 5: 燃料电池断路器
unsigned char fuelCellCircuitBreaker;
// 6: 动力锂电池断路器
unsigned char powerLithiumBatteryCircuitBreaker;
// 7: 推进电机断路器
unsigned char propulsionMotorCircuitBreaker;
// 8: 锂电池组仪表断路器
unsigned char lithiumBatteryGroupInstrumentCircuitBreaker;
// 9: DC/DC5模块断路器
unsigned char dcDc5ModuleCircuitBreaker;
// 10: 艏部高压配电箱断路器
unsigned char bowHighVoltageDistributionBoxCircuitBreaker;
// 11: 艉部FT装置4/5断路器
unsigned char sternFTDevice45CircuitBreaker;
// 12: 艉舵开关1断路器
unsigned char sternRudderSwitch1CircuitBreaker;
// 13: 艉舵开关2断路器
unsigned char sternRudderSwitch2CircuitBreaker;
// 14: FB预留断路器
unsigned char fbReservedCircuitBreaker;
// 15: TYZ预留断路器
unsigned char tyzReservedCircuitBreaker;
// 16: 预留断路器
unsigned char reservedCircuitBreaker;
unsigned char busInsulationLow;
unsigned char busAInsulationHigh;
unsigned char lostPower;
unsigned char lostEmerPower;
// unsigned char busInsulationLow;
// unsigned char busAInsulationHigh;
// 17: DC/DC5故障字低
// 0x00: 正常状态
// Bit0: DC/DC模块过温关机
// Bit1: 输出过流
// Bit2: 输出过压
// Bit3: 输出欠压
// Bit4: 输入过压
// Bit5: 输入欠压
// Bit6: 输出短路保护
// Bit7: 内部故障
// 18: DC/DC5故障字高
unsigned char dcDcFaultWord1;
// 0x00: 正常状态
// Bit0: 通讯故障报警
// Bit1: 工作状态
// Bit2: 冷却泵1故障
// Bit3: 冷却泵2故障
// Bit4: 冷却水泄露
unsigned char dcDcFaultWord2;
// 19: 动力母排绝缘状态(0x55 正常,0xAA 绝缘低)
unsigned char powerBusInsulationStatus;
// 20: A汇流排绝缘状态(0x55 正常,0xAA 绝缘低)
unsigned char aBusInsulationStatus;
// 21: 仪表电源状态 (0x55 正常,0xAA 故障)
unsigned char meterPowerLossSignal;
// 22: 应急电源状态 (0x55 正常,0xAA 故障)
unsigned char emergencyPowerLossSignal;
// 23: 动力汇流排电压
unsigned short powerBusVoltage;
// 24: DC/DC5模块电流
unsigned short dcDc5ModuleCurrent;
// 25: 动力汇流排电流
unsigned short powerBusCurrent;
// 26: A汇流排电压
unsigned short busbarAVoltage;
// 27: 推进电机控制箱电流
unsigned short propulsionMotorControlBoxCurrent;
// 28: A汇流排电流
unsigned short busbarACurrent;
// 29: 锂电池组(仪表)电流
unsigned short lithiumBatteryGroupMeterCurrent;
// 30: 艏部高压配电箱电流
unsigned short bowHighVoltageDistributionBoxCurrent;
// 31: 艉部FT装置4/5电流
unsigned short sternFTDevice45Current;
// 32: TYZ预留开关电流
unsigned short tyzReservedSwitchCurrent;
// 33: 艉舵开关1电流
unsigned short sternRudderSwitch1Current;
// 34: 预留电流
unsigned short reservedCurrent1; // 改为 reservedCurrent1 以避免重名
// 35: 艉舵开关2电流
unsigned short sternRudderSwitch2Current;
// 36: 预留电流2
unsigned short reservedCurrent2; // 改为 reservedCurrent2 以避免重名
// 37: FB预留电流
unsigned short fbReservedSwitchCurrent;
// 38: 预留电流3
unsigned short reservedCurrent3; // 改为 reservedCurrent3 以避免重名
// 39: 冷却水压力
unsigned short coolWaterPressure;
}disHighVolBusState;
typedef struct disHighAVolBusState
{
//5. 艏部FT装置1/2/3断路器
unsigned char bowFTDevice123CircuitBreaker;
//6. 启闭机构断路器
unsigned char actuatorCircuitBreaker;
//7. 桅杆舵机控制箱断路器
unsigned char mastSteeringGearControlBoxCircuitBreaker;
//8. XCZ断路器
unsigned char xczCircuitBreaker;
//9. 艏舵控制箱断路器
unsigned char bowRudderControlBoxCircuitBreaker;
//10. 敞水盖启动电缸断路器
unsigned char openWaterCoverStartCylinderCircuitBreaker;
//11. 仪表电源失电信号 (0x55 正常,0xAA 故障)
unsigned char instrumentPowerFailureSignal;
//12. 应急电源失电信号 (0x55 正常,0xAA 故障)
unsigned char emergencyPowerFailureSignal;
//13. 浸水报警
// unsigned char busbarBInsulationStatus;
unsigned char waterIngressionAlarm;
//14. 汇流排B电压
unsigned short busbarBVoltage;
//15. 汇流排B电流
unsigned short busbarBCurrent;
//16. 艏部FT装置1/2/3电流
unsigned short bowFTDevice123Current;
//17. 启闭机构电流
unsigned short actuatorCurrent;
//18. 桅杆舵机控制箱电流
unsigned short mastSteeringGearControlBoxCurrent;
//19. XCZ电流
unsigned short xczCurrent;
//20. 艏舵控制箱电流
unsigned short bowRudderControlBoxCurrent;
//21. 敞水盖启动电缸电流
unsigned short openWaterCoverStartCylinderCurrent;
}disHighAVolBusState;
typedef struct disHighBVolBusState
{
//5. 锂电池组(仪表)断路器
unsigned char lithiumBatteryGroupInstrumentCircuitBreaker;
//6. 艏部低压配电箱断路器
unsigned char bowLowVoltageDistributionBoxCircuitBreaker;
//7. UNIT4仪表DC48V断路器
unsigned char unit4InstrumentDC48VCircuitBreaker;
//8. DC-C1直流配电板断路器
unsigned char dcC1DCDistributionPanelCircuitBreaker;
//9. 预留断路器1
unsigned char reservedCircuitBreaker1; // 为了区分,添加了数字后缀
//10. 预留断路器2
unsigned char reservedCircuitBreaker2; // 为了区分,添加了数字后缀
//11. 应急锂电池组2断路器
unsigned char emergencyLithiumBatteryGroup2CircuitBreaker;
//12. 仪表电源失电信号 (0x55 正常,0xAA 故障)
unsigned char instrumentPowerFailureSignal;
//13. 应急电源失电信号 (0x55 正常,0xAA 故障)
unsigned char emergencyPowerFailureSignal;
//14. 仪表汇流排绝缘低 (0x55 正常,0xAA 绝缘低)
unsigned char instrumentBusbarInsulationLow;
//15. 仪表母排电压
unsigned short instrumentBusbarVoltage;
//16. 艏部低压配电箱电流
unsigned short bowLowVoltageDistributionBoxCurrent;
//17. DC-C1(直流配电板1)仪表DC48V电流
unsigned short dcC1InstrumentDC48VCurrent;
//18. 预留电流
unsigned short reservedCurrent1; // 为了区分,添加了数字后缀
//19. 应急锂电池组2电流
unsigned short emergencyLithiumBatteryGroup2Current;
//20. 锂电池组(仪表)电流
unsigned short lithiumBatteryGroupInstrumentCurrent;
//21. UNIT4仪表DC48V电流
unsigned short unit4InstrumentDC48VCurrent;
//22. Ushort 预留电流
unsigned short reservedCurrent2; // 为了区分,添加了数字后缀
//23. 应急2汇流排电压
unsigned short emergency2BusbarVoltage;
//24. 复合能源管控系统应急DC48V电流
unsigned short compositeEnergyManagementSystemEmergencyDC48VCurrent;
//25. 燃料电池安全系统应急DC48V电流
unsigned short fuelCellSecuritySystemEmergencyDC48VCurrent;
//26. PLC控制电源电流
unsigned short plcControlPowerCurrent;
}disHighBVolBusState;
}disLowMainBusState;
typedef struct disLowBusState
{
//5. UNIT1断路器
unsigned char unit1CircuitBreaker;
//6. UNIT2断路器
unsigned char unit2CircuitBreaker;
//7. UNIT3断路器
unsigned char unit3CircuitBreaker;
//8. UNIT5断路器
unsigned char unit5CircuitBreaker;
//9. 艏部PZ装置断路器
unsigned char bowPZDeviceCircuitBreaker;
//10. 预留断路器1
unsigned char reservedCircuitBreaker1; // 为了区分,添加了数字后缀
//11. 预留断路器2
unsigned char reservedCircuitBreaker2; // 为了区分,添加了数字后缀
//12. 应急锂电池组1断路器
unsigned char emergencyLithiumBatteryGroup1CircuitBreaker;
//13. 仪表电源失电信号 (0x55 正常,0xAA 故障)
unsigned char powerFailureSignal;
//14. 浸水报警 (0x55 正常,0xAA 故障)
unsigned char waterIngressionAlarm;
//15. 仪表母排电压
unsigned short instrumentBusbarVoltage;
//16. 仪表母排电流
unsigned short instrumentBusbarCurrent;
//17. UNIT1电流
unsigned short unit1Current;
//18. UNIT2电流
unsigned short unit2Current;
//19. UNIT3电流
unsigned short unit3Current;
//20. UNIT5电流
unsigned short unit5Current;
//21. 艏部PZ装置电流
unsigned short bowPZDeviceCurrent;
//22. 应急锂电池组1电流
unsigned short emergencyLithiumBatteryGroup1Current;
//23. 应急1汇流排电压
unsigned short emergency1BusbarVoltage;
}disLowBusState;
typedef struct disHighVolBusCmd
{
// 5: 燃料电池断路器
unsigned char fuelCellCircuitBreaker;
// 6: 动力锂电池断路器
unsigned char powerLithiumBatteryCircuitBreaker;
// 7: 推进电机断路器
unsigned char propulsionMotorCircuitBreaker;
// 8: 锂电池组仪表断路器
unsigned char lithiumBatteryGroupInstrumentCircuitBreaker;
// 9: DC/DC5模块断路器
unsigned char dcDc5ModuleCircuitBreaker;
// 10: 艏部高压配电箱断路器
unsigned char bowHighVoltageDistributionBoxCircuitBreaker;
// 11: 艉部FT装置4/5断路器
unsigned char sternFTDevice45CircuitBreaker;
// 12: 艉舵开关1断路器
unsigned char sternRudderSwitch1CircuitBreaker;
// 13: 艉舵开关2断路器
unsigned char sternRudderSwitch2CircuitBreaker;
// 14: FB预留断路器
unsigned char fbReservedCircuitBreaker;
// 15: TYZ预留断路器
unsigned char tyzReservedCircuitBreaker;
// 16: 预留断路器
unsigned char reservedCircuitBreaker;
// 17: DC/DC5模块启动
unsigned char dcdc5Module;
unsigned char inputWater;
unsigned char outputWater;
// 18: 冷却系统启动
unsigned char coolingSystem;
// unsigned char inputWater;
// unsigned char outputWater;
}disHighVolBusCmd;
typedef struct disHighAVolBusCmd
{
//5. 艏部FT装置1/2/3断路器
unsigned char bowFTDevice123CircuitBreaker;
//6. 启闭机构断路器
unsigned char actuatorCircuitBreaker;
//7. 桅杆舵机控制箱断路器
unsigned char mastSteeringGearControlBoxCircuitBreaker;
//8. XCZ断路器
unsigned char xczCircuitBreaker;
//9. 艏舵控制箱断路器
unsigned char bowRudderControlBoxCircuitBreaker;
//10. 敞水盖启动电缸断路器
unsigned char openWaterCoverStartCylinderCircuitBreaker;
}disHighAVolBusCmd;
typedef struct disHighBVolBusCmd
{
//5. 锂电池组(仪表)断路器
unsigned char lithiumBatteryGroupInstrumentCircuitBreaker;
//6. 艏部低压配电箱断路器
unsigned char bowLowVoltageDistributionBoxCircuitBreaker;
//7. UNIT4仪表DC48V断路器
unsigned char unit4InstrumentDC48VCircuitBreaker;
//8. DC-C1直流配电板断路器
unsigned char dcC1DCDistributionPanelCircuitBreaker;
//9. 预留断路器1
unsigned char reservedCircuitBreaker1; // 为了区分,添加了数字后缀
//10. 预留断路器2
unsigned char reservedCircuitBreaker2; // 为了区分,添加了数字后缀
//11. 应急锂电池组2断路器
unsigned char emergencyLithiumBatteryGroup2CircuitBreaker;
}disHighBVolBusCmd;
}disLowMainBusCmd;
typedef struct disLowBusCmd
{
@@ -284,7 +427,7 @@ typedef struct pmState
ccuState ccustate;
disHighVolBusState bus1State;
disHighAVolBusState bus2State;
disHighBVolBusState bus3State;
disLowMainBusState bus3State;
disLowBusState bus4State;
} PmState;
@@ -439,6 +582,17 @@ namespace WorkCondition {
};
};
namespace RunMode {
enum Type : unsigned char {
//正常模式
Normal = 0,
//测试模式
Test = 1,
//调试模式
Debug = 2
};
};
namespace TaskType {
enum Type : unsigned char {
THROW_LOAD = 1, // 抛载
@@ -510,55 +664,122 @@ struct DeviceSwitchCmd
int cmd;
};
namespace DeviceId {
enum Type : unsigned char {
singleBeamSonar1 = 0,
singleBeamSonar2 = 1,
singleBeamSonar3 = 2,
singleBeamSonar4 = 3,
singleBeamSonar5 = 4,
singleBeamSonar6 = 5,
singleBeamSonar7 = 6,
singleBeamSonar8 = 7,
forwardSonar = 8,
bowCover1 = 9,
bowCover2 = 10,
bowCover3 = 11,
bowCover4 = 12,
bowCover5 = 13,
bowCover6 = 14,
bowRudderDeploy = 15,
bowRudderServo1 = 16,
bowRudderServo2 = 17,
depth1 = 18,
depth2 = 19,
depth3 = 20,
overDeep1 = 21,
overDeep2 = 22,
ctd1 = 23,
ctd2 = 24,
soundVeloc = 25,
waterInject = 26,
bowWaterlnet1 = 27,
bowWaterlnet2 = 28,
bowWaterlnet3 = 29,
bowWaterlnet4 = 30,
bowWaterlnet5 = 31,
bowWaterlnet6 = 32,
bowWaterlnet7 = 33,
bowWaterlnet8 = 34,
sideSonar = 35,
lowFreqSonar = 36,
launchControler = 37,
photoSensor = 38,
electSensor = 39,
commMast = 40,
mastLiftingServo = 41,
USBL = 42,
DVL = 43,
buoyancyAdjust1 = 44,
buoyancyAdjust2 = 45,
buoyancyAdjust3 = 46,
buoyancyAdjust4 = 47,
buoyancyAdjust5 = 48,
sternRudderServo1 = 49,
sternRudderServo2 = 50,
sternRudderServo3 = 51,
sternRudderServo4 = 52,
thruster = 53,
bowThrow = 54,
sternThrow = 55,
buoyage = 56,
ins = 57,
ntp = 58,
inputWaterSensor1 = 59,
inputWaterSensor2 = 60,
inputWaterSensor3 = 61,
};
}
namespace FaultEnable {
enum Type : bool {
BasicNavigationFault_1 = true, // 使能故障
BasicNavigationFault_2 = false,
BasicNavigationFault_3 = false,
BasicNavigationFault_4 = false,
BasicNavigationFault_5 = false,
BasicNavigationFault_6 = false,
BasicNavigationFault_7 = false,
BasicNavigationFault_8 = false,
BasicNavigationFault_9 = false,
BasicNavigationFault_10 = false,
BasicNavigationFault_2 = true,
BasicNavigationFault_3 = true,
BasicNavigationFault_4 = true,
BasicNavigationFault_5 = true,
BasicNavigationFault_6 = true,
BasicNavigationFault_7 = true,
BasicNavigationFault_8 = true,
BasicNavigationFault_9 = true,
BasicNavigationFault_10 = true,
ExtendedNavigationFault_1 = false, // 使能故障
ExtendedNavigationFault_2 = false,
ExtendedNavigationFault_3 = false,
ExtendedNavigationFault_4 = false,
ExtendedNavigationFault_1 = true, // 使能故障
ExtendedNavigationFault_2 = true,
ExtendedNavigationFault_3 = true,
ExtendedNavigationFault_4 = true,
ObstacleAvoidanceFault_1 = false, // 使能故障
ObstacleAvoidanceFault_2 = false,
ObstacleAvoidanceFault_3 = false,
ObstacleAvoidanceFault_1 = true, // 使能故障
ObstacleAvoidanceFault_2 = true,
ObstacleAvoidanceFault_3 = true,
BuoyancyControlFault_1 = false, // 使能故障
BuoyancyControlFault_2 = false,
BuoyancyControlFault_3 = false,
BuoyancyControlFault_4 = false,
BuoyancyControlFault_1 = true, // 使能故障
BuoyancyControlFault_2 = true,
BuoyancyControlFault_3 = true,
BuoyancyControlFault_4 = true,
CommunicationSystemFault_1 = false, // 使能故障
CommunicationSystemFault_2 = false,
CommunicationSystemFault_3 = false,
CommunicationSystemFault_1 = true, // 使能故障
CommunicationSystemFault_2 = true,
CommunicationSystemFault_3 = true,
PayloadSystemFault_1 = false, // 使能故障
PayloadSystemFault_2 = false,
PayloadSystemFault_3 = false,
PayloadSystemFault_4 = false,
PayloadSystemFault_5 = false,
PayloadSystemFault_6 = false,
PayloadSystemFault_7 = false,
PayloadSystemFault_1 = true, // 使能故障
PayloadSystemFault_2 = true,
PayloadSystemFault_3 = true,
PayloadSystemFault_4 = true,
PayloadSystemFault_5 = true,
PayloadSystemFault_6 = true,
PayloadSystemFault_7 = true,
EmergencySystemFault_1 = false, // 使能故障
EmergencySystemFault_2 = false,
EmergencySystemFault_3 = false,
EmergencySystemFault_4 = false,
EmergencySystemFault_5 = false,
EmergencySystemFault_6 = false,
EmergencySystemFault_1 = true, // 使能故障
EmergencySystemFault_2 = true,
EmergencySystemFault_3 = true,
EmergencySystemFault_4 = true,
EmergencySystemFault_5 = true,
EmergencySystemFault_6 = true,
SensorSystemFault_1 = false, // 使能故障
SensorSystemFault_2 = false,
SensorSystemFault_3 = false,
SensorSystemFault_1 = true, // 使能故障
SensorSystemFault_2 = true,
SensorSystemFault_3 = true,
};
}
+6 -6
View File
@@ -112,12 +112,12 @@ bool udpComm::getMsgFromBuff(char *m, msg_disHighAVolBusFbMsg &s)
s = *p;
return true;
}
bool udpComm::getMsgFromBuff(char *m, msg_disHighBVolBusFbMsg &s)
bool udpComm::getMsgFromBuff(char *m, msg_disLowMainBusFbMsg &s)
{
cChecksum sum;
msg_disHighBVolBusFbMsg *p;
p = reinterpret_cast<msg_disHighBVolBusFbMsg *>(m);
sum = calculateChecksum((unsigned char*)m, sizeof(msg_disHighBVolBusFbMsg), sizeof(cChecksum)) & 0xFF;
msg_disLowMainBusFbMsg *p;
p = reinterpret_cast<msg_disLowMainBusFbMsg *>(m);
sum = calculateChecksum((unsigned char*)m, sizeof(msg_disLowMainBusFbMsg), sizeof(cChecksum)) & 0xFF;
if (sum!= p->checkCode) {
sError.push_back("DisSys HVBBus Msg Check error");
return false;
@@ -252,7 +252,7 @@ bool udpComm::pushMsgToQueue(unsigned char *m)
}
case DIS_HVBUSB_FB_ID: //DIS_HVBUSB_FB 0x0007
{
msg_disHighBVolBusFbMsg s;
msg_disLowMainBusFbMsg s;
if(getMsgFromBuff((char *)Buff,s))
{
if(m_qReceiveDisHighBVolBusBuffer.size()<QUENUE_SIZE)
@@ -359,7 +359,7 @@ bool udpComm::popMsgFormQueue(double &time,msg_disHighAVolBusFbMsg &m)
m_qReceiveDisHighAVolBusBuffer.pop();
return true;
}
bool udpComm::popMsgFormQueue(double &time,msg_disHighBVolBusFbMsg &m)
bool udpComm::popMsgFormQueue(double &time,msg_disLowMainBusFbMsg &m)
{
if(m_qReceiveDisHighBVolBusBuffer.empty())
return false;
+3 -3
View File
@@ -32,14 +32,14 @@ public:
bool getMsgFromBuff(char *m, msg_CcuSetParmFbMsg &s);
bool getMsgFromBuff(char *m, msg_disHighVolBusFbMsg &s);
bool getMsgFromBuff(char *m, msg_disHighAVolBusFbMsg &s);
bool getMsgFromBuff(char *m, msg_disHighBVolBusFbMsg &s);
bool getMsgFromBuff(char *m, msg_disLowMainBusFbMsg &s);
bool getMsgFromBuff(char *m, msg_disLowBusFbMsg &s);
bool popMsgFormQueue(double &time,msg_CcuStateFbMsg &m);
bool popMsgFormQueue(double &time,msg_CcuSetParmFbMsg &m);
bool popMsgFormQueue(double &time,msg_disHighVolBusFbMsg &m);
bool popMsgFormQueue(double &time,msg_disHighAVolBusFbMsg &m);
bool popMsgFormQueue(double &time,msg_disHighBVolBusFbMsg &m);
bool popMsgFormQueue(double &time,msg_disLowMainBusFbMsg &m);
bool popMsgFormQueue(double &time,msg_disLowBusFbMsg &m);
bool sendCcuColCmd(const ccuColCmd cmd);
@@ -68,7 +68,7 @@ public:
std::queue<std::pair<double,msg_CcuSetParmFbMsg>> m_qReceiveCcuSetParmBuffer;
std::queue<std::pair<double,msg_disHighVolBusFbMsg>> m_qReceiveDisHighVolBusBuffer;
std::queue<std::pair<double,msg_disHighAVolBusFbMsg>> m_qReceiveDisHighAVolBusBuffer;
std::queue<std::pair<double,msg_disHighBVolBusFbMsg>> m_qReceiveDisHighBVolBusBuffer;
std::queue<std::pair<double,msg_disLowMainBusFbMsg>> m_qReceiveDisHighBVolBusBuffer;
std::queue<std::pair<double,msg_disLowBusFbMsg>> m_qReceiveDisLowBusBuffer;
private:
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]
-25
View File
@@ -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