协议:按0824协议更新复合管控通信解析 + 新增燃料电池监控网页
- pmSysvariable/ccuUdpMsg: 域起始符改为0x40 0x40,域标识符重编号0x0001~0x0004, ccuState/ccuColCmd/ccuSetParmCmd 按新协议字段布局与字节序重写(状态248B/操控45B/参数28B) - systemData/httpserver: 新增FC单片电压、甲醇制氢装置、DC/DC、尾气装置、一体化罐、 供氢供氧流量、应急上浮等字段解析与WebSocket JSON推送 - 新增 /fcs 燃料电池监控页(fuelcell.h):实时数据显示 + 操控指令交互按钮, 过滤日志推送消息避免界面闪烁 - SQLite/LowerCommManager/测试:更新建表列、解析打印与单元/集成测试适配新协议
This commit is contained in:
@@ -43,29 +43,68 @@ static void fillCcuState(msg_CcuStateFbMsg& m, unsigned int beat) {
|
||||
m.header.start1 = CCU_UDPMSG_START1;
|
||||
m.header.start2 = CCU_UDPMSG_START2;
|
||||
m.header.id = CCU_STATE_FB_ID;
|
||||
m.header.length = sizeof(ccuState);
|
||||
m.header.length = sizeof(msg_CcuStateFbMsg); // 域字节数为整个协议包长度
|
||||
m.data.fc_mode = 0x02; // 自动
|
||||
m.data.fc_status = 0x04; // 运行
|
||||
m.data.fc_status = 0x06; // 运行
|
||||
m.data.fc_fault_level = 0x00; // 无故障
|
||||
m.data.output_power_limit = 30000;
|
||||
m.data.total_generation_time = 1234;
|
||||
m.data.total_generation_power = 8000;
|
||||
m.data.hydrogen_capacity = 70;
|
||||
m.data.liquid_oxygen_capacity = 65;
|
||||
m.data.palladium_temp = 60;
|
||||
m.data.main_pipe_pressure = 200;
|
||||
m.data.aux_pipe_pressure = 180;
|
||||
m.data.cabin_pressure1 = 101;
|
||||
m.data.cabin_pressure2 = 101;
|
||||
m.data.cabin_temp1 = 25;
|
||||
m.data.cabin_temp2 = 26;
|
||||
m.data.cabin_humidity1 = 50;
|
||||
m.data.cabin_humidity2 = 52;
|
||||
m.data.fc1_min_cell_voltage = 85; // 850mV
|
||||
m.data.fc1_min_cell_pos = 12;
|
||||
m.data.fc1_avg_cell_voltage = 90; // 900mV
|
||||
m.data.fc2_min_cell_voltage = 84;
|
||||
m.data.fc2_min_cell_pos = 8;
|
||||
m.data.fc2_avg_cell_voltage = 89;
|
||||
m.data.palladium_temp = 600; // 60.0℃
|
||||
m.data.buffer_tank_pressure = 200; // 20.0kPa
|
||||
m.data.flue_total_emission = 500; // 50.0kg
|
||||
m.data.flue_pressure = 20000; // 20.000MPa
|
||||
m.data.reactor_pressure = 30000; // 30.000MPa
|
||||
m.data.electric_valve_open = 500; // 50.0%
|
||||
m.data.main_pipe_pressure = 2000; // 20.00kPa
|
||||
m.data.aux_pipe_pressure = 1800;
|
||||
m.data.dcdc1_in_voltage = 700; // 70.0V
|
||||
m.data.dcdc1_in_current = 120; // 12.0A
|
||||
m.data.dcdc2_in_voltage = 700;
|
||||
m.data.dcdc2_in_current = 120;
|
||||
m.data.dcdc_out_voltage = 4800; // 480.0V
|
||||
m.data.dcdc_out_current = 160; // 16.0A
|
||||
m.data.dcdc_control_voltage = 100; // 25.0V
|
||||
m.data.dcdc_aux_out_voltage = 100; // 12.5V
|
||||
m.data.methanol_total_usage = 1000; // 100.0kg
|
||||
m.data.methanol_solution_feed = 100; // 100mL/min
|
||||
m.data.oxygen_water_tank_level = 50000; // 500.00mm
|
||||
m.data.hydrogen_water_tank_level = 45000;
|
||||
m.data.ballast_water_tank_level = 40000;
|
||||
m.data.exhaust_in_pressure = 2000; // 20.00MPa
|
||||
m.data.exhaust_out_pressure = 1800;
|
||||
m.data.exhaust_run_freq = 5000; // 50.00Hz
|
||||
m.data.exhaust_in_temp = 6000; // 60.00℃
|
||||
m.data.exhaust_out_temp = 5500;
|
||||
m.data.exhaust_in_water_pressure = 3000; // 30.00kPa
|
||||
m.data.exhaust_out_water_pressure = 2800;
|
||||
m.data.tank_lo2_pressure = 1000; // 10.00MPa
|
||||
m.data.tank_co2_pressure = 800;
|
||||
m.data.tank_lo2_level = 20000; // 200.00mm
|
||||
m.data.alloy_h2_flow = 500; // 5.00L/min
|
||||
m.data.fc_h2_flow = 450;
|
||||
m.data.fc_o2_flow = 300;
|
||||
m.data.emergency_float_depth = 50; // 50m
|
||||
m.data.emergency_float_time = 20; // 20min
|
||||
m.data.cabin_pressure1 = 10100; // 101.00kPa
|
||||
m.data.cabin_pressure2 = 10100;
|
||||
m.data.cabin_temp1 = 2500; // 25.00℃
|
||||
m.data.cabin_temp2 = 2600;
|
||||
m.data.cabin_humidity1 = 5000; // 50.00%RH
|
||||
m.data.cabin_humidity2 = 5200;
|
||||
m.data.flame_detector1 = 0x00;
|
||||
m.data.flame_detector2 = 0x00;
|
||||
m.data.h2_concentration1 = 5;
|
||||
m.data.o2_concentration1 = 2000;
|
||||
m.data.ch3oh_concentration1 = 3;
|
||||
m.data.h2_concentration1 = 500; // 5.00%LEL
|
||||
m.data.o2_concentration1 = 200000; // 2000.00%Vol
|
||||
m.data.ch3oh_concentration1 = 300;
|
||||
m.data.emergency_battery1_voltage = 240;
|
||||
m.data.emergency_battery1_current = 10;
|
||||
m.data.emergency_battery1_max_temp = 30;
|
||||
@@ -73,13 +112,13 @@ static void fillCcuState(msg_CcuStateFbMsg& m, unsigned int beat) {
|
||||
m.data.emergency_battery2_current = 10;
|
||||
m.data.emergency_battery2_max_temp = 31;
|
||||
m.data.cabin_ox_concentration = 2000;
|
||||
m.data.cabin_temperature = 25;
|
||||
m.data.cabin_humidity = 50;
|
||||
m.data.cabin_pressure = 101;
|
||||
m.data.cabin_temperature = 250;
|
||||
m.data.cabin_humidity = 500;
|
||||
m.data.cabin_pressure = 1010;
|
||||
m.data.power_cabin_ox_concentration = 2000;
|
||||
m.data.power_cabin_temperature = 28;
|
||||
m.data.power_cabin_humidity = 48;
|
||||
m.data.power_cabin_pressure = 101;
|
||||
m.data.power_cabin_temperature = 280;
|
||||
m.data.power_cabin_humidity = 480;
|
||||
m.data.power_cabin_pressure = 1010;
|
||||
m.data.ins_relay_status1 = 0x11;
|
||||
m.data.ins_relay_status2 = 0x12;
|
||||
m.data.dyn_relay_status1 = 0x11;
|
||||
@@ -94,14 +133,14 @@ static void fillCcuState(msg_CcuStateFbMsg& m, unsigned int beat) {
|
||||
m.data.dyn_power_input = 30;
|
||||
m.data.ins_charge_status = 0x20; // 放电
|
||||
m.data.dyn_charge_status = 0x20;
|
||||
m.data.ins_voltage_link = 2400; // 240.0V
|
||||
m.data.ins_voltage_link = 2400; // 24.00V
|
||||
m.data.ins_voltage_pack = 2350;
|
||||
m.data.ins_current = 400; // 20A
|
||||
m.data.ins_current = 400; // 20.0A
|
||||
m.data.ins_resistance_pos = 999;
|
||||
m.data.ins_resistance_neg = 999;
|
||||
m.data.dyn_voltage_link = 5200; // 520.0V
|
||||
m.data.dyn_voltage_link = 5200; // 52.00V
|
||||
m.data.dyn_voltage_pack = 5150;
|
||||
m.data.dyn_current = 600; // 30A
|
||||
m.data.dyn_current = 600; // 30.0A
|
||||
m.data.dyn_resistance_pos = 999;
|
||||
m.data.dyn_resistance_neg = 999;
|
||||
m.data.ins_emergency_status = 0x00;
|
||||
@@ -112,12 +151,14 @@ static void fillCcuState(msg_CcuStateFbMsg& m, unsigned int beat) {
|
||||
m.data.dyn_soc_threshold1 = 90;
|
||||
m.data.dyn_soc_threshold2 = 80;
|
||||
m.data.dyn_soc_threshold3 = 70;
|
||||
m.data.ins_power_limit1 = 8;
|
||||
m.data.ins_power_limit2 = 4;
|
||||
m.data.dyn_power_limit1 = 8;
|
||||
m.data.dyn_power_limit2 = 4;
|
||||
m.data.device_online_flag1 = 0x000000FF;
|
||||
m.data.device_online_flag2 = 0x0000001F;
|
||||
m.data.dyn_charge_level = 0x01;
|
||||
m.data.dyn_water_leak_status = 0x00;
|
||||
m.data.ins_water_leak_dcdc_status = 0x00;
|
||||
m.data.heartbeat = beat;
|
||||
m.data.heartbeat = static_cast<uint8_t>(beat);
|
||||
m.data.emergency_command = 0x03;
|
||||
m.checkCode = ccuChecksum(reinterpret_cast<unsigned char*>(&m), sizeof(m));
|
||||
}
|
||||
|
||||
|
||||
@@ -169,11 +169,11 @@ TEST(SqliteTest, InsertCcuSetParmCmdReadBack)
|
||||
std::string path = tmpPath("setparmcmd");
|
||||
{
|
||||
SQLite db(path); ASSERT_TRUE(db.createTable());
|
||||
ccuSetParmCmd c{}; c.fcuToInsLimit1 = 7; c.powerSocHold2 = 88;
|
||||
ccuSetParmCmd c{}; c.insSocHold1 = 7; c.powerSocHold2 = 88;
|
||||
EXPECT_TRUE(db.insertData(c));
|
||||
}
|
||||
long long v = 0;
|
||||
EXPECT_TRUE(rawQueryInt(path, "SELECT fcuToInsLimit1 FROM ccuSetParmCmd", v));
|
||||
EXPECT_TRUE(rawQueryInt(path, "SELECT insSocHold1 FROM ccuSetParmCmd", v));
|
||||
EXPECT_EQ(v, 7);
|
||||
EXPECT_TRUE(rawQueryInt(path, "SELECT powerSocHold2 FROM ccuSetParmCmd", v));
|
||||
EXPECT_EQ(v, 88);
|
||||
|
||||
@@ -155,8 +155,6 @@ TEST(SystemDataTest, CcuStateScalingAndRelayBits)
|
||||
c.ins_relay_status1 = 0x12; // 高4位=1(充电), 低4位=2(正极)
|
||||
c.ins_relay_status2 = 0x34;
|
||||
c.ins_voltage_link = 4800; // ×0.1 = 480.0
|
||||
c.ins_water_leak_dcdc_status = 0x11; // 高4位=1 漏水, 低4位=1 DCDC故障
|
||||
c.dyn_water_leak_status = 0x21; // 高4位=2, 低4位=1
|
||||
sd.updateSystemData(c);
|
||||
EXPECT_EQ(sd.ins_soc, 60);
|
||||
EXPECT_EQ(sd.dyn_soc, 80);
|
||||
@@ -165,9 +163,9 @@ TEST(SystemDataTest, CcuStateScalingAndRelayBits)
|
||||
EXPECT_EQ(sd.ins_precharge_relay_status, 4u); // 低4位 of status2
|
||||
EXPECT_EQ(sd.ins_neg_relay_status, 3u); // 高4位 of status2
|
||||
EXPECT_NEAR(sd.ins_voltage_link, 480.0, 0.01);
|
||||
EXPECT_EQ(sd.water_leak_status_from_insbat, 1u);
|
||||
EXPECT_EQ(sd.dcdc_status_from_insbat, 1u);
|
||||
EXPECT_TRUE(sd.leakStatus[SystemData::LEAKAGE_LI_BATTERY]);
|
||||
EXPECT_EQ(sd.water_leak_status_from_insbat, 0u);
|
||||
EXPECT_EQ(sd.dcdc_status_from_insbat, 0u);
|
||||
EXPECT_FALSE(sd.leakStatus[SystemData::LEAKAGE_LI_BATTERY]);
|
||||
}
|
||||
|
||||
TEST(SystemDataTest, FaultCodeSetAndLevel)
|
||||
|
||||
@@ -54,7 +54,7 @@ ccuState createTestCcuState() {
|
||||
state.ins_soc = 85;
|
||||
state.dyn_soc = 90;
|
||||
|
||||
state.heartbeat = 12345;
|
||||
state.heartbeat = 123;
|
||||
|
||||
return state;
|
||||
}
|
||||
@@ -64,7 +64,6 @@ ccuColCmd createTestCcuColCmd() {
|
||||
cmd.fcmode = 2;
|
||||
cmd.fcuCmd = 2;
|
||||
cmd.fcuPowerEfficiency = 80;
|
||||
cmd.insChargeEnable = 1;
|
||||
cmd.insBatCmd = 1;
|
||||
cmd.powerBatCmd = 1;
|
||||
cmd.powerBatEfficiency = 85;
|
||||
|
||||
Reference in New Issue
Block a user