增加了新的调试界面,优化了一些功能
This commit is contained in:
Vendored
+5
-1
@@ -56,5 +56,9 @@
|
||||
"queue": "cpp"
|
||||
},
|
||||
"C_Cpp.errorSquiggles": "disabled",
|
||||
"marscode.chatLanguage": "cn"
|
||||
"marscode.chatLanguage": "cn",
|
||||
"marscode.codeCompletionPro": {
|
||||
"enableCodeCompletionPro": true
|
||||
},
|
||||
"marscode.enableInlineCommand": true
|
||||
}
|
||||
@@ -1,8 +1,8 @@
|
||||
{
|
||||
"HVolABusBreaker_unit16": 63,
|
||||
"HVolBBusBreaker_unit16": 113,
|
||||
"HVolBusBreaker_uint16": 4090,
|
||||
"LVolBusBreaker_uint16": 113,
|
||||
"HVolABusBreaker_unit16": 0,
|
||||
"HVolBBusBreaker_unit16": 127,
|
||||
"HVolBusBreaker_uint16": 0,
|
||||
"LVolBusBreaker_uint16": 127,
|
||||
"faultCode_array":
|
||||
[
|
||||
0
|
||||
|
||||
@@ -1,30 +1,30 @@
|
||||
{
|
||||
"backpressure1_fp32": -1.6155215737897056e+25,
|
||||
"backpressure2_fp32": 1.9618178500547439e-44,
|
||||
"ch4oConcent1_fp32": 1687.0,
|
||||
"ch4oConcent2_fp32": 1.1726195870227251e-38,
|
||||
"ch4o_fp32": 1.1753983618774813e-38,
|
||||
"excTemp_fp32": 1.1726195870227251e-38,
|
||||
"faultCode1_uint16": 38848,
|
||||
"faultCode2_uint16": 21499,
|
||||
"backpressure1_fp32": 0.0,
|
||||
"backpressure2_fp32": 9.0,
|
||||
"ch4oConcent1_fp32": 72.0,
|
||||
"ch4oConcent2_fp32": 3.0,
|
||||
"ch4o_fp32": 0.0,
|
||||
"excTemp_fp32": 46.0,
|
||||
"faultCode1_uint16": 0,
|
||||
"faultCode2_uint16": 0,
|
||||
"faultCode3_uint16": 0,
|
||||
"fcuCurIns_fp32": 2.1062722967662487e+22,
|
||||
"fcuCurPower_fp32": 7.9041248815135621e-39,
|
||||
"fcuCur_fp32": 1.7755460477889746e-38,
|
||||
"fcuFaultLeve_uint8": 226,
|
||||
"fcuOutIns_fp32": 0.0,
|
||||
"fcuOutPower_fp32": 2.152394441202919e-42,
|
||||
"fcuState_uint8": 124,
|
||||
"fcuCurIns_fp32": 0.0,
|
||||
"fcuCurPower_fp32": 0.0,
|
||||
"fcuCur_fp32": 61.0,
|
||||
"fcuFaultLeve_uint8": 0,
|
||||
"fcuOutIns_fp32": 94.0,
|
||||
"fcuOutPower_fp32": 536.0,
|
||||
"fcuState_uint8": 0,
|
||||
"fcuVolIns_fp32": 0.0,
|
||||
"fcuVolPower_fp32": 1.1725886183266636e-38,
|
||||
"fcuVol_fp32": 1.1753983618774813e-38,
|
||||
"flameDet_uint8": 0,
|
||||
"h2Concent1_fp32": 1715.25,
|
||||
"h2Concent2_fp32": 1.1726195870227251e-38,
|
||||
"o2Concent1_fp32": 19.4140625,
|
||||
"o2Concent2_fp32": 1.1726195870227251e-38,
|
||||
"o2Level_fp32": 1.1725886183266636e-38,
|
||||
"o2_fp32": -1.5729414295823943e+36,
|
||||
"powLimit_fp32": 1.1726194468928787e-38,
|
||||
"powerGen_fp32": -1.5732659481360528e+36
|
||||
"fcuVolPower_fp32": 0.0,
|
||||
"fcuVol_fp32": 319.0,
|
||||
"flameDet_uint8": 1,
|
||||
"h2Concent1_fp32": 30.0,
|
||||
"h2Concent2_fp32": 10.0,
|
||||
"o2Concent1_fp32": 53.0,
|
||||
"o2Concent2_fp32": 0.0,
|
||||
"o2Level_fp32": 0.0,
|
||||
"o2_fp32": 0.0,
|
||||
"powLimit_fp32": 60.0,
|
||||
"powerGen_fp32": 155.0
|
||||
}
|
||||
@@ -1,38 +1,38 @@
|
||||
{
|
||||
"fcuCurToInsLimit1_uint8": 127,
|
||||
"fcuCurToInsLimit1_uint8": 0,
|
||||
"fcuCurToinsLimit2_uint8": 0,
|
||||
"insBatCurElect_uint16": 0,
|
||||
"insBatLimit_uint16": 0,
|
||||
"insBatSoc_uint8": 0,
|
||||
"insBatTotalElect_uint16": 2,
|
||||
"insChargeState_uint8": 71,
|
||||
"insCurSocHold1_uint8": 65,
|
||||
"insCurSocHold2_uint8": 221,
|
||||
"insCurSocHold3_uint8": 175,
|
||||
"insCurrent_uint16": 0,
|
||||
"insLinkVol_uint16": 56547,
|
||||
"insNegRelayState_uint8": 0,
|
||||
"insNegRes_uint16": 56641,
|
||||
"insPackVol_uint16": 32687,
|
||||
"insBatLimit_uint16": 95,
|
||||
"insBatSoc_uint8": 11,
|
||||
"insBatTotalElect_uint16": 631,
|
||||
"insChargeState_uint8": 0,
|
||||
"insCurSocHold1_uint8": 0,
|
||||
"insCurSocHold2_uint8": 0,
|
||||
"insCurSocHold3_uint8": 0,
|
||||
"insCurrent_uint16": 89,
|
||||
"insLinkVol_uint16": 0,
|
||||
"insNegRelayState_uint8": 1,
|
||||
"insNegRes_uint16": 0,
|
||||
"insPackVol_uint16": 0,
|
||||
"insPosRelayState_uint8": 0,
|
||||
"insPosRes_uint16": 38968,
|
||||
"insfaultCode_uint8": 176,
|
||||
"insPosRes_uint16": 0,
|
||||
"insfaultCode_uint8": 0,
|
||||
"powBatCurElect_uint16": 0,
|
||||
"powBatSoc_uint8": 0,
|
||||
"powBatTotalElect_uint16": 0,
|
||||
"powChargeState_uint8": 241,
|
||||
"powBatSoc_uint8": 86,
|
||||
"powBatTotalElect_uint16": 826,
|
||||
"powChargeState_uint8": 0,
|
||||
"powCurSocHold1_uint8": 0,
|
||||
"powCurSocHold2_uint8": 228,
|
||||
"powCurSocHold3_uint8": 85,
|
||||
"powCurToInsLimit1_uint8": 48,
|
||||
"powCurSocHold2_uint8": 0,
|
||||
"powCurSocHold3_uint8": 0,
|
||||
"powCurToInsLimit1_uint8": 0,
|
||||
"powCurToinsLimit2_uint8": 0,
|
||||
"powCur_uint16": 15376,
|
||||
"powLinkVol_uint16": 32687,
|
||||
"powCur_uint16": 41,
|
||||
"powLinkVol_uint16": 0,
|
||||
"powNegRelayState_uint8": 0,
|
||||
"powNegRes_uint16": 32687,
|
||||
"powNegRes_uint16": 0,
|
||||
"powPosRelayState_uint8": 0,
|
||||
"powPosRes_uint16": 56623,
|
||||
"powerBatLimit_uint16": 0,
|
||||
"powPosRes_uint16": 0,
|
||||
"powerBatLimit_uint16": 71,
|
||||
"powerPackVol_uint16": 0,
|
||||
"powfaultCode_uint8": 148
|
||||
"powfaultCode_uint8": 0
|
||||
}
|
||||
@@ -32,6 +32,7 @@ PowerManger::PowerManger()
|
||||
soc = 0;
|
||||
sustainableTime = 0;
|
||||
m_connected = false;
|
||||
m_faultNum = 0;
|
||||
faultCode.push_back(0);
|
||||
|
||||
//注册状态机
|
||||
@@ -783,15 +784,8 @@ bool PowerManger::saveStringToJsonFile(const string &strJson, const string &file
|
||||
//TODO:配电系统操作函数
|
||||
bool PowerManger::disSystemOperation(disBreaker optBreaker, disBreakerOpt)
|
||||
{
|
||||
// switch (disBreaker)
|
||||
// {
|
||||
// case bus1_fuelCellCircuitBreaker :
|
||||
// // send()
|
||||
// break;
|
||||
|
||||
// default:
|
||||
// break;
|
||||
// }
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
int PowerManger::handleInite_s1(FSM_State &fsm, void* pData)
|
||||
@@ -814,9 +808,10 @@ int PowerManger::handleInite_s1(FSM_State &fsm, void* pData)
|
||||
if(dft > 10)
|
||||
{
|
||||
pm->m_pmState = pm->m_Fault_s99;
|
||||
pm->m_faultNum = 1; // 通信超时
|
||||
break;
|
||||
}
|
||||
string desp = "等待复合管控消息 : 超时 : " + to_string(10-dft);
|
||||
string desp = "等待复合管控消息 : " + to_string(10-dft);
|
||||
pm->printState(fsm,desp);
|
||||
usleep(1000000);
|
||||
}
|
||||
@@ -837,12 +832,49 @@ int PowerManger::handleInite_s1(FSM_State &fsm, void* pData)
|
||||
pm->m_pmState = pm->m_Fault_s99;
|
||||
}
|
||||
//3. 检查当前配电装置状态
|
||||
// 首先闭合应急电源开关
|
||||
//a. 断开高压母线的主要断路器
|
||||
//TODO 检查并配置当前配电装置状态
|
||||
disHighVolBusCmd a;
|
||||
a.fuelCellCircuitBreaker = DIS_BREAKER_OFF;
|
||||
a.propulsionMotorCircuitBreaker = DIS_BREAKER_OFF;
|
||||
a.bowHighVoltageDistributionBoxCircuitBreaker = DIS_BREAKER_OFF;
|
||||
a.tyzReservedCircuitBreaker = DIS_BREAKER_OFF;
|
||||
a.sternFTDevice45CircuitBreaker = DIS_BREAKER_OFF;
|
||||
a.sternRudderSwitch1CircuitBreaker = DIS_BREAKER_OFF;
|
||||
a.sternRudderSwitch2CircuitBreaker = DIS_BREAKER_OFF;
|
||||
a.reservedCircuitBreaker = DIS_BREAKER_OFF;
|
||||
a.fbReservedCircuitBreaker = DIS_BREAKER_OFF;
|
||||
pm->m_udpComm.sendDisSysCmd(a);
|
||||
//b. 断开艏部高压设备的主要断路器
|
||||
disHighAVolBusCmd b;
|
||||
b.bowFTDevice123CircuitBreaker = DIS_BREAKER_OFF;
|
||||
b.actuatorCircuitBreaker = DIS_BREAKER_OFF;
|
||||
b.mastSteeringGearControlBoxCircuitBreaker = DIS_BREAKER_OFF;
|
||||
b.xczCircuitBreaker = DIS_BREAKER_OFF;
|
||||
b.bowRudderControlBoxCircuitBreaker = DIS_BREAKER_OFF;
|
||||
b.openWaterCoverStartCylinderCircuitBreaker = DIS_BREAKER_OFF;
|
||||
pm->m_udpComm.sendDisSysCmd(b);
|
||||
//c. 闭合低压母线的断路器
|
||||
disHighBVolBusCmd c;
|
||||
c.lithiumBatteryGroupInstrumentCircuitBreaker = DIS_BREAKER_ON;
|
||||
c.bowLowVoltageDistributionBoxCircuitBreaker = DIS_BREAKER_ON;
|
||||
c.unit4InstrumentDC48VCircuitBreaker = DIS_BREAKER_ON;
|
||||
c.dcC1DCDistributionPanelCircuitBreaker = DIS_BREAKER_ON;
|
||||
c.reservedCircuitBreaker1 = DIS_BREAKER_ON;
|
||||
c.reservedCircuitBreaker2 = DIS_BREAKER_ON;
|
||||
c.emergencyLithiumBatteryGroup2CircuitBreaker = DIS_BREAKER_ON;
|
||||
pm->m_udpComm.sendDisSysCmd(c);
|
||||
//d. 闭合低压汇流排断路器
|
||||
disLowBusCmd d;
|
||||
d.unit1CircuitBreaker = DIS_BREAKER_ON;
|
||||
d.unit2CircuitBreaker = DIS_BREAKER_ON;
|
||||
d.unit3CircuitBreaker = DIS_BREAKER_ON;
|
||||
d.unit5CircuitBreaker = DIS_BREAKER_ON;
|
||||
d.bowPZDeviceCircuitBreaker = DIS_BREAKER_ON;
|
||||
d.reservedCircuitBreaker1 = DIS_BREAKER_ON;
|
||||
d.reservedCircuitBreaker2 = DIS_BREAKER_ON;
|
||||
d.emergencyLithiumBatteryGroup1CircuitBreaker = DIS_BREAKER_ON;
|
||||
pm->m_udpComm.sendDisSysCmd(d);
|
||||
MOOSPause(1000);
|
||||
// pm->workCondition = "";
|
||||
return 0;
|
||||
@@ -852,6 +884,15 @@ int PowerManger::handleFault_s99(FSM_State &fsm, void* pData)
|
||||
{
|
||||
// cout << fsm.name << endl;
|
||||
PowerManger* pm = (PowerManger*)pData;
|
||||
switch (pm->m_faultNum)
|
||||
{
|
||||
case 1:
|
||||
pm->printState(fsm,"通信故障");
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
pm->printState(fsm,"故障");
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -102,6 +102,7 @@ class PowerManger : public AppCastingMOOSApp
|
||||
unsigned int m_nReceiveBufferSizeKB;
|
||||
unsigned int m_nSendBufferSizeKB;
|
||||
double m_current_time;
|
||||
unsigned int m_faultNum;
|
||||
|
||||
// CMOOSThread m_SendThread;
|
||||
private: //
|
||||
@@ -113,6 +114,11 @@ class PowerManger : public AppCastingMOOSApp
|
||||
void printState(FSM_State st, string desp){
|
||||
cout << MOOS::ConsoleColours::Yellow() << "STATE " << st.id << " [" << st.name << "] " << MOOS::ConsoleColours::reset();
|
||||
cout << MOOS::ConsoleColours::Blue() << " -> " << MOOS::ConsoleColours::reset();
|
||||
// 检查desp是否有“故障”
|
||||
if (desp.find("故障") != string::npos) {
|
||||
cout << MOOS::ConsoleColours::Red() << desp << MOOS::ConsoleColours::reset() << endl;
|
||||
return;
|
||||
}
|
||||
cout << MOOS::ConsoleColours::Green() << desp << MOOS::ConsoleColours::reset() << endl;
|
||||
}
|
||||
|
||||
|
||||
@@ -211,6 +211,9 @@ typedef struct disHighVolBusCmd
|
||||
unsigned char fbReservedCircuitBreaker;
|
||||
unsigned char tyzReservedCircuitBreaker;
|
||||
unsigned char reservedCircuitBreaker;
|
||||
unsigned char dcdc5Module;
|
||||
unsigned char inputWater;
|
||||
unsigned char outputWater;
|
||||
}disHighVolBusCmd;
|
||||
|
||||
typedef struct disHighAVolBusCmd
|
||||
|
||||
@@ -395,12 +395,12 @@ bool udpComm::sendDisSysCmd(const disHighVolBusCmd cmd)
|
||||
return true;
|
||||
}
|
||||
|
||||
bool udpComm::snedDisSysCmd(const disHighAVolBusCmd cmd)
|
||||
bool udpComm::sendDisSysCmd(const disHighAVolBusCmd cmd)
|
||||
{
|
||||
unsigned char* msgBuf;
|
||||
Checksum cc;
|
||||
msg_disHVBACmd* msg = new msg_disHVBACmd;
|
||||
msg->header.id = DIS_HVBUS_CMD_ID;
|
||||
msg->header.id = DIS_HVBUSA_CMD_ID;
|
||||
msg->header.start1 = DIS_MSG_HEAD1;
|
||||
msg->header.start2 = DIS_MSG_HEAD2;
|
||||
msg->header.length = sizeof(disHighAVolBusCmd);
|
||||
@@ -420,12 +420,12 @@ bool udpComm::snedDisSysCmd(const disHighAVolBusCmd cmd)
|
||||
return true;
|
||||
}
|
||||
|
||||
bool udpComm::snedDisSysCmd(const disHighBVolBusCmd cmd)
|
||||
bool udpComm::sendDisSysCmd(const disHighBVolBusCmd cmd)
|
||||
{
|
||||
unsigned char* msgBuf;
|
||||
Checksum cc;
|
||||
msg_disHVBBCmd* msg = new msg_disHVBBCmd;
|
||||
msg->header.id = DIS_HVBUS_CMD_ID;
|
||||
msg->header.id = DIS_HVBUSB_CMD_ID;
|
||||
msg->header.start1 = DIS_MSG_HEAD1;
|
||||
msg->header.start2 = DIS_MSG_HEAD2;
|
||||
msg->header.length = sizeof(disHighBVolBusCmd);
|
||||
@@ -435,6 +435,7 @@ bool udpComm::snedDisSysCmd(const disHighBVolBusCmd cmd)
|
||||
msg->checkCode = static_cast<cChecksum>(cc & 0xFF);
|
||||
try
|
||||
{
|
||||
// cout << "=========" <<(int)sizeof(msg_disHVBBCmd) << endl;
|
||||
sendMsg(msgBuf,sizeof(msg_disHVBBCmd));
|
||||
}
|
||||
catch(const std::exception& e)
|
||||
@@ -450,7 +451,7 @@ bool udpComm::sendDisSysCmd(const disLowBusCmd cmd)
|
||||
unsigned char* msgBuf;
|
||||
Checksum cc;
|
||||
msg_disLVBCmd* msg = new msg_disLVBCmd;
|
||||
msg->header.id = DIS_HVBUS_CMD_ID;
|
||||
msg->header.id = DIS_LVBUS_CMD_ID;
|
||||
msg->header.start1 = DIS_MSG_HEAD1;
|
||||
msg->header.start2 = DIS_MSG_HEAD2;
|
||||
msg->header.length = sizeof(disLowBusCmd);
|
||||
|
||||
@@ -46,12 +46,14 @@ public:
|
||||
|
||||
bool sendCcuColCmd(const msg_CcuColCmdMsg m);
|
||||
bool sendCcuSetParmCmd(const msg_CcuSetParmMsg m);
|
||||
|
||||
bool sendDisSysCmd(const disHighVolBusCmd cmd);
|
||||
bool snedDisSysCmd(const disHighAVolBusCmd cmd);
|
||||
bool snedDisSysCmd(const disHighBVolBusCmd cmd);
|
||||
bool sendDisSysCmd(const disHighAVolBusCmd cmd);
|
||||
bool sendDisSysCmd(const disHighBVolBusCmd cmd);
|
||||
bool sendDisSysCmd(const disLowBusCmd cmd);
|
||||
bool sendMsg(const unsigned char* msg,unsigned int size){
|
||||
udpScoket->iSendMessageTo((void*) msg, size, ccuPort, ccuHost);
|
||||
return true;
|
||||
}
|
||||
|
||||
bool getMsgId(char *m,unsigned short &id);
|
||||
|
||||
+10
-4
@@ -7,6 +7,7 @@ from datetime import datetime
|
||||
from disSys import *
|
||||
from logWin import *
|
||||
from udpComm import *
|
||||
from ccuSys import *
|
||||
|
||||
|
||||
# 创建UDP通信套接字
|
||||
@@ -21,8 +22,8 @@ sock.bind(server_address)
|
||||
root = tk.Tk()
|
||||
root.title("能源管理系统调试")
|
||||
# 创建消息显示窗口
|
||||
logFrame = tk.LabelFrame(root, text="消息显示")
|
||||
logFrame.grid(row=1, columnspan=3 ,column=0, sticky='nsw')
|
||||
logFrame = tk.LabelFrame(root, text="消息")
|
||||
logFrame.grid(row=0, rowspan=3,column=1, sticky='ns')
|
||||
logwin = logWin(logFrame)
|
||||
logwin.grid(row=0, column=0, sticky='nesw')
|
||||
# 创建配电窗口
|
||||
@@ -30,16 +31,21 @@ disSysFrame = tk.LabelFrame(root, text="配电系统")
|
||||
disSysFrame.grid(row=0, column=0, sticky='ne')
|
||||
disSysWin = disSys(disSysFrame)
|
||||
disSysWin.grid(row=0, column=0, sticky='ne')
|
||||
# 创建ccu消息窗口
|
||||
ccuSysFrame = tk.LabelFrame(root, text="ccu消息")
|
||||
ccuSysFrame.grid(row=1, column=0, sticky='swe')
|
||||
ccuSysWin = ccuSys(ccuSysFrame)
|
||||
# ccuSysWin.grid(row=0, column=0, sticky='ne')
|
||||
|
||||
# 创建并启动接收和发送消息的线程
|
||||
thread = threading.Thread(target=receive_messages, args=(sock, logwin, disSysWin))
|
||||
thread.daemon = True
|
||||
thread.start()
|
||||
thread2 = threading.Thread(target=send_messages, args=(sock, logwin, disSysWin))
|
||||
|
||||
thread2 = threading.Thread(target=send_messages, args=(sock, logwin, disSysWin,ccuSysWin))
|
||||
thread2.daemon = True
|
||||
thread2.start()
|
||||
|
||||
|
||||
# 运行主循环
|
||||
root.mainloop()
|
||||
# 关闭套接字
|
||||
|
||||
+319
-6
@@ -2,19 +2,332 @@ import socket
|
||||
import struct
|
||||
import tkinter as tk
|
||||
import threading
|
||||
import random
|
||||
from udpmsg import *
|
||||
from udpmsg import msg_CcuStateFbMsg
|
||||
from datetime import datetime
|
||||
from tkinter import font
|
||||
from guiEle import ElementDisplayApp
|
||||
from until import *
|
||||
from guiInput import InputGUI
|
||||
from tkinter import Frame
|
||||
|
||||
from tkinter.ttk import *
|
||||
|
||||
class ccuSys(Frame):
|
||||
def __init__(self,root):
|
||||
def __init__(self, root):
|
||||
super().__init__(root)
|
||||
# Initialize CCU state
|
||||
self.ccuState = msg_CcuStateFbMsg()
|
||||
self.col_frames = []
|
||||
self.state_entries = []
|
||||
|
||||
# Timer settings
|
||||
self.update_interval = 1000 # Default update interval in milliseconds
|
||||
|
||||
# Network settings
|
||||
self.udp_ip = "127.0.0.1"
|
||||
self.udp_port = 5005
|
||||
self.sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
|
||||
self.sock.settimeout(1.0)
|
||||
|
||||
# Initialize GUI
|
||||
self.master = root
|
||||
self.createWidgets()
|
||||
|
||||
# Start data update thread
|
||||
self.running = True
|
||||
self.update_thread = threading.Thread(target=self._update_thread)
|
||||
self.update_thread.daemon = True
|
||||
self.update_thread.start()
|
||||
|
||||
# Start timer for periodic display update
|
||||
self.update_timer = None
|
||||
self.start_update_timer()
|
||||
|
||||
def createWidgets(self):
|
||||
pass
|
||||
# Main window configuration
|
||||
# self.master.title("CCU Monitoring System")
|
||||
# self.master.geometry("1200x800")
|
||||
|
||||
# Create status display area
|
||||
self.status_frame = tk.Frame(self.master)
|
||||
self.status_frame.pack(fill=tk.BOTH, expand=True, padx=10, pady=10)
|
||||
|
||||
# Create status columns
|
||||
self._create_status_column("FCU Status", [
|
||||
"fcuState", "fcuFaultLeve", "powerLimit",
|
||||
"totalPowerGeneration", "fcuVoltage", "fcuCurrent",
|
||||
"fcuOutPower", "fcuOutIns"
|
||||
])
|
||||
|
||||
self._create_status_column("Battery Status", [
|
||||
"insBatSoc", "powerBatSoc", "insBatLimit",
|
||||
"powerBatLimit", "insBatTotalElectricity",
|
||||
"powerBatTotalElectricity", "insCurrent",
|
||||
"powerCurrent"
|
||||
])
|
||||
|
||||
self._create_status_column("Sensor Status", [
|
||||
"h2Concentration1", "h2Concentration2",
|
||||
"o2Concentration1", "o2Concentration2",
|
||||
"ch4oConcentration1", "ch4oConcentration2",
|
||||
"backpressure1", "backpressure2"
|
||||
])
|
||||
|
||||
self._create_status_column("System Status", [
|
||||
"insPosRelayState", "insNegRelayState",
|
||||
"powerPosRelayState", "powerNegRelayState",
|
||||
"flameDetection", "exchangerTemperature",
|
||||
"insEmergencyStatusWord", "powerEmergencyStatusWord"
|
||||
])
|
||||
|
||||
# Create control panel
|
||||
self.control_frame = tk.Frame(self.master)
|
||||
self.control_frame.pack(fill=tk.X, padx=10, pady=5)
|
||||
|
||||
# Add control buttons
|
||||
self.refresh_btn = tk.Button(
|
||||
self.control_frame, text="Refresh", command=self.update_display
|
||||
)
|
||||
self.refresh_btn.pack(side=tk.LEFT, padx=5)
|
||||
|
||||
self.export_btn = tk.Button(
|
||||
self.control_frame, text="Export Data", command=self.export_data
|
||||
)
|
||||
self.export_btn.pack(side=tk.LEFT, padx=5)
|
||||
|
||||
# Timer control
|
||||
self.timer_frame = tk.Frame(self.control_frame)
|
||||
self.timer_frame.pack(side=tk.RIGHT, padx=10)
|
||||
|
||||
# Timer interval label
|
||||
tk.Label(self.timer_frame, text="Update Interval (ms):").pack(side=tk.LEFT)
|
||||
|
||||
# Timer interval entry
|
||||
self.interval_entry = tk.Entry(self.timer_frame, width=6)
|
||||
self.interval_entry.insert(0, str(self.update_interval))
|
||||
self.interval_entry.pack(side=tk.LEFT, padx=5)
|
||||
|
||||
# Set interval button
|
||||
self.set_interval_btn = tk.Button(
|
||||
self.timer_frame,
|
||||
text="Set",
|
||||
command=self.set_update_interval
|
||||
)
|
||||
self.set_interval_btn.pack(side=tk.LEFT)
|
||||
|
||||
# Status indicator
|
||||
self.status_indicator = tk.Label(
|
||||
self.timer_frame, text="●", fg="green", font=("Arial", 16)
|
||||
)
|
||||
self.status_indicator.pack(side=tk.RIGHT, padx=10)
|
||||
|
||||
# FCU control panel
|
||||
self.fcu_frame = tk.Frame(self.control_frame)
|
||||
self.fcu_frame.pack(side=tk.LEFT, padx=10)
|
||||
|
||||
# FCU state control
|
||||
tk.Label(self.fcu_frame, text="FCU State:").pack(side=tk.LEFT)
|
||||
self.fcu_state_var = tk.IntVar(value=0)
|
||||
self.fcu_state_menu = tk.OptionMenu(
|
||||
self.fcu_frame, self.fcu_state_var,
|
||||
*range(4), command=self.set_fcu_state
|
||||
)
|
||||
self.fcu_state_menu.pack(side=tk.LEFT, padx=5)
|
||||
|
||||
# FCU fault level control
|
||||
tk.Label(self.fcu_frame, text="Fault Level:").pack(side=tk.LEFT)
|
||||
self.fcu_fault_var = tk.IntVar(value=0)
|
||||
self.fcu_fault_menu = tk.OptionMenu(
|
||||
self.fcu_frame, self.fcu_fault_var,
|
||||
*range(4), command=self.set_fcu_fault_level
|
||||
)
|
||||
self.fcu_fault_menu.pack(side=tk.LEFT, padx=5)
|
||||
|
||||
def _create_status_column(self, title, fields):
|
||||
"""Create a status column with specified fields"""
|
||||
col_frame = tk.LabelFrame(
|
||||
self.status_frame, text=title, bd=2, relief=tk.GROOVE
|
||||
)
|
||||
col_frame.pack(side=tk.LEFT, fill=tk.BOTH, expand=True, padx=5, pady=5)
|
||||
|
||||
for field in fields:
|
||||
field_frame = tk.Frame(col_frame)
|
||||
field_frame.pack(fill=tk.X, padx=5, pady=2)
|
||||
|
||||
# Field name
|
||||
name_label = tk.Label(
|
||||
field_frame, text=field, width=20, anchor=tk.W
|
||||
)
|
||||
name_label.pack(side=tk.LEFT)
|
||||
|
||||
# Value display
|
||||
value_entry = tk.Entry(
|
||||
field_frame, width=15, state='readonly'
|
||||
)
|
||||
value_entry.pack(side=tk.RIGHT, fill=tk.X, expand=True)
|
||||
|
||||
# Store reference for updates
|
||||
self.state_entries.append((field, value_entry))
|
||||
|
||||
def generate_simulated_data(self):
|
||||
"""Generate simulated CCU state data"""
|
||||
self.ccuState.fcuState = self.fcu_state_var.get()
|
||||
self.ccuState.fcuFaultLeve = self.fcu_fault_var.get()
|
||||
self.ccuState.powerLimit = random.randint(0, 100)
|
||||
self.ccuState.totalPowerGeneration = int(random.uniform(0, 1000))
|
||||
self.ccuState.fcuVoltage = int(random.uniform(200, 400))
|
||||
self.ccuState.fcuCurrent = int(random.uniform(0, 100))
|
||||
self.ccuState.fcuOutPower = random.randint(0, 1000)
|
||||
self.ccuState.fcuOutIns = random.randint(0, 100)
|
||||
|
||||
self.ccuState.insBatSoc = random.randint(0, 100)
|
||||
self.ccuState.powerBatSoc = random.randint(0, 100)
|
||||
self.ccuState.insBatLimit = random.randint(0, 100)
|
||||
self.ccuState.powerBatLimit = random.randint(0, 100)
|
||||
self.ccuState.insBatTotalElectricity = random.randint(0, 1000)
|
||||
self.ccuState.powerBatTotalElectricity = random.randint(0, 1000)
|
||||
self.ccuState.insCurrent = random.randint(0, 100)
|
||||
self.ccuState.powerCurrent = random.randint(0, 100)
|
||||
|
||||
self.ccuState.h2Concentration1 = random.randint(0, 100)
|
||||
self.ccuState.h2Concentration2 = random.randint(0, 100)
|
||||
self.ccuState.o2Concentration1 = random.randint(0, 100)
|
||||
self.ccuState.o2Concentration2 = random.randint(0, 100)
|
||||
self.ccuState.ch4oConcentration1 = random.randint(0, 100)
|
||||
self.ccuState.ch4oConcentration2 = random.randint(0, 100)
|
||||
self.ccuState.backpressure1 = random.randint(0, 10)
|
||||
self.ccuState.backpressure2 = random.randint(0, 10)
|
||||
|
||||
self.ccuState.insPosRelayState = random.randint(0, 1)
|
||||
self.ccuState.insNegRelayState = random.randint(0, 1)
|
||||
self.ccuState.powerPosRelayState = random.randint(0, 1)
|
||||
self.ccuState.powerNegRelayState = random.randint(0, 1)
|
||||
self.ccuState.flameDetection = random.randint(0, 1)
|
||||
self.ccuState.exchangerTemperature = random.randint(20, 100)
|
||||
self.ccuState.insEmergencyStatusWord = random.randint(0, 255)
|
||||
self.ccuState.powerEmergencyStatusWord = random.randint(0, 255)
|
||||
|
||||
def update_display(self):
|
||||
"""Update all displayed values"""
|
||||
# Generate simulated data if no real data available
|
||||
if not hasattr(self.ccuState, 'fcuState'):
|
||||
self.generate_simulated_data()
|
||||
|
||||
for field, entry in self.state_entries:
|
||||
value = getattr(self.ccuState, field, "N/A")
|
||||
entry.config(state='normal')
|
||||
entry.delete(0, tk.END)
|
||||
entry.insert(0, str(value))
|
||||
entry.config(state='readonly')
|
||||
|
||||
# Update status indicator
|
||||
self._update_status_indicator()
|
||||
|
||||
def _update_status_indicator(self):
|
||||
"""Update the status indicator based on system state"""
|
||||
if self.ccuState.fcuFaultLeve > 0:
|
||||
self.status_indicator.config(fg="red")
|
||||
else:
|
||||
self.status_indicator.config(fg="green")
|
||||
|
||||
def export_data(self):
|
||||
"""Export current status data to file"""
|
||||
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
|
||||
filename = f"ccu_status_{timestamp}.log"
|
||||
try:
|
||||
with open(filename, 'w') as f:
|
||||
for field, _ in self.state_entries:
|
||||
value = getattr(self.ccuState, field, "N/A")
|
||||
f.write(f"{field}: {value}\n")
|
||||
print(f"Data exported to {filename}")
|
||||
except Exception as e:
|
||||
print(f"Export failed: {str(e)}")
|
||||
|
||||
def _update_thread(self):
|
||||
"""Thread for updating CCU state"""
|
||||
while self.running:
|
||||
try:
|
||||
# Receive data from UDP
|
||||
data, _ = self.sock.recvfrom(1024)
|
||||
self.ccuState.unpack(data)
|
||||
|
||||
except socket.timeout:
|
||||
continue
|
||||
except Exception as e:
|
||||
print(f"Update error: {str(e)}")
|
||||
break
|
||||
|
||||
def set_update_interval(self):
|
||||
"""Set new update interval from GUI input"""
|
||||
try:
|
||||
new_interval = int(self.interval_entry.get())
|
||||
if new_interval < 100:
|
||||
raise ValueError("Interval must be >= 100ms")
|
||||
self.update_interval = new_interval
|
||||
self.stop_update_timer()
|
||||
self.start_update_timer()
|
||||
except ValueError as e:
|
||||
print(f"Invalid interval: {str(e)}")
|
||||
|
||||
def set_fcu_state(self, state):
|
||||
"""Set FCU state and update display"""
|
||||
self.ccuState.fcuState = state
|
||||
self.update_display()
|
||||
|
||||
def set_fcu_fault_level(self, level):
|
||||
"""Set FCU fault level and update display"""
|
||||
self.ccuState.fcuFaultLeve = level
|
||||
self.update_display()
|
||||
|
||||
def start_update_timer(self):
|
||||
"""Start the periodic display update timer"""
|
||||
if not hasattr(self, 'data_update_thread'):
|
||||
self.data_update_running = True
|
||||
self.data_update_thread = threading.Thread(
|
||||
target=self._data_update_loop
|
||||
)
|
||||
self.data_update_thread.daemon = True
|
||||
self.data_update_thread.start()
|
||||
|
||||
self._update_display_loop()
|
||||
|
||||
def _update_display_loop(self):
|
||||
"""Periodically update the display"""
|
||||
self.generate_simulated_data()
|
||||
self.update_display()
|
||||
self.update_timer = self.master.after(
|
||||
self.update_interval,
|
||||
self._update_display_loop
|
||||
)
|
||||
|
||||
def _data_update_loop(self):
|
||||
"""Periodically update data from network"""
|
||||
while self.data_update_running:
|
||||
try:
|
||||
# Receive data from UDP
|
||||
data, _ = self.sock.recvfrom(1024)
|
||||
self.ccuState.unpack(data)
|
||||
time.sleep(self.update_interval / 1000)
|
||||
except socket.timeout:
|
||||
continue
|
||||
except Exception as e:
|
||||
print(f"Data update error: {str(e)}")
|
||||
break
|
||||
|
||||
def stop_update_timer(self):
|
||||
"""Stop the periodic display update timer"""
|
||||
if self.update_timer:
|
||||
self.master.after_cancel(self.update_timer)
|
||||
self.update_timer = None
|
||||
|
||||
def __del__(self):
|
||||
"""Clean up resources"""
|
||||
self.running = False
|
||||
self.stop_update_timer()
|
||||
if hasattr(self, 'update_thread'):
|
||||
self.update_thread.join()
|
||||
self.sock.close()
|
||||
|
||||
if __name__ == "__main__":
|
||||
root = tk.Tk()
|
||||
app = ccuSys(root)
|
||||
app.pack(fill=tk.BOTH, expand=True)
|
||||
root.mainloop()
|
||||
|
||||
@@ -547,6 +547,115 @@ class disSys(Frame):
|
||||
c = self.disHVBB.pack()
|
||||
d = self.disLVB.pack()
|
||||
return a,b,c,d
|
||||
|
||||
def update_fromMsg(self, data):
|
||||
'''通过这个可以更新数据'''
|
||||
try:
|
||||
# 解析消息头
|
||||
headBuf = data[:6]
|
||||
header = struct.unpack('<BBHH', headBuf)
|
||||
start1 = header[0]
|
||||
start2 = header[1]
|
||||
msg_id = header[2]
|
||||
msg_len = header[3]
|
||||
|
||||
if start1 == 0x40 and start2 == 0x40:
|
||||
if msg_id == 0x0001: # 高压母线配电指令
|
||||
msg = msg_disHVBCmd()
|
||||
msg.unpack(data)
|
||||
self.disHVB.DCB1 = msg.fuelCellCircuitBreaker
|
||||
self.disHVB.DCB2 = msg.powerLithiumBatteryCircuitBreaker
|
||||
self.disHVB.ZK1 = msg.propulsionMotorCircuitBreaker
|
||||
self.disHVB.ZK2 = msg.lithiumBatteryGroupInstrumentCircuitBreaker
|
||||
self.disHVB.ZK3 = msg.dcDc5ModuleCircuitBreaker
|
||||
self.disHVB.ZK4 = msg.bowHighVoltageDistributionBoxCircuitBreaker
|
||||
self.disHVB.ZK5 = msg.sternFTDevice45CircuitBreaker
|
||||
self.disHVB.ZK6 = msg.sternRudderSwitch1CircuitBreaker
|
||||
self.disHVB.ZK7 = msg.sternRudderSwitch2CircuitBreaker
|
||||
self.disHVB.ZK8 = msg.fbReservedCircuitBreaker
|
||||
self.disHVB.ZK9 = msg.tyzReservedCircuitBreaker
|
||||
self.disHVB.ZK10 = msg.reservedCircuitBreaker
|
||||
self.disHVB.inputWater = msg.inputWater
|
||||
self.disHVB.outputWater = msg.outputWater
|
||||
self.disHVB.dcdc5dcdc5Module = msg.dcdc5dcdc5Module
|
||||
|
||||
# 更新dict1
|
||||
self.dict1['燃料电池断路器'] = '闭合' if msg.fuelCellCircuitBreaker == 0x55 else '断开'
|
||||
self.dict1['动力锂电池断路器'] = '闭合' if msg.powerLithiumBatteryCircuitBreaker == 0x55 else '断开'
|
||||
self.dict1['推进电机断路器'] = '闭合' if msg.propulsionMotorCircuitBreaker == 0x55 else '断开'
|
||||
self.dict1['仪表锂电池断路器'] = '闭合' if msg.lithiumBatteryGroupInstrumentCircuitBreaker == 0x55 else '断开'
|
||||
self.dict1['DC/DC5模块断路器'] = '闭合' if msg.dcDc5ModuleCircuitBreaker == 0x55 else '断开'
|
||||
self.dict1['艏部高压配电断路器'] = '闭合' if msg.bowHighVoltageDistributionBoxCircuitBreaker == 0x55 else '断开'
|
||||
self.dict1['艏部FT4/5断路器'] = '闭合' if msg.sternFTDevice45CircuitBreaker == 0x55 else '断开'
|
||||
self.dict1['艉舵1/2断路器'] = '闭合' if msg.sternRudderSwitch1CircuitBreaker == 0x55 else '断开'
|
||||
self.dict1['艉舵3/4断路器'] = '闭合' if msg.sternRudderSwitch2CircuitBreaker == 0x55 else '断开'
|
||||
self.dict1['FB预留断路器'] = '闭合' if msg.fbReservedCircuitBreaker == 0x55 else '断开'
|
||||
self.dict1['TYZ预留断路器'] = '闭合' if msg.tyzReservedCircuitBreaker == 0x55 else '断开'
|
||||
self.dict1['预留断路器'] = '闭合' if msg.reservedCircuitBreaker == 0x55 else '断开'
|
||||
|
||||
elif msg_id == 0x0002: # 高电压A母线配电指令
|
||||
msg = msg_disHVBACmd()
|
||||
msg.unpack(data)
|
||||
self.disHVBA.bowFTDevice123CircuitBreaker = msg.bowFTDevice123CircuitBreaker
|
||||
self.disHVBA.actuatorCircuitBreaker = msg.actuatorCircuitBreaker
|
||||
self.disHVBA.mastSteeringGearControlBoxCircuitBreaker = msg.mastSteeringGearControlBoxCircuitBreaker
|
||||
self.disHVBA.xczCircuitBreaker = msg.xczCircuitBreaker
|
||||
self.disHVBA.bowRudderControlBoxCircuitBreaker = msg.bowRudderControlBoxCircuitBreaker
|
||||
self.disHVBA.openWaterCoverStartCylinderCircuitBreaker = msg.openWaterCoverStartCylinderCircuitBreaker
|
||||
|
||||
# 更新dict2
|
||||
self.dict2['艏部FT1-3断路器'] = '闭合' if msg.bowFTDevice123CircuitBreaker == 0x55 else '断开'
|
||||
self.dict2['启闭机构断路器'] = '闭合' if msg.actuatorCircuitBreaker == 0x55 else '断开'
|
||||
self.dict2['桅杆舵机断路器'] = '闭合' if msg.mastSteeringGearControlBoxCircuitBreaker == 0x55 else '断开'
|
||||
self.dict2['XCZ断路器'] = '闭合' if msg.xczCircuitBreaker == 0x55 else '断开'
|
||||
self.dict2['艏舵断路器'] = '闭合' if msg.bowRudderControlBoxCircuitBreaker == 0x55 else '断开'
|
||||
self.dict2['敞开电缸断路器'] = '闭合' if msg.openWaterCoverStartCylinderCircuitBreaker == 0x55 else '断开'
|
||||
|
||||
elif msg_id == 0x0003: # 高电压B母线配电指令
|
||||
msg = msg_disHVBBCmd()
|
||||
msg.unpack(data)
|
||||
self.disHVBB.lithiumBatteryGroupInstrumentCircuitBreaker = msg.lithiumBatteryGroupInstrumentCircuitBreaker
|
||||
self.disHVBB.bowLowVoltageDistributionBoxCircuitBreaker = msg.bowLowVoltageDistributionBoxCircuitBreaker
|
||||
self.disHVBB.unit4InstrumentDC48VCircuitBreaker = msg.unit4InstrumentDC48VCircuitBreaker
|
||||
self.disHVBB.dcC1DCDistributionPanelCircuitBreaker = msg.dcC1DCDistributionPanelCircuitBreaker
|
||||
self.disHVBB.reservedCircuitBreaker1 = msg.reservedCircuitBreaker1
|
||||
self.disHVBB.reservedCircuitBreaker2 = msg.reservedCircuitBreaker2
|
||||
self.disHVBB.emergencyLithiumBatteryGroup2CircuitBreaker = msg.emergencyLithiumBatteryGroup2CircuitBreaker
|
||||
|
||||
# 更新dict3
|
||||
self.dict3['仪表锂电池断路器'] = '闭合' if msg.lithiumBatteryGroupInstrumentCircuitBreaker == 0x55 else '断开'
|
||||
self.dict3['艏部低压断路器'] = '闭合' if msg.bowLowVoltageDistributionBoxCircuitBreaker == 0x55 else '断开'
|
||||
self.dict3['UNIT4断路器'] = '闭合' if msg.unit4InstrumentDC48VCircuitBreaker == 0x55 else '断开'
|
||||
self.dict3['DC/DC1断路器'] = '闭合' if msg.dcC1DCDistributionPanelCircuitBreaker == 0x55 else '断开'
|
||||
self.dict3['预留断路器1'] = '闭合' if msg.reservedCircuitBreaker1 == 0x55 else '断开'
|
||||
self.dict3['预留断路器2'] = '闭合' if msg.reservedCircuitBreaker2 == 0x55 else '断开'
|
||||
self.dict3['艉部应急电池开关'] = '闭合' if msg.emergencyLithiumBatteryGroup2CircuitBreaker == 0x55 else '断开'
|
||||
|
||||
elif msg_id == 0x0004: # 低电压母线配电指令
|
||||
msg = msg_disLVBCmd()
|
||||
msg.unpack(data)
|
||||
self.disLVB.unit1CircuitBreaker = msg.unit1CircuitBreaker
|
||||
self.disLVB.unit2CircuitBreaker = msg.unit2CircuitBreaker
|
||||
self.disLVB.unit3CircuitBreaker = msg.unit3CircuitBreaker
|
||||
self.disLVB.unit5CircuitBreaker = msg.unit5CircuitBreaker
|
||||
self.disLVB.bowPZDeviceCircuitBreaker = msg.bowPZDeviceCircuitBreaker
|
||||
self.disLVB.reservedCircuitBreaker1 = msg.reservedCircuitBreaker1
|
||||
self.disLVB.reservedCircuitBreaker2 = msg.reservedCircuitBreaker2
|
||||
self.disLVB.emergencyLithiumBatteryGroup1CircuitBreaker = msg.emergencyLithiumBatteryGroup1CircuitBreaker
|
||||
|
||||
# 更新dict4
|
||||
self.dict4['UNIT1断路器'] = '闭合' if msg.unit1CircuitBreaker == 0x55 else '断开'
|
||||
self.dict4['UNIT2断路器'] = '闭合' if msg.unit2CircuitBreaker == 0x55 else '断开'
|
||||
self.dict4['UNIT3断路器'] = '闭合' if msg.unit3CircuitBreaker == 0x55 else '断开'
|
||||
self.dict4['UNIT5断路器'] = '闭合' if msg.unit5CircuitBreaker == 0x55 else '断开'
|
||||
self.dict4['艏部抛载断路器'] = '闭合' if msg.bowPZDeviceCircuitBreaker == 0x55 else '断开'
|
||||
self.dict4['预留断路器1'] = '闭合' if msg.reservedCircuitBreaker1 == 0x55 else '断开'
|
||||
self.dict4['预留断路器2'] = '闭合' if msg.reservedCircuitBreaker2 == 0x55 else '断开'
|
||||
self.dict4['艏部应急电池开关'] = '闭合' if msg.emergencyLithiumBatteryGroup1CircuitBreaker == 0x55 else '断开'
|
||||
|
||||
self.update_disp() # 更新界面显示
|
||||
except Exception as e:
|
||||
print(f"Error updating from message: {e}")
|
||||
|
||||
if __name__ == "__main__":
|
||||
root = tk.Tk()
|
||||
|
||||
+13
-63
@@ -8,6 +8,7 @@ from tkinter import font
|
||||
import threading
|
||||
from disSys import *
|
||||
from logWin import *
|
||||
from ccuSys import *
|
||||
|
||||
target_ip = '127.0.0.1'
|
||||
target_port = 5000
|
||||
@@ -17,6 +18,7 @@ def receive_messages(sock, logwin:logWin, disSysWin:disSys):
|
||||
current_time = datetime.now()
|
||||
formatted_time = current_time.strftime("%Y-%m-%d %H:%M:%S")
|
||||
data, address = sock.recvfrom(4096)
|
||||
disSysWin.update_fromMsg(data)
|
||||
headBuf = data[:6]
|
||||
header = struct.unpack('<BBHH',headBuf)
|
||||
start1 = data[0]
|
||||
@@ -29,78 +31,26 @@ def receive_messages(sock, logwin:logWin, disSysWin:disSys):
|
||||
msg.unpack(data)
|
||||
# text_box.insert(tk.END, f"{formatted_time}->接收到来自 {address} | 高压母线配电指令:\n")
|
||||
logWin.display_log(logwin,f"{formatted_time}->接收到来自 {address} | 高压母线配电指令:")
|
||||
if(msg.fuelCellCircuitBreaker==0x55):
|
||||
disSysWin.dict1['燃料电池断路器']='闭合'
|
||||
elif(msg.fuelCellCircuitBreaker==0xAA):
|
||||
disSysWin.dict1['燃料电池断路器']='断开'
|
||||
|
||||
if(msg.powerLithiumBatteryCircuitBreaker==0x55):
|
||||
disSysWin.dict1['动力锂电池断路器']='闭合'
|
||||
elif(msg.powerLithiumBatteryCircuitBreaker==0xAA):
|
||||
disSysWin.dict1['动力锂电池断路器']='断开'
|
||||
|
||||
if(msg.propulsionMotorCircuitBreaker==0x55):
|
||||
disSysWin.dict1['推进电机断路器']='闭合'
|
||||
elif(msg.propulsionMotorCircuitBreaker==0xAA):
|
||||
disSysWin.dict1['推进电机断路器']='断开'
|
||||
|
||||
if(msg.lithiumBatteryGroupInstrumentCircuitBreaker==0x55):
|
||||
disSysWin.dict1['仪表锂电池断路器']='闭合'
|
||||
elif(msg.lithiumBatteryGroupInstrumentCircuitBreaker==0xAA):
|
||||
disSysWin.dict1['仪表锂电池断路器']='断开'
|
||||
|
||||
if(msg.dcDc5ModuleCircuitBreaker==0x55):
|
||||
disSysWin.dict1['DC/DC5模块断路器']='闭合'
|
||||
elif(msg.dcDc5ModuleCircuitBreaker==0xAA):
|
||||
disSysWin.dict1['DC/DC5模块断路器']='断开'
|
||||
|
||||
if(msg.bowHighVoltageDistributionBoxCircuitBreaker==0x55):
|
||||
disSysWin.dict1['艏部高压配电断路器']='闭合'
|
||||
elif(msg.bowHighVoltageDistributionBoxCircuitBreaker==0xAA):
|
||||
disSysWin.dict1['艏部高压配电断路器']='断开'
|
||||
|
||||
if(msg.sternFTDevice45CircuitBreaker==0x55):
|
||||
disSysWin.dict1['艏部FT4/5断路器']='闭合'
|
||||
elif(msg.sternFTDevice45CircuitBreaker==0xAA):
|
||||
disSysWin.dict1['艏部FT4/5断路器']='断开'
|
||||
|
||||
if(msg.sternRudderSwitch1CircuitBreaker==0x55):
|
||||
disSysWin.dict1['艉舵1/2断路器']='闭合'
|
||||
elif(msg.sternRudderSwitch1CircuitBreaker==0xAA):
|
||||
disSysWin.dict1['艉舵1/2断路器']='断开'
|
||||
|
||||
if(msg.sternRudderSwitch2CircuitBreaker==0x55):
|
||||
disSysWin.dict1['艉舵3/4断路器']='闭合'
|
||||
elif(msg.sternRudderSwitch2CircuitBreaker==0xAA):
|
||||
disSysWin.dict1['艉舵3/4断路器']='断开'
|
||||
|
||||
if(msg.fbReservedCircuitBreaker==0x55):
|
||||
disSysWin.dict1['FB预留断路器']='闭合'
|
||||
elif(msg.fbReservedCircuitBreaker==0xAA):
|
||||
disSysWin.dict1['FB预留断路器']='断开'
|
||||
|
||||
if(msg.tyzReservedCircuitBreaker==0x55):
|
||||
disSysWin.dict1['TYZ预留断路器']='闭合'
|
||||
elif(msg.tyzReservedCircuitBreaker==0xAA):
|
||||
disSysWin.dict1['TYZ预留断路器']='断开'
|
||||
|
||||
if(msg.reservedCircuitBreaker==0x55):
|
||||
disSysWin.dict1['预留断路器']='闭合'
|
||||
elif(msg.reservedCircuitBreaker==0xAA):
|
||||
disSysWin.dict1['预留断路器']='断开'
|
||||
disSysWin.update_disp()
|
||||
elif(msg_id==0x0002):
|
||||
logWin.display_log(logwin,f"{formatted_time}->接收到来自 {address} | 高压汇流排A配电指令:")
|
||||
elif(msg_id==0x0003):
|
||||
logWin.display_log(logwin,f"{formatted_time}->接收到来自 {address} | 高压汇流排B配电指令:")
|
||||
elif(msg_id==0x0004):
|
||||
logWin.display_log(logwin,f"{formatted_time}->接收到来自 {address} | 低压母线配电指令:")
|
||||
|
||||
|
||||
def send_messages(sock, logwin:logWin, disSysWin:disSys):
|
||||
def send_messages(sock, logwin:logWin, disSysWin:disSys,ccuSysWin:ccuSys):
|
||||
while True:
|
||||
# 配电消息反馈
|
||||
a,b,c,d = disSysWin.updata_data()
|
||||
a,b,c,d = disSysWin.get_date()
|
||||
sock.sendto(a, (target_ip, target_port))
|
||||
sock.sendto(b, (target_ip, target_port))
|
||||
sock.sendto(c, (target_ip, target_port))
|
||||
sock.sendto(d, (target_ip, target_port))
|
||||
|
||||
#TODO复合管控消息反馈
|
||||
|
||||
#TODOccu消息反馈
|
||||
e = ccuSysWin.ccuState.pack()
|
||||
sock.sendto(e, (target_ip, target_port))
|
||||
|
||||
threading.Event().wait(1) # 每隔1秒发送一次消息
|
||||
|
||||
+134
-8
@@ -173,15 +173,15 @@ class msg_CcuStateFbMsg:
|
||||
|
||||
for i in range(len(data)):
|
||||
self.checkCode += data[i]
|
||||
print(self.checkCode)
|
||||
# print(self.checkCode)
|
||||
|
||||
data += struct.pack('<I', self.checkCode)
|
||||
|
||||
|
||||
last_index = len(data)
|
||||
print(struct.unpack('<i',data[last_index-4:last_index]))
|
||||
# print(struct.unpack('<i',data[last_index-4:last_index]))
|
||||
|
||||
print(len(data))
|
||||
# print(len(data))
|
||||
|
||||
return data
|
||||
|
||||
@@ -500,11 +500,14 @@ class msg_disHVBCmd:
|
||||
self.fbReservedCircuitBreaker = None
|
||||
self.tyzReservedCircuitBreaker = None
|
||||
self.reservedCircuitBreaker = None
|
||||
self.inputWater = None
|
||||
self.outputWater = None
|
||||
self.dcdc5dcdc5Module = None
|
||||
self.checkCode = None
|
||||
|
||||
def unpack(self,data):
|
||||
try:
|
||||
unpacked_data = struct.unpack('<BBHHBBBBBBBBBBBBB',data)
|
||||
unpacked_data = struct.unpack('<BBHHBBBBBBBBBBBBBBBB',data)
|
||||
self.start1 = unpacked_data[0]
|
||||
self.start2 = unpacked_data[1]
|
||||
self.id = unpacked_data[2]
|
||||
@@ -521,10 +524,133 @@ class msg_disHVBCmd:
|
||||
self.fbReservedCircuitBreaker = unpacked_data[13]
|
||||
self.tyzReservedCircuitBreaker = unpacked_data[14]
|
||||
self.reservedCircuitBreaker = unpacked_data[15]
|
||||
self.checkCode = unpacked_data[16]
|
||||
self.inputWater = unpacked_data[16]
|
||||
self.outputWater = unpacked_data[17]
|
||||
self.dcdc5dcdc5Module = unpacked_data[18]
|
||||
self.checkCode = unpacked_data[19]
|
||||
except struct.error as e:
|
||||
print(f"Error unpacking data: {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
|
||||
self.start2 = None
|
||||
self.id = None
|
||||
self.length = None
|
||||
self.bowFTDevice123CircuitBreaker = None
|
||||
self.actuatorCircuitBreaker = None
|
||||
self.mastSteeringGearControlBoxCircuitBreaker = None
|
||||
self.xczCircuitBreaker = None
|
||||
self.bowRudderControlBoxCircuitBreaker = None
|
||||
self.openWaterCoverStartCylinderCircuitBreaker = None
|
||||
self.checkCode = None
|
||||
def unpack(self,data):
|
||||
try:
|
||||
unpacked_data = struct.unpack('<BBHHBBBBBBB',data)
|
||||
self.start1 = unpacked_data[0]
|
||||
self.start2 = unpacked_data[1]
|
||||
self.id = unpacked_data[2]
|
||||
self.length = unpacked_data[3]
|
||||
self.bowFTDevice123CircuitBreaker = unpacked_data[4]
|
||||
self.actuatorCircuitBreaker = unpacked_data[5]
|
||||
self.mastSteeringGearControlBoxCircuitBreaker = unpacked_data[6]
|
||||
self.xczCircuitBreaker = unpacked_data[7]
|
||||
self.bowRudderControlBoxCircuitBreaker = unpacked_data[8]
|
||||
self.openWaterCoverStartCylinderCircuitBreaker = unpacked_data[9]
|
||||
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
|
||||
self.start2 = None
|
||||
self.id = None
|
||||
self.length = None
|
||||
self.lithiumBatteryGroupInstrumentCircuitBreaker = None
|
||||
self.bowLowVoltageDistributionBoxCircuitBreaker = None
|
||||
self.unit4InstrumentDC48VCircuitBreaker = None
|
||||
self.dcC1DCDistributionPanelCircuitBreaker = None
|
||||
self.reservedCircuitBreaker1 = None
|
||||
self.reservedCircuitBreaker2 = None
|
||||
self.emergencyLithiumBatteryGroup2CircuitBreaker = None
|
||||
self.checkCode = None
|
||||
def unpack(self,data):
|
||||
try:
|
||||
unpacked_data = struct.unpack('<BBHHBBBBBBBB',data)
|
||||
self.start1 = unpacked_data[0]
|
||||
self.start2 = unpacked_data[1]
|
||||
self.id = unpacked_data[2]
|
||||
self.length = unpacked_data[3]
|
||||
self.lithiumBatteryGroupInstrumentCircuitBreaker = unpacked_data[4]
|
||||
self.bowLowVoltageDistributionBoxCircuitBreaker = unpacked_data[5]
|
||||
self.unit4InstrumentDC48VCircuitBreaker = unpacked_data[6]
|
||||
self.dcC1DCDistributionPanelCircuitBreaker = unpacked_data[7]
|
||||
self.reservedCircuitBreaker1 = unpacked_data[8]
|
||||
self.reservedCircuitBreaker2 = unpacked_data[9]
|
||||
self.emergencyLithiumBatteryGroup2CircuitBreaker = unpacked_data[10]
|
||||
self.checkCode = unpacked_data[11]
|
||||
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
|
||||
self.start2 = None
|
||||
self.id = None
|
||||
self.length = None
|
||||
self.unit1CircuitBreaker = None
|
||||
self.unit2CircuitBreaker = None
|
||||
self.unit3CircuitBreaker = None
|
||||
self.unit5CircuitBreaker = None
|
||||
self.bowPZDeviceCircuitBreaker = None
|
||||
self.reservedCircuitBreaker1 = None
|
||||
self.reservedCircuitBreaker2 = None
|
||||
self.emergencyLithiumBatteryGroup1CircuitBreaker = None
|
||||
self.checkCode = None
|
||||
def unpack(self,data):
|
||||
try:
|
||||
unpacked_data = struct.unpack('<BBHHBBBBBBBBB',data)
|
||||
self.start1 = unpacked_data[0]
|
||||
self.start2 = unpacked_data[1]
|
||||
self.id = unpacked_data[2]
|
||||
self.length = unpacked_data[3]
|
||||
self.unit1CircuitBreaker = unpacked_data[4]
|
||||
self.unit2CircuitBreaker = unpacked_data[5]
|
||||
self.unit3CircuitBreaker = unpacked_data[6]
|
||||
self.unit5CircuitBreaker = unpacked_data[7]
|
||||
self.bowPZDeviceCircuitBreaker = unpacked_data[8]
|
||||
self.reservedCircuitBreaker1 = unpacked_data[9]
|
||||
self.reservedCircuitBreaker2 = unpacked_data[10]
|
||||
self.emergencyLithiumBatteryGroup1CircuitBreaker = unpacked_data[11]
|
||||
self.checkCode = unpacked_data[12]
|
||||
except struct.error as e:
|
||||
print(f"Error unpacking data: msg_disLVBCmd {e}")
|
||||
|
||||
if __name__ == "__main__":
|
||||
msg = msg_CcuStateFbMsg()
|
||||
msg.pack()
|
||||
# msg = msg_CcuStateFbMsg()
|
||||
msg = msg_disHVBACmd()
|
||||
# msg.pack()
|
||||
Reference in New Issue
Block a user