Files
H100PowerManger/src/pPowerManger/systemData.h
T

777 lines
43 KiB
C++

#ifndef SYSTEMDATA_H
#define SYSTEMDATA_H
#include "pmSysvariable.h"
#include "sqlit3/SQLite.h"
#include <set>
#define DEBUFG
class SystemData
{
private:
SQLite* m_db;
public:
//燃料电池系统参数
uint8_t fc_mode; // 燃料电池系统运行模式:00H-无效, 01H-调试, 02H-自动, 03H-补给
uint8_t fc_status; // 燃料电池状态:00H-无效, 01H-初始化, ..., 0DH-维护完成
uint8_t fc_fault_level; // 燃料电池故障等级:00H-无故障, 10H-一级, 20H-二级, 30H-三级, 40H-四级
//功率和时间参数
float output_power_limit; // 系统输出功率限制值,单位:W
float total_generation_time; // 系统累计发电时间,单位:0.1小时
float total_generation_power; // 系统累计发电总功率,单位:W
//故障信息
uint16_t fc_fault_level_1; // 一级故障位
uint16_t fc_fault_level_2; // 二级故障位
uint16_t fc_fault_level_3; // 三级故障位
uint16_t fc_fault_level_4; // 四级故障位
//燃料容量
float hydrogen_capacity; // 储氢罐剩余容量百分比,单位:%
float liquid_oxygen_capacity; // 液氧罐剩余容量百分比,单位:%
//温度压力参数
float palladium_temp; // 钯膜最高温度,单位:℃
float main_pipe_pressure; // 主水路压力,单位:0.01kPa
float aux_pipe_pressure; // 辅水路压力,单位:0.01kPa
//舱室环境参数
float cabin_pressure1; // 舱室1压力,单位:0.01kPa
float cabin_pressure2; // 舱室2压力,单位:0.01kPa
float cabin_temp1; // 舱室1温度,单位:0.01℃
float cabin_temp2; // 舱室2温度,单位:0.01℃
float cabin_humidity1; // 舱室1湿度,单位:0.01%RH
float cabin_humidity2; // 舱室2湿度,单位:0.01%RH
//火焰探测器
uint8_t flame_detector1; // 火焰探测器1状态:00H-无效, 01H-报警, 02H-故障
uint8_t flame_detector2; // 火焰探测器2状态:00H-无效, 01H-报警, 02H-故障
//气体浓度
float h2_concentration1; // 舱室H2浓度1,单位:0.01% LEL
float h2_concentration2; // 舱室H2浓度2,单位:0.01% LEL
float h2_concentration3; // 舱室H2浓度3,单位:0.01% LEL
float o2_concentration1; // 舱室O2浓度1,单位:0.01% LEL
float o2_concentration2; // 舱室O2浓度2,单位:0.01% LEL
float ch3oh_concentration1; // 舱室甲醇气体浓度1,单位:0.01% LEL
float ch3oh_concentration2; // 舱室甲醇气体浓度2,单位:0.01% LEL
//保留字段
float reserved1[10]; // 保留字段
float cabin_ox_concentration; // 仪表舱内氧气浓度,单位:0.1%
float cabin_temperature; // 仪表舱内温度,单位:0.1℃
float cabin_humidity; // 仪表舱内湿度,单位:0.1%RH
float cabin_pressure; // 仪表舱内大气压,单位:0.2kPa
//动力舱参数
float power_cabin_ox_concentration; // 动力舱内氧气浓度,单位:0.1%
float power_cabin_temperature; // 动力舱内温度,单位:0.1℃
float power_cabin_humidity; // 动力舱内湿度,单位:0.1%RH
float power_cabin_pressure; // 动力舱内大气压,单位:0.2kPa
uint8_t reserved2[2]; // 保留字段
//电池报警标志
uint8_t dyn_alarm_flag[6]; // 动力锂电池报警标志
uint8_t ins_alarm_flag[6]; // 仪表锂电池报警标志
//继电器状态
uint8_t ins_relay_status1; // 仪表电池继电器状态
uint8_t ins_relay_status2; // 仪表电池预充继电器和负极继电器状态
uint8_t dyn_relay_status1; // 动力电池正极与充电继电器状态
uint8_t dyn_relay_status2; // 动力电池预充与负极继电器状态
//仪表电池继电器状态
uint8_t ins_pos_relay_status; // 仪表电池正极继电器状态 (X0H:无效 X1H:接通 X2H:断开)
uint8_t ins_charge_relay_status; // 仪表电池充电继电器状态 (0XH:无效 1XH:接通 2XH:断开)
uint8_t ins_precharge_relay_status; // 仪表电池预充继电器状态 (X0H:无效 X1H:接通 X2H:断开)
uint8_t ins_neg_relay_status; // 仪表电池负极继电器状态 (0XH:无效 1XH:接通 2XH:断开)
//动力电池继电器状态
uint8_t dyn_pos_relay_status; // 动力电池正极继电器状态 (X0H:无效 X1H:接通 X2H:断开)
uint8_t dyn_charge_relay_status; // 动力电池充电继电器状态 (0XH:无效 1XH:接通 2XH:断开)
uint8_t dyn_precharge_relay_status; // 动力电池预充继电器状态 (X0H:无效 X1H:接通 X2H:断开)
uint8_t dyn_neg_relay_status; // 动力电池负极继电器状态 (0XH:无效 1XH:接通 2XH:断开)
//电池功率参数
float ins_max_discharge_power; // 仪表电池最大允许放电功率,单位:0.05kW
float dyn_max_discharge_power; // 动力电池最大允许放电功率,单位:0.05kW
//电池SOC
int ins_soc; // 仪表锂电池荷电状态SOC,范围:0~100
int dyn_soc; // 动力锂电池荷电状态SOC,范围:0~100
//电池能量
float ins_total_energy; // 仪表电池总能量,单位:0.1kWh
float dyn_total_energy; // 动力电池总能量,单位:0.1kWh
//电池输入功率
float ins_power_input; // 仪表电池输入功率,单位:0.1kW
float dyn_power_input; // 动力电池输入功率,单位:0.1kW
//电池充放电状态
uint8_t ins_charge_status; // 仪表电池充放电状态:00H-无效,10H-充电,20H-放电
uint8_t dyn_charge_status; // 动力电池充放电状态:00H-无效,10H-充电,20H-放电
//电池电压电流
float ins_voltage_link; // 仪表电池LINK端电压,单位:0.01V
float ins_voltage_pack; // 仪表电池PACK端电压,单位:0.01V
float ins_current; // 仪表电池电流,单位:0.01A
float ins_resistance_pos; // 仪表电池正极绝缘电阻,单位:kΩ
float ins_resistance_neg; // 仪表电池负极绝缘电阻,单位:kΩ
float dyn_voltage_link; // 动力电池LINK端电压,单位:0.01V
float dyn_voltage_pack; // 动力电池PACK端电压,单位:0.01V
float dyn_current; // 动力电池电流,单位:0.05A
float dyn_resistance_pos; // 动力电池正极绝缘电阻,单位:kΩ
float dyn_resistance_neg; // 动力电池负极绝缘电阻,单位:kΩ
//紧急状态
uint8_t ins_emergency_status; // 仪表电池紧急状态
uint8_t dyn_emergency_status; // 动力电池紧急状态
//保留字段
uint8_t reserved3[2]; // 保留字段
float ins_soc_threshold1; // 仪表电池1 SOC门限
float ins_soc_threshold2; // 仪表电池2 SOC门限
float ins_soc_threshold3; // 仪表电池3 SOC门限
float dyn_soc_threshold1; // 动力电池1 SOC门限
float dyn_soc_threshold2; // 动力电池2 SOC门限
float dyn_soc_threshold3; // 动力电池3 SOC门限
float ins_power_limit1; // 仪表电池1功率限制值
float ins_power_limit2; // 仪表电池2功率限制值
float dyn_power_limit1; // 动力电池1功率限制值
float dyn_power_limit2; // 动力电池2功率限制值
//设备在线状态
uint32_t device_online_flag1; // 设备在线状态标志1
uint32_t device_online_flag2; // 设备在线状态标志2
//其他锂电池状态
uint8_t dyn_charge_level; // 动力电池充电状态:01H-1级(不限), 02H-2级(限功率), 03H-3级(关闭)
uint8_t dyn_water_leak_status; // 动力漏水状态:0XH-正常, 1XH-异常漏水
uint8_t ins_water_leak_dcdc_status; // 仪表漏水状态与DCDC状态:低4位-漏水状态(0XH正常,1XH异常),高4位-DCDC状态(X0H正常,X1H故障)
uint8_t reserved4;
unsigned char water_leak_status_from_insbat; // 仪表漏水状态
unsigned char water_leak_status_from_dynbat; // 动力漏水状态
unsigned char dcdc_status_from_insbat; // 仪表DCDC状态
//保留字段
// uint32_t reserved4; // 保留字段
uint32_t heartbeat; // 主机心跳计数器
//锂电池故障字段
unsigned char powfaultCode;
unsigned char insfaultCode;
//配电系统故障码
std::set<unsigned int> distributeFaultCode;
// MOOSD 状态
bool moosd_status;
//配电系统状态
//动力母线状态
struct POWER_BUS_STATUS
{
// 5: 燃料电池断路器 0 断开 1 闭合 2 故障
unsigned char fuelCellCircuitBreaker;
// 6: 动力锂电池断路器 0 断开 1 闭合 2 故障
unsigned char powerLithiumBatteryCircuitBreaker;
// 7: 推进电机断路器 0 断开 1 闭合 2 故障
unsigned char propulsionMotorCircuitBreaker;
// 8: 锂电池组仪表断路器 0 断开 1 闭合 2 故障
unsigned char lithiumBatteryGroupInstrumentCircuitBreaker;
// 9: DC/DC5模块断路器 0 断开 1 闭合 2 故障
unsigned char dcDc5ModuleCircuitBreaker;
// 10: 艏部高压配电箱断路器 0 断开 1 闭合 2 故障
unsigned char bowHighVoltageDistributionBoxCircuitBreaker;
// 11: 艉部FT装置4/5断路器 0 断开 1 闭合 2 故障
unsigned char sternFTDevice45CircuitBreaker;
// 12: 艉舵开关1断路器 0 断开 1 闭合 2 故障
unsigned char sternRudderSwitch1CircuitBreaker;
// 13: 艉舵开关2断路器 0 断开 1 闭合 2 故障
unsigned char sternRudderSwitch2CircuitBreaker;
// 14: FB预留断路器 0 断开 1 闭合 2 故障
unsigned char fbReservedCircuitBreaker;
// 15: TYZ预留断路器 0 断开 1 闭合 2 故障
unsigned char tyzReservedCircuitBreaker;
// 16: 预留断路器 0 断开 1 闭合 2 故障
unsigned char reservedCircuitBreaker;
// 17: DC/DC5模块状态 0 未运行;1 运行;2 DC/DC模块过温关机;3 输出过流;4 输出过压;5 输出欠压;6 输入过压;7 输入欠压;8 输出短路保护;9 内部故障
unsigned char dcDcModuleStatus;
// 18:冷却系统状态 0 未运行 1 运行 2 冷却泵1故障 3 冷却泵2故障 4 冷却水泄露
unsigned char coolingSystemStatus;
// 19: 动力母排绝缘状态 0 正常 1 绝缘低
unsigned char powerBusInsulationStatus;
// 20: A汇流排绝缘状态 0 正常 1 绝缘低
unsigned char aBusInsulationStatus;
// 21: 仪表电源状态 0 正常 1 故障
unsigned char meterPowerLossSignal;
// 22: 应急电源状态 0 正常 1 故障
unsigned char emergencyPowerLossSignal;
// 22: dc/dc温度
float dcDcTemperature;
// 23: 动力汇流排电压
float powerBusVoltage;
// 24: DC/DC5模块电流
float dcDc5ModuleCurrent;
// 25: 动力汇流排电流
float powerBusCurrent;
// 26: A汇流排电压
float busbarAVoltage;
// 27: 推进电机控制箱电流
float propulsionMotorControlBoxCurrent;
// 28: A汇流排电流
float busbarACurrent;
// 29: 锂电池组(仪表)电流
float lithiumBatteryGroupMeterCurrent;
// 30: 艏部高压配电箱电流
float bowHighVoltageDistributionBoxCurrent;
// 31: 艉部FT装置4/5电流
float sternFTDevice45Current;
// 32: TYZ预留开关电流
float tyzReservedSwitchCurrent;
// 33: 艉舵开关1电流
float sternRudderSwitch1Current;
// 34: 预留电流
float reservedCurrent1; // 改为 reservedCurrent1 以避免重名
// 35: 艉舵开关2电流
float sternRudderSwitch2Current;
// 36: 预留电流2
float reservedCurrent2; // 改为 reservedCurrent2 以避免重名
// 37: FB预留电流
float fbReservedSwitchCurrent;
// 38: 预留电流3
float reservedCurrent3; // 改为 reservedCurrent3 以避免重名
// 39: 冷却水压力
float coolWaterPressure;
}power_bus_status;
struct POWER_A_BUS_STATUS
{
//动力汇流排状态
//5. 艏部FT装置1/2/3断路器 0 断开 1 闭合 2 故障
unsigned char bowFTDevice123CircuitBreaker;
//6. 启闭机构断路器 0 断开 1 闭合 2 故障
unsigned char actuatorCircuitBreaker;
//7. 桅杆舵机控制箱断路器 0 断开 1 闭合 2 故障
unsigned char mastSteeringGearControlBoxCircuitBreaker;
//8. XCZ断路器 0 断开 1 闭合 2 故障
unsigned char xczCircuitBreaker;
//9. 艏舵控制箱断路器 0 断开 1 闭合 2 故障
unsigned char bowRudderControlBoxCircuitBreaker;
//10. 敞水盖启动电缸断路器 0 断开 1 闭合 2 故障
unsigned char openWaterCoverStartCylinderCircuitBreaker;
//11. 仪表电源失电信号 0 正常 1 故障
unsigned char instrumentPowerFailureSignal;
//12. 应急电源失电信号 0 正常 1 故障
unsigned char emergencyPowerFailureSignal;
//13. 浸水报警 0 无 1 有
unsigned char waterIngressionAlarm;
//14. 汇流排B电压
float busbarBVoltage;
//15. 汇流排B电流
float busbarBCurrent;
//16. 艏部FT装置1/2/3电流
float bowFTDevice123Current;
//17. 启闭机构电流
float actuatorCurrent;
//18. 桅杆舵机控制箱电流
float mastSteeringGearControlBoxCurrent;
//19. XCZ电流
float xczCurrent;
//20. 艏舵控制箱电流
float bowRudderControlBoxCurrent;
//21. 敞水盖启动电缸电流
float openWaterCoverStartCylinderCurrent;
} power_a_bus_status;
//仪表主母线状态
struct INSTRUMENT_MAIN_BUS_STATUS
{
//5. 锂电池组(仪表)断路器 0 断开 1 闭合 2 故障
unsigned char lithiumBatteryGroupInstrumentCircuitBreaker;
//6. 艏部低压配电箱断路器 0 断开 1 闭合 2 故障
unsigned char bowLowVoltageDistributionBoxCircuitBreaker;
//7. UNIT4仪表DC48V断路器 0 断开 1 闭合 2 故障
unsigned char unit4InstrumentDC48VCircuitBreaker;
//8. DC-C1直流配电板断路器 0 断开 1 闭合 2 故障
unsigned char dcC1DCDistributionPanelCircuitBreaker;
//9. 预留断路器1 0 断开 1 闭合 2 故障
unsigned char reservedCircuitBreaker1; // 为了区分,添加了数字后缀
//10. 预留断路器2 0 断开 1 闭合 2 故障
unsigned char reservedCircuitBreaker2; // 为了区分,添加了数字后缀
//11. 应急锂电池组2断路器 0 断开 1 闭合 2 故障
unsigned char emergencyLithiumBatteryGroup2CircuitBreaker;
//12. 仪表电源失电信号 0 正常 1 故障
unsigned char instrumentPowerFailureSignal;
//13. 应急电源失电信号 0 正常 1 故障
unsigned char emergencyPowerFailureSignal;
//14. 仪表汇流排绝缘低 0 正常 1 绝缘低
unsigned char instrumentBusbarInsulationLow;
//15. 仪表母排电压
float instrumentBusbarVoltage;
//16. 艏部低压配电箱电流
float bowLowVoltageDistributionBoxCurrent;
//17. DC-C1(直流配电板1)仪表DC48V电流
float dcC1InstrumentDC48VCurrent;
//18. 预留电流
float reservedCurrent1; // 为了区分,添加了数字后缀
//19. 应急锂电池组2电流
float emergencyLithiumBatteryGroup2Current;
//20. 锂电池组(仪表)电流
float lithiumBatteryGroupInstrumentCurrent;
//21. UNIT4仪表DC48V电流
float unit4InstrumentDC48VCurrent;
//22. Ushort 预留电流
float reservedCurrent2; // 为了区分,添加了数字后缀
//23. 应急2汇流排电压
float emergency2BusbarVoltage;
//24. 复合能源管控系统应急DC48V电流
float compositeEnergyManagementSystemEmergencyDC48VCurrent;
//25. 燃料电池安全系统应急DC48V电流
float fuelCellSecuritySystemEmergencyDC48VCurrent;
//26. PLC控制电源电流
float plcControlPowerCurrent;
} instrument_main_bus_status;
//仪表汇流排状态
struct INSTRUMENT_BUS_STATUS
{
//5. UNIT1断路器 0 断开 1 闭合 2 故障
unsigned char unit1CircuitBreaker;
//6. UNIT2断路器 0 断开 1 闭合 2 故障
unsigned char unit2CircuitBreaker;
//7. UNIT3断路器 0 断开 1 闭合 2 故障
unsigned char unit3CircuitBreaker;
//8. UNIT5断路器 0 断开 1 闭合 2 故障
unsigned char unit5CircuitBreaker;
//9. 艏部PZ装置断路器 0 断开 1 闭合 2 故障
unsigned char bowPZDeviceCircuitBreaker;
//10. 预留断路器1 0 断开 1 闭合 2 故障
unsigned char reservedCircuitBreaker1; // 为了区分,添加了数字后缀
//11. 预留断路器2 0 断开 1 闭合 2 故障
unsigned char reservedCircuitBreaker2; // 为了区分,添加了数字后缀
//12. 应急锂电池组1断路器 0 断开 1 闭合 2 故障
unsigned char emergencyLithiumBatteryGroup1CircuitBreaker;
//13. 仪表电源失电信号 0 正常 1 故障
unsigned char powerFailureSignal;
//14. 应急电源失电信号 0 正常 1 故障
unsigned char emergencyPowerFailureSignal;
//15. 浸水报警 0 无 1 有
unsigned char waterIngressionAlarm;
//16. 仪表母排电压
float instrumentBusbarVoltage;
//17. 仪表母排电流
float instrumentBusbarCurrent;
//18. UNIT1电流
float unit1Current;
//19. UNIT2电流
float unit2Current;
//20. UNIT3电流
float unit3Current;
//21. UNIT5电流
float unit5Current;
//22. 艏部PZ装置电流
float bowPZDeviceCurrent;
//23. 应急锂电池组1电流
float emergencyLithiumBatteryGroup1Current;
//24. 应急1汇流排电压
float emergency1BusbarVoltage;
} instrument_bus_status;
struct COMMON_STATUS
{
//超时状态
bool isTimeout;
//最后更新时间
double lastUpdateTime;
};
struct DeviceCommonStatus
{
COMMON_STATUS ccu_status;
COMMON_STATUS dis_hv_c1;
COMMON_STATUS dis_hv_c2;
COMMON_STATUS dis_lv_c1;
COMMON_STATUS dis_lv_c2;
} device_common_status;
struct DeviceOnlineStatus
{
//在线状态
//0x00: 未上线
//0x01: 在线
//0x02: 上线后掉线
uint8_t ins_online_state; //仪表锂电在线标志位
uint8_t dyn_online_state; //动力锂电在线标志位
uint8_t fuel_online_state; //燃电锂电在线标志位
uint8_t high_voltage_online_state; //高压配电板在线标志位
uint8_t low_voltage_online_state; //低压配电板在线标志位
uint8_t composite_online_state; //复合管控主机在线标志位
uint8_t composite_backup_online_state; //复合管控备机在线标志位
} device_online_status;
public:
SystemData(){
//初始化变量全部为0
memset(this, 0, sizeof(SystemData));
};
~SystemData(){};
void updateCommonStatus(double time_out=3){
//更新时间
double currentTime = MOOSTime();
//判断是否超时
device_common_status.ccu_status.isTimeout = (currentTime - device_common_status.ccu_status.lastUpdateTime) > time_out;
device_common_status.dis_hv_c1.isTimeout = (currentTime - device_common_status.dis_hv_c1.lastUpdateTime) > time_out;
device_common_status.dis_hv_c2.isTimeout = (currentTime - device_common_status.dis_hv_c2.lastUpdateTime) > time_out;
device_common_status.dis_lv_c1.isTimeout = (currentTime - device_common_status.dis_lv_c1.lastUpdateTime) > time_out;
device_common_status.dis_lv_c2.isTimeout = (currentTime - device_common_status.dis_lv_c2.lastUpdateTime) > time_out;
};
void updateSystemData(ccuState data){
fc_mode = data.fc_mode;
fc_status = data.fc_status;
fc_fault_level = data.fc_fault_level;
//功率和时间参数
output_power_limit = data.output_power_limit;
total_generation_time = data.total_generation_time * 0.1;
total_generation_power = data.total_generation_power;
//故障信息
#ifdef DEBUG
fc_fault_level_1 = data.fault_level_1;
fc_fault_level_2 = data.fault_level_2;
fc_fault_level_3 = data.fault_level_3;
fc_fault_level_4 = data.fault_level_4;
#endif
//燃料容量
hydrogen_capacity = static_cast<int>(data.hydrogen_capacity);
liquid_oxygen_capacity = static_cast<int>(data.liquid_oxygen_capacity);
//温度压力参数
palladium_temp = data.palladium_temp;
main_pipe_pressure = data.main_pipe_pressure * 0.01;
aux_pipe_pressure = data.aux_pipe_pressure * 0.01;
//舱室环境参数
cabin_pressure1 = data.cabin_pressure1 * 0.01;
cabin_pressure2 = data.cabin_pressure2 * 0.01;
cabin_temp1 = data.cabin_temp1 * 0.01;
cabin_temp2 = data.cabin_temp2 * 0.01;
cabin_humidity1 = data.cabin_humidity1 * 0.01;
cabin_humidity2 = data.cabin_humidity2 * 0.01;
//火焰探测器
flame_detector1 = data.flame_detector1;
flame_detector2 = data.flame_detector2;
//气体浓度
h2_concentration1 = data.h2_concentration1 * 0.01;
h2_concentration2 = data.h2_concentration2 * 0.01;
h2_concentration3 = data.h2_concentration3 * 0.01;
o2_concentration1 = data.o2_concentration1 * 0.01;
o2_concentration2 = data.o2_concentration2 * 0.01;
ch3oh_concentration1 = data.ch3oh_concentration1 * 0.01;
ch3oh_concentration2 = data.ch3oh_concentration2 * 0.01;
//保留字段
for(int i=0; i<10; i++) {
reserved1[i] = data.reserved1[i];
}
//仪表舱参数
cabin_ox_concentration = data.cabin_ox_concentration * 0.1;
cabin_temperature = static_cast<int16_t>(data.cabin_temperature) * 0.1;
cabin_humidity = data.cabin_humidity * 0.1;
cabin_pressure = data.cabin_pressure * 0.2;
//动力舱参数
power_cabin_ox_concentration = data.power_cabin_ox_concentration * 0.1;
power_cabin_temperature = static_cast<int16_t>(data.power_cabin_temperature) * 0.1;
power_cabin_humidity = data.power_cabin_humidity * 0.1;
power_cabin_pressure = data.power_cabin_pressure * 0.2;
//电池报警标志
for(int i=0; i<6; i++) {
dyn_alarm_flag[i] = data.dyn_alarm_flag[i];
ins_alarm_flag[i] = data.ins_alarm_flag[i];
}
//继电器状态
ins_relay_status1 = data.ins_relay_status1;
ins_relay_status2 = data.ins_relay_status2;
dyn_relay_status1 = data.dyn_relay_status1;
dyn_relay_status2 = data.dyn_relay_status2;
//继电器状态
ins_pos_relay_status = (data.ins_relay_status1 ) & 0x0F; // 取高4位作为正极继电器状态
ins_charge_relay_status = ( data.ins_relay_status1 >> 4)& 0x0F; // 取低4位作为充电继电器状态
ins_precharge_relay_status = (data.ins_relay_status2 ) & 0x0F; // 取高4位作为预充继电器状态
ins_neg_relay_status = (data.ins_relay_status2 >> 4) & 0x0F; // 取低4位作为负极继电器状态
dyn_pos_relay_status = (data.dyn_relay_status1 ) & 0x0F; // 取高4位作为正极继电器状态
dyn_charge_relay_status = (data.dyn_relay_status1 >> 4) & 0x0F; // 取低4位作为充电继电器状态
dyn_precharge_relay_status = (data.dyn_relay_status2) & 0x0F; // 取高4位作为预充继电器状态
dyn_neg_relay_status = (data.dyn_relay_status2 >> 4) & 0x0F; // 取低4位作为负极继电器状态
//电池功率参数
ins_max_discharge_power = data.ins_max_discharge_power * 0.05;
dyn_max_discharge_power = data.dyn_max_discharge_power * 0.05;
//电池SOC
ins_soc = static_cast<int>(data.ins_soc);
dyn_soc = static_cast<int>(data.dyn_soc);
//电池能量
ins_total_energy = data.ins_total_energy * 0.1;
dyn_total_energy = data.dyn_total_energy * 0.1;
//电池输入功率
ins_power_input = data.ins_power_input ;
dyn_power_input = data.dyn_power_input ;
//电池充放电状态
ins_charge_status = data.ins_charge_status;
dyn_charge_status = data.dyn_charge_status;
//电池电压电流
ins_voltage_link = data.ins_voltage_link * 0.1;
ins_voltage_pack = data.ins_voltage_pack * 0.1;
ins_current = static_cast<int16_t>(data.ins_current) * 0.05;
ins_resistance_pos = data.ins_resistance_pos;
ins_resistance_neg = data.ins_resistance_neg;
dyn_voltage_link = data.dyn_voltage_link * 0.1;
dyn_voltage_pack = data.dyn_voltage_pack * 0.1;
dyn_current = static_cast<int16_t>(data.dyn_current) * 0.05;
dyn_resistance_pos = data.dyn_resistance_pos;
dyn_resistance_neg = data.dyn_resistance_neg;
//紧急状态
ins_emergency_status = data.ins_emergency_status;
dyn_emergency_status = data.dyn_emergency_status;
//保留字段
for(int i=0; i<2; i++) {
reserved2[i] = data.reserved2[i];
}
//SOC门限值
ins_soc_threshold1 = data.ins_soc_threshold1;
ins_soc_threshold2 = data.ins_soc_threshold2;
ins_soc_threshold3 = data.ins_soc_threshold3;
//功率限制值
ins_power_limit1 = data.ins_power_limit1;
ins_power_limit2 = data.ins_power_limit2;
//设备在线状态
device_online_flag1 = data.device_online_flag1;
device_online_flag2 = data.device_online_flag2;
//更新设备在线状态
device_online_status.ins_online_state = (data.device_online_flag1 >> 0) & 0xFF; // byte0:仪表锂电在线标志位
device_online_status.dyn_online_state = (data.device_online_flag1 >> 8) & 0xFF; // byte1:动力锂电在线标志位
device_online_status.fuel_online_state = (data.device_online_flag1 >> 16) & 0xFF; // byte2:燃电锂电在线标志位
device_online_status.high_voltage_online_state = (data.device_online_flag1 >> 24) & 0xFF; // byte3:高压配电板在线标志位
device_online_status.low_voltage_online_state = (data.device_online_flag2 >> 0) & 0xFF; // byte0:低压配电板在线标志位
device_online_status.composite_online_state = (data.device_online_flag2 >> 8) & 0xFF; // byte1:复合管控主机在线标志位
device_online_status.composite_backup_online_state = (data.device_online_flag2 >> 16) & 0xFF; // byte2:复合管控备机在线标志位
// 更新锂电池其他状态
dyn_water_leak_status = data.dyn_water_leak_status;
ins_water_leak_dcdc_status = data.ins_water_leak_dcdc_status;
dyn_charge_level = data.dyn_charge_level; //01H:1级(不限)02H:2级(限功率)03H:3级(关闭)
water_leak_status_from_insbat = ( data.ins_water_leak_dcdc_status >> 4) & 0x0F; // 00 正常,01 异常漏水
water_leak_status_from_dynbat = (data.dyn_water_leak_status >> 4) & 0x0F; // 00 正常,01 异常漏水
dcdc_status_from_insbat = (data.ins_water_leak_dcdc_status) & 0x0F; // 00 正常,01 故障
// std::cout << "dyn_charge_level: " << std::hex << static_cast<int>(dyn_charge_level) << std::endl;
// std::cout << "ins_water_leak_dcdc_status: " << std::hex << static_cast<int>(ins_water_leak_dcdc_status) << std::endl;
// std::cout << "dcdc_status_from_insbat: " << std::hex << static_cast<int>(dcdc_status_from_insbat) << std::endl;
// std::cout << "water_leak_status_from_insbat: " << std::hex << static_cast<int>(water_leak_status_from_insbat) << std::endl;
// std::cout << "water_leak_status_from_dynbat: " << std::hex << static_cast<int>(water_leak_status_from_dynbat) << std::endl;
//心跳计数器
heartbeat = data.heartbeat;
}
void updateSystemData(disHighVolBusState data){
//断路器状态 (0x55 1 0xAA 0 0x5A 2)
power_bus_status.fuelCellCircuitBreaker = data.fuelCellCircuitBreaker == 0x55 ? 1 :
(data.fuelCellCircuitBreaker == 0xAA ? 0 : 2);
power_bus_status.powerLithiumBatteryCircuitBreaker = data.powerLithiumBatteryCircuitBreaker == 0x55 ? 1 :
(data.powerLithiumBatteryCircuitBreaker == 0xAA ? 0 : 2);
power_bus_status.propulsionMotorCircuitBreaker = data.propulsionMotorCircuitBreaker == 0x55 ? 1 :
(data.propulsionMotorCircuitBreaker == 0xAA ? 0 : 2);
power_bus_status.lithiumBatteryGroupInstrumentCircuitBreaker = data.lithiumBatteryGroupInstrumentCircuitBreaker == 0x55 ? 1 :
(data.lithiumBatteryGroupInstrumentCircuitBreaker == 0xAA ? 0 : 2);
power_bus_status.dcDc5ModuleCircuitBreaker = data.dcDc5ModuleCircuitBreaker == 0x55 ? 1 :
(data.dcDc5ModuleCircuitBreaker == 0xAA ? 0 : 2);
power_bus_status.bowHighVoltageDistributionBoxCircuitBreaker = data.bowHighVoltageDistributionBoxCircuitBreaker == 0x55 ? 1 :
(data.bowHighVoltageDistributionBoxCircuitBreaker == 0xAA ? 0 : 2);
power_bus_status.sternFTDevice45CircuitBreaker = data.sternFTDevice45CircuitBreaker == 0x55 ? 1 :
(data.sternFTDevice45CircuitBreaker == 0xAA ? 0 : 2);
power_bus_status.sternRudderSwitch1CircuitBreaker = data.sternRudderSwitch1CircuitBreaker == 0x55 ? 1 :
(data.sternRudderSwitch1CircuitBreaker == 0xAA ? 0 : 2);
power_bus_status.sternRudderSwitch2CircuitBreaker = data.sternRudderSwitch2CircuitBreaker == 0x55 ? 1 :
(data.sternRudderSwitch2CircuitBreaker == 0xAA ? 0 : 2);
power_bus_status.fbReservedCircuitBreaker = data.fbReservedCircuitBreaker == 0x55 ? 1 :
(data.fbReservedCircuitBreaker == 0xAA ? 0 : 2);
power_bus_status.tyzReservedCircuitBreaker = data.tyzReservedCircuitBreaker == 0x55 ? 1 :
(data.tyzReservedCircuitBreaker == 0xAA ? 0 : 2);
power_bus_status.reservedCircuitBreaker = data.reservedCircuitBreaker == 0x55 ? 1 :
(data.reservedCircuitBreaker == 0xAA ? 0 : 2);
//模块状态
power_bus_status.dcDcModuleStatus = data.dcDcFaultWord1;
power_bus_status.coolingSystemStatus = data.dcDcFaultWord2;
//绝缘状态
power_bus_status.powerBusInsulationStatus = data.powerBusInsulationStatus == 0x55 ? 0 : 1;
power_bus_status.aBusInsulationStatus = data.aBusInsulationStatus == 0x55 ? 0 : 1;
//电源状态
power_bus_status.meterPowerLossSignal = data.meterPowerLossSignal == 0x55 ? 0 : 1;
power_bus_status.emergencyPowerLossSignal = data.emergencyPowerLossSignal == 0x55 ? 0 : 1;
//温度
power_bus_status.dcDcTemperature = data.dcDcTemperature-40;
//电压电流参数
power_bus_status.powerBusVoltage = data.powerBusVoltage * 0.1;
power_bus_status.dcDc5ModuleCurrent = data.dcDc5ModuleCurrent * 0.1;
power_bus_status.powerBusCurrent = data.powerBusCurrent * 0.1;
power_bus_status.busbarAVoltage = data.busbarAVoltage * 0.1;
power_bus_status.propulsionMotorControlBoxCurrent = data.propulsionMotorControlBoxCurrent * 0.1;
power_bus_status.busbarACurrent = data.busbarACurrent * 0.1;
power_bus_status.lithiumBatteryGroupMeterCurrent = data.lithiumBatteryGroupMeterCurrent * 0.1;
power_bus_status.bowHighVoltageDistributionBoxCurrent = data.bowHighVoltageDistributionBoxCurrent * 0.1;
power_bus_status.sternFTDevice45Current = data.sternFTDevice45Current * 0.1;
power_bus_status.tyzReservedSwitchCurrent = data.tyzReservedSwitchCurrent * 0.1;
power_bus_status.sternRudderSwitch1Current = data.sternRudderSwitch1Current * 0.1;
power_bus_status.reservedCurrent1 = data.reservedCurrent1 * 0.1;
power_bus_status.sternRudderSwitch2Current = data.sternRudderSwitch2Current * 0.1;
power_bus_status.reservedCurrent2 = data.reservedCurrent2 * 0.1;
power_bus_status.fbReservedSwitchCurrent = data.fbReservedSwitchCurrent * 0.1;
power_bus_status.reservedCurrent3 = data.reservedCurrent3 * 0.1;
//冷却水压力
power_bus_status.coolWaterPressure = data.coolWaterPressure * 0.1;
};
void updateSystemData(disHighAVolBusState data){
//断路器状态 (0x55 1 0xAA 0 0x5A 2)
power_a_bus_status.bowFTDevice123CircuitBreaker = data.bowFTDevice123CircuitBreaker == 0x55 ? 1 :
(data.bowFTDevice123CircuitBreaker == 0xAA ? 0 : 2);
power_a_bus_status.actuatorCircuitBreaker = data.actuatorCircuitBreaker == 0x55 ? 1 :
(data.actuatorCircuitBreaker == 0xAA ? 0 : 2);
power_a_bus_status.mastSteeringGearControlBoxCircuitBreaker = data.mastSteeringGearControlBoxCircuitBreaker == 0x55 ? 1 :
(data.mastSteeringGearControlBoxCircuitBreaker == 0xAA ? 0 : 2);
power_a_bus_status.xczCircuitBreaker = data.xczCircuitBreaker == 0x55 ? 1 :
(data.xczCircuitBreaker == 0xAA ? 0 : 2);
power_a_bus_status.bowRudderControlBoxCircuitBreaker = data.bowRudderControlBoxCircuitBreaker == 0x55 ? 1 :
(data.bowRudderControlBoxCircuitBreaker == 0xAA ? 0 : 2);
power_a_bus_status.openWaterCoverStartCylinderCircuitBreaker = data.openWaterCoverStartCylinderCircuitBreaker == 0x55 ? 1 :
(data.openWaterCoverStartCylinderCircuitBreaker == 0xAA ? 0 : 2);
//电源状态
power_a_bus_status.instrumentPowerFailureSignal = data.instrumentPowerFailureSignal == 0x55 ? 0 : 1;
power_a_bus_status.emergencyPowerFailureSignal = data.emergencyPowerFailureSignal == 0x55 ? 0 : 1;
//浸水报警
power_a_bus_status.waterIngressionAlarm = data.waterIngressionAlarm;
//电压电流参数
power_a_bus_status.busbarBVoltage = data.busbarBVoltage * 0.1;
power_a_bus_status.busbarBCurrent = data.busbarBCurrent * 0.1;
power_a_bus_status.bowFTDevice123Current = data.bowFTDevice123Current * 0.1;
power_a_bus_status.actuatorCurrent = data.actuatorCurrent * 0.1;
power_a_bus_status.mastSteeringGearControlBoxCurrent = data.mastSteeringGearControlBoxCurrent * 0.1;
power_a_bus_status.xczCurrent = data.xczCurrent * 0.1;
power_a_bus_status.bowRudderControlBoxCurrent = data.bowRudderControlBoxCurrent * 0.1;
power_a_bus_status.openWaterCoverStartCylinderCurrent = data.openWaterCoverStartCylinderCurrent * 0.1;
};
void updateSystemData(disLowMainBusState data){
//断路器状态 (0x55 1 0xAA 0 0x5A 2)
instrument_main_bus_status.lithiumBatteryGroupInstrumentCircuitBreaker = data.lithiumBatteryGroupInstrumentCircuitBreaker == 0x55 ? 1 :
(data.lithiumBatteryGroupInstrumentCircuitBreaker == 0xAA ? 0 : 2);
instrument_main_bus_status.bowLowVoltageDistributionBoxCircuitBreaker = data.bowLowVoltageDistributionBoxCircuitBreaker == 0x55 ? 1 :
(data.bowLowVoltageDistributionBoxCircuitBreaker == 0xAA ? 0 : 2);
instrument_main_bus_status.unit4InstrumentDC48VCircuitBreaker = data.unit4InstrumentDC48VCircuitBreaker == 0x55 ? 1 :
(data.unit4InstrumentDC48VCircuitBreaker == 0xAA ? 0 : 2);
instrument_main_bus_status.dcC1DCDistributionPanelCircuitBreaker = data.dcC1DCDistributionPanelCircuitBreaker == 0x55 ? 1 :
(data.dcC1DCDistributionPanelCircuitBreaker == 0xAA ? 0 : 2);
instrument_main_bus_status.reservedCircuitBreaker1 = data.reservedCircuitBreaker1 == 0x55 ? 1 :
(data.reservedCircuitBreaker1 == 0xAA ? 0 : 2);
instrument_main_bus_status.reservedCircuitBreaker2 = data.reservedCircuitBreaker2 == 0x55 ? 1 :
(data.reservedCircuitBreaker2 == 0xAA ? 0 : 2);
instrument_main_bus_status.emergencyLithiumBatteryGroup2CircuitBreaker = data.emergencyLithiumBatteryGroup2CircuitBreaker == 0x55 ? 1 :
(data.emergencyLithiumBatteryGroup2CircuitBreaker == 0xAA ? 0 : 2);
//电源状态
instrument_main_bus_status.instrumentPowerFailureSignal = data.instrumentPowerFailureSignal == 0x55 ? 0 : 1;
instrument_main_bus_status.emergencyPowerFailureSignal = data.emergencyPowerFailureSignal == 0x55 ? 0 : 1;
//绝缘状态
instrument_main_bus_status.instrumentBusbarInsulationLow = data.instrumentBusbarInsulationLow == 0x55 ? 0 : 1;
//电压电流参数
instrument_main_bus_status.instrumentBusbarVoltage = data.instrumentBusbarVoltage * 0.1;
instrument_main_bus_status.bowLowVoltageDistributionBoxCurrent = data.bowLowVoltageDistributionBoxCurrent * 0.1;
instrument_main_bus_status.dcC1InstrumentDC48VCurrent = data.dcC1InstrumentDC48VCurrent * 0.1;
instrument_main_bus_status.reservedCurrent1 = data.reservedCurrent1 * 0.1;
instrument_main_bus_status.emergencyLithiumBatteryGroup2Current = data.emergencyLithiumBatteryGroup2Current * 0.1;
instrument_main_bus_status.lithiumBatteryGroupInstrumentCurrent = data.lithiumBatteryGroupInstrumentCurrent * 0.1;
instrument_main_bus_status.unit4InstrumentDC48VCurrent = data.unit4InstrumentDC48VCurrent * 0.1;
instrument_main_bus_status.reservedCurrent2 = data.reservedCurrent2 * 0.1;
instrument_main_bus_status.emergency2BusbarVoltage = data.emergency2BusbarVoltage * 0.1;
instrument_main_bus_status.compositeEnergyManagementSystemEmergencyDC48VCurrent = data.compositeEnergyManagementSystemEmergencyDC48VCurrent * 0.1;
instrument_main_bus_status.fuelCellSecuritySystemEmergencyDC48VCurrent = data.fuelCellSecuritySystemEmergencyDC48VCurrent * 0.1;
instrument_main_bus_status.plcControlPowerCurrent = data.plcControlPowerCurrent * 0.1;
}
void updateSystemData(disLowBusState data){
//断路器状态 (0x55 1 0xAA 0 0x5A 2)
instrument_bus_status.unit1CircuitBreaker = data.unit1CircuitBreaker == 0x55 ? 1 :
(data.unit1CircuitBreaker == 0xAA ? 0 : 2);
instrument_bus_status.unit2CircuitBreaker = data.unit2CircuitBreaker == 0x55 ? 1 :
(data.unit2CircuitBreaker == 0xAA ? 0 : 2);
instrument_bus_status.unit3CircuitBreaker = data.unit3CircuitBreaker == 0x55 ? 1 :
(data.unit3CircuitBreaker == 0xAA ? 0 : 2);
instrument_bus_status.unit5CircuitBreaker = data.unit5CircuitBreaker == 0x55 ? 1 :
(data.unit5CircuitBreaker == 0xAA ? 0 : 2);
instrument_bus_status.bowPZDeviceCircuitBreaker = data.bowPZDeviceCircuitBreaker == 0x55 ? 1 :
(data.bowPZDeviceCircuitBreaker == 0xAA ? 0 : 2);
instrument_bus_status.reservedCircuitBreaker1 = data.reservedCircuitBreaker1 == 0x55 ? 1 :
(data.reservedCircuitBreaker1 == 0xAA ? 0 : 2);
instrument_bus_status.reservedCircuitBreaker2 = data.reservedCircuitBreaker2 == 0x55 ? 1 :
(data.reservedCircuitBreaker2 == 0xAA ? 0 : 2);
instrument_bus_status.emergencyLithiumBatteryGroup1CircuitBreaker = data.emergencyLithiumBatteryGroup1CircuitBreaker == 0x55 ? 1 :
(data.emergencyLithiumBatteryGroup1CircuitBreaker == 0xAA ? 0 : 2);
//电源状态
instrument_bus_status.powerFailureSignal = data.powerFailureSignal == 0x55 ? 0 : 1;
instrument_bus_status.emergencyPowerFailureSignal = data.emergencyPowerFailureSignal == 0x55 ? 0 : 1;
//浸水报警
instrument_bus_status.waterIngressionAlarm = data.waterIngressionAlarm;
//电压电流参数
instrument_bus_status.instrumentBusbarVoltage = data.instrumentBusbarVoltage * 0.1;
instrument_bus_status.instrumentBusbarCurrent = data.instrumentBusbarCurrent * 0.1;
instrument_bus_status.unit1Current = data.unit1Current * 0.1;
instrument_bus_status.unit2Current = data.unit2Current * 0.1;
instrument_bus_status.unit3Current = data.unit3Current * 0.1;
instrument_bus_status.unit5Current = data.unit5Current * 0.1;
instrument_bus_status.bowPZDeviceCurrent = data.bowPZDeviceCurrent * 0.1;
instrument_bus_status.emergencyLithiumBatteryGroup1Current = data.emergencyLithiumBatteryGroup1Current * 0.1;
instrument_bus_status.emergency1BusbarVoltage = data.emergency1BusbarVoltage * 0.1;
}
};
#endif