From e35d808b94b012f5e080a2790f9543e52026e5f3 Mon Sep 17 00:00:00 2001
From: ahu_gq <57164135+gq-hefei@users.noreply.github.com>
Date: Wed, 16 Apr 2025 10:59:32 +0800
Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E7=94=B5=E5=8E=8B=E5=92=8C?=
=?UTF-8?q?=E6=B8=A9=E5=BA=A6?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
app/stm32fxxx_app/prj/BCU_APP.uvprojx | 14 +-
.../protocol/protocol_mqtt_bcu.c | 1714 +++++++++--------
.../protocol/protocol_mqtt_bcu.c.orig | 989 +++++++++-
.../protocol/protocol_mqtt_bcu.h | 13 +-
.../protocol/protocol_mqtt_bcu.h.orig | 14 +-
5 files changed, 1903 insertions(+), 841 deletions(-)
diff --git a/app/stm32fxxx_app/prj/BCU_APP.uvprojx b/app/stm32fxxx_app/prj/BCU_APP.uvprojx
index 5b4d825..9bcd3d5 100644
--- a/app/stm32fxxx_app/prj/BCU_APP.uvprojx
+++ b/app/stm32fxxx_app/prj/BCU_APP.uvprojx
@@ -10,15 +10,15 @@
stm32f407
0x4
ARM-ADS
- 5050106::V5.05 update 1 (build 106)::ARMCC
- 5050106::V5.05 update 1 (build 106)::ARMCC
+ 5060960::V5.06 update 7 (build 960)::.\ARMCC
+ 5060960::V5.06 update 7 (build 960)::.\ARMCC
0
STM32F407ZGTx
STMicroelectronics
- Keil.STM32F4xx_DFP.2.16.0
- http://www.keil.com/pack/
+ Keil.STM32F4xx_DFP.3.0.0
+ https://www.keil.com/pack/
IRAM(0x20000000,0x00020000) IRAM2(0x10000000,0x00010000) IROM(0x08000000,0x00100000) CPUTYPE("Cortex-M4") FPU2 CLOCK(12000000) ELITTLE
@@ -187,7 +187,6 @@
2
0
0
- 0
1
0
8
@@ -1068,8 +1067,8 @@
STM32F407VGTx
STMicroelectronics
- Keil.STM32F4xx_DFP.2.16.0
- http://www.keil.com/pack/
+ Keil.STM32F4xx_DFP.3.0.0
+ https://www.keil.com/pack/
IRAM(0x20000000,0x00020000) IRAM2(0x10000000,0x00010000) IROM(0x08000000,0x00100000) CPUTYPE("Cortex-M4") FPU2 CLOCK(12000000) ELITTLE
@@ -1238,7 +1237,6 @@
2
0
0
- 0
1
0
8
diff --git a/app/stm32fxxx_app/protocol/protocol_mqtt_bcu.c b/app/stm32fxxx_app/protocol/protocol_mqtt_bcu.c
index 6a1294d..7f6f77f 100644
--- a/app/stm32fxxx_app/protocol/protocol_mqtt_bcu.c
+++ b/app/stm32fxxx_app/protocol/protocol_mqtt_bcu.c
@@ -24,8 +24,8 @@
uint32_t bms_get_baseInfo(uint16_t input)
{
- uint32_t tmp;
- uint16_t bms_stu = 0;
+ uint32_t tmp;
+ uint16_t bms_stu = 0;
if(bms_get_run_status() == kRunStatus_Init)
{
@@ -51,777 +51,812 @@ uint32_t bms_get_baseInfo(uint16_t input)
{
bms_stu |= 0x20;
}
-
- switch(input)
- {
- case 1:
- tmp = bms_get_statistic_data(kStatisticData_TotalVolt);
- return tmp;
- case 2:
- tmp = bms_get_show_current();
- return tmp;
- case 3:
- tmp = bms_get_soc() / 100;
- return tmp;
- case 4:
- tmp = bms_get_soh() / 100;
- return tmp;
- case 5:
- tmp = bms_get_soc() / 100;
- return tmp;
- case 6:
- tmp = get_eeprom_data(kEep_RatedTotalVolt,kEepromDataType_Full);
- return tmp;
- case 7:
- tmp = get_eeprom_data(kEep_RatedCapacity,kEepromDataType_Full);
- return tmp;
- case 8:
- tmp = (uint32_t)bms_get_soc()*get_eeprom_data(kEep_RatedCapacity, kEepromDataType_Full)/10000;
- return tmp;
- case 9:
- tmp = get_eeprom_data(kEep_RatedCapacity, kEepromDataType_Full)*get_eeprom_data(kEep_RatedTotalVolt, kEepromDataType_Full)/10000;
- return tmp;
- case 10:
- tmp = (uint32_t)bms_get_soc() * get_eeprom_data(kEep_RatedCapacity, kEepromDataType_Full)/10000*get_eeprom_data(kEep_RatedTotalVolt, kEepromDataType_Full)/10000;
- return tmp;
- case 11:
- tmp = bms_get_bmu_num();
- return tmp;
- case 12:
- tmp = bms_get_bmu_online_num();
- return tmp;
- case 13:
- tmp = get_eeprom_data(kEep_CellNum, kEepromDataType_Full);
- return tmp;
- case 14:
- tmp = bms_get_statistic_data(kStatisticData_OnlineCellNum);
- return tmp;
- case 15:
- tmp = get_eeprom_data(kEep_TempNum, kEepromDataType_Full);
- return tmp;
- case 16:
- tmp = bms_get_statistic_data(kStatisticData_OnlineTempNum);
- return tmp;
- case 17:
- tmp = bms_get_sop_data(kSopData_DisCur);
- return tmp;
- case 18:
- tmp = (uint32_t)bms_get_sop_data(kSopData_DisCur)*get_eeprom_data(kEep_RatedTotalVolt, kEepromDataType_Full)/10000;
- return tmp;
- case 19:
- tmp = bms_get_sop_data(kSopData_ChgCur);
- return tmp;
- case 20:
- tmp = (uint32_t)bms_get_sop_data(kSopData_ChgCur)*get_eeprom_data(kEep_RatedTotalVolt, kEepromDataType_Full)/10000;
- return tmp;
- case 21:
- tmp = bms_get_iso_data(kIsoData_PosRes);
- return tmp;
- case 22:
- tmp = bms_get_iso_data(kIsoData_NegRes);
- return tmp;
- case 23:
- tmp = bms_get_statistic_data(kStatisticData_AvgVolt);
- return tmp;
- case 24:
- tmp = bms_get_statistic_data(kStatisticData_VoltDiff);
- return tmp;
- case 25:
- tmp = bms_get_statistic_data(kStatisticData_MaxVolt);
- return tmp;
- case 26:
- tmp = bms_get_statistic_data(kStatisticData_MaxVoltBmuIdx) + 1;
- return tmp;
- case 27:
- tmp = bms_get_statistic_data(kStatisticData_MaxVoltIdx) + 1;
- return tmp;
- case 28:
- tmp = bms_get_statistic_data(kStatisticData_MinVolt);
- return tmp;
- case 29:
- tmp = bms_get_statistic_data(kStatisticData_MinVoltBmuIdx) + 1;
- return tmp;
- case 30:
- tmp = bms_get_statistic_data(kStatisticData_MinVoltIdx) + 1;
- return tmp;
- case 31:
- tmp = bms_get_statistic_data(kStatisticData_AvgTemp);
- return tmp;
- case 32:
- tmp = bms_get_statistic_data(kStatisticData_TempDiff);
- return tmp;
- case 33:
- tmp = bms_get_statistic_data(kStatisticData_MaxTemp);
- return tmp;
- case 34:
- tmp = bms_get_statistic_data(kStatisticData_MaxTempBmuIdx) + 1;
- return tmp;
- case 35:
- tmp = bms_get_statistic_data(kStatisticData_MaxTempIdx) + 1;
- return tmp;
- case 36:
- tmp = bms_get_statistic_data(kStatisticData_MinTemp);
- return tmp;
- case 37:
- tmp = bms_get_statistic_data(kStatisticData_MinTempBmuIdx) + 1;
- return tmp;
- case 38:
- tmp = bms_get_statistic_data(kStatisticData_MinTempIdx) + 1;
- return tmp;
- case 39:
- tmp = (uint16_t)bms_get_cumulate_data(kCumulateData_DayChgCap);
- return tmp;
- case 40:
- tmp = (uint16_t)bms_get_cumulate_data(kCumulateData_DayChgEnergy);
- return tmp;
- case 41:
- tmp = (uint16_t)bms_get_cumulate_data(kCumulateData_DayDisCap);
- return tmp;
- case 42:
- tmp = (uint16_t)bms_get_cumulate_data(kCumulateData_DayDisEnergy);
- return tmp;
- case 43:
- tmp = (uint16_t)bms_get_cumulate_data(kCumulateData_DayChgTime);
- return tmp;
- case 44:
- tmp = (uint16_t)bms_get_cumulate_data(kCumulateData_DayDisTime);
- return tmp;
- case 45:
- tmp = bms_get_cumulate_data(kCumulateData_AccChgCap);
- return tmp;
- case 46:
- tmp = bms_get_cumulate_data(kCumulateData_AccChgEnergy);
- return tmp;
- case 47:
- tmp = bms_get_cumulate_data(kCumulateData_AccDisCap);
- return tmp;
- case 48:
- tmp = bms_get_cumulate_data(kCumulateData_AccDisEnergy);
- return tmp;
- case 49:
- tmp = bms_get_cumulate_data(kCumulateData_AccChgTime);
- return tmp;
- case 50:
- tmp = bms_get_cumulate_data(kCumulateData_AccDisTime);
- return tmp;
- case 51:
- tmp = bms_stu;
- return tmp;
- default:
- return 0;
- }
+
+ switch(input)
+ {
+ case 1:
+ tmp = bms_get_statistic_data(kStatisticData_TotalVolt);
+ return tmp;
+ case 2:
+ tmp = bms_get_show_current();
+ return tmp;
+ case 3:
+ tmp = bms_get_soc() / 100;
+ return tmp;
+ case 4:
+ tmp = bms_get_soh() / 100;
+ return tmp;
+ case 5:
+ tmp = bms_get_soc() / 100;
+ return tmp;
+ case 6:
+ tmp = get_eeprom_data(kEep_RatedTotalVolt,kEepromDataType_Full);
+ return tmp;
+ case 7:
+ tmp = get_eeprom_data(kEep_RatedCapacity,kEepromDataType_Full);
+ return tmp;
+ case 8:
+ tmp = (uint32_t)bms_get_soc()*get_eeprom_data(kEep_RatedCapacity, kEepromDataType_Full)/10000;
+ return tmp;
+ case 9:
+ tmp = get_eeprom_data(kEep_RatedCapacity, kEepromDataType_Full)*get_eeprom_data(kEep_RatedTotalVolt, kEepromDataType_Full)/10000;
+ return tmp;
+ case 10:
+ tmp = (uint32_t)bms_get_soc() * get_eeprom_data(kEep_RatedCapacity, kEepromDataType_Full)/10000*get_eeprom_data(kEep_RatedTotalVolt, kEepromDataType_Full)/10000;
+ return tmp;
+ case 11:
+ tmp = bms_get_bmu_num();
+ return tmp;
+ case 12:
+ tmp = bms_get_bmu_online_num();
+ return tmp;
+ case 13:
+ tmp = get_eeprom_data(kEep_CellNum, kEepromDataType_Full);
+ return tmp;
+ case 14:
+ tmp = bms_get_statistic_data(kStatisticData_OnlineCellNum);
+ return tmp;
+ case 15:
+ tmp = get_eeprom_data(kEep_TempNum, kEepromDataType_Full);
+ return tmp;
+ case 16:
+ tmp = bms_get_statistic_data(kStatisticData_OnlineTempNum);
+ return tmp;
+ case 17:
+ tmp = bms_get_sop_data(kSopData_DisCur);
+ return tmp;
+ case 18:
+ tmp = (uint32_t)bms_get_sop_data(kSopData_DisCur)*get_eeprom_data(kEep_RatedTotalVolt, kEepromDataType_Full)/10000;
+ return tmp;
+ case 19:
+ tmp = bms_get_sop_data(kSopData_ChgCur);
+ return tmp;
+ case 20:
+ tmp = (uint32_t)bms_get_sop_data(kSopData_ChgCur)*get_eeprom_data(kEep_RatedTotalVolt, kEepromDataType_Full)/10000;
+ return tmp;
+ case 21:
+ tmp = bms_get_iso_data(kIsoData_PosRes);
+ return tmp;
+ case 22:
+ tmp = bms_get_iso_data(kIsoData_NegRes);
+ return tmp;
+ case 23:
+ tmp = bms_get_statistic_data(kStatisticData_AvgVolt);
+ return tmp;
+ case 24:
+ tmp = bms_get_statistic_data(kStatisticData_VoltDiff);
+ return tmp;
+ case 25:
+ tmp = bms_get_statistic_data(kStatisticData_MaxVolt);
+ return tmp;
+ case 26:
+ tmp = bms_get_statistic_data(kStatisticData_MaxVoltBmuIdx) + 1;
+ return tmp;
+ case 27:
+ tmp = bms_get_statistic_data(kStatisticData_MaxVoltIdx) + 1;
+ return tmp;
+ case 28:
+ tmp = bms_get_statistic_data(kStatisticData_MinVolt);
+ return tmp;
+ case 29:
+ tmp = bms_get_statistic_data(kStatisticData_MinVoltBmuIdx) + 1;
+ return tmp;
+ case 30:
+ tmp = bms_get_statistic_data(kStatisticData_MinVoltIdx) + 1;
+ return tmp;
+ case 31:
+ tmp = bms_get_statistic_data(kStatisticData_AvgTemp);
+ return tmp;
+ case 32:
+ tmp = bms_get_statistic_data(kStatisticData_TempDiff);
+ return tmp;
+ case 33:
+ tmp = bms_get_statistic_data(kStatisticData_MaxTemp);
+ return tmp;
+ case 34:
+ tmp = bms_get_statistic_data(kStatisticData_MaxTempBmuIdx) + 1;
+ return tmp;
+ case 35:
+ tmp = bms_get_statistic_data(kStatisticData_MaxTempIdx) + 1;
+ return tmp;
+ case 36:
+ tmp = bms_get_statistic_data(kStatisticData_MinTemp);
+ return tmp;
+ case 37:
+ tmp = bms_get_statistic_data(kStatisticData_MinTempBmuIdx) + 1;
+ return tmp;
+ case 38:
+ tmp = bms_get_statistic_data(kStatisticData_MinTempIdx) + 1;
+ return tmp;
+ case 39:
+ tmp = (uint16_t)bms_get_cumulate_data(kCumulateData_DayChgCap);
+ return tmp;
+ case 40:
+ tmp = (uint16_t)bms_get_cumulate_data(kCumulateData_DayChgEnergy);
+ return tmp;
+ case 41:
+ tmp = (uint16_t)bms_get_cumulate_data(kCumulateData_DayDisCap);
+ return tmp;
+ case 42:
+ tmp = (uint16_t)bms_get_cumulate_data(kCumulateData_DayDisEnergy);
+ return tmp;
+ case 43:
+ tmp = (uint16_t)bms_get_cumulate_data(kCumulateData_DayChgTime);
+ return tmp;
+ case 44:
+ tmp = (uint16_t)bms_get_cumulate_data(kCumulateData_DayDisTime);
+ return tmp;
+ case 45:
+ tmp = bms_get_cumulate_data(kCumulateData_AccChgCap);
+ return tmp;
+ case 46:
+ tmp = bms_get_cumulate_data(kCumulateData_AccChgEnergy);
+ return tmp;
+ case 47:
+ tmp = bms_get_cumulate_data(kCumulateData_AccDisCap);
+ return tmp;
+ case 48:
+ tmp = bms_get_cumulate_data(kCumulateData_AccDisEnergy);
+ return tmp;
+ case 49:
+ tmp = bms_get_cumulate_data(kCumulateData_AccChgTime);
+ return tmp;
+ case 50:
+ tmp = bms_get_cumulate_data(kCumulateData_AccDisTime);
+ return tmp;
+ case 51:
+ tmp = bms_stu;
+ return tmp;
+ default:
+ return 0;
+ }
}
uint32_t bms_get_fault_level_1(uint16_t input)
{
- uint32_t tmp = 0;
-
- switch(input)
- {
- case 1:
- if (KIT_GET_BIT_32(bms_get_fault_single_bit(0 , kFaultLevel_First), 2)) //一级单体过压
- {
- tmp = 1;
- }
- else
- {
- tmp = 0;
- }
- return tmp;
- case 2:
- if (KIT_GET_BIT_32(bms_get_fault_single_bit(0 , kFaultLevel_First), 3)) //一级单体欠压
- {
- tmp = 1;
- }
- else
- {
- tmp = 0;
- }
- return tmp;
- case 3:
- if (KIT_GET_BIT_32(bms_get_fault_single_bit(0 , kFaultLevel_First), 4)) //一级单体过温
- {
- tmp = 1;
- }
- else
- {
- tmp = 0;
- }
- return tmp;
- case 4:
- if (KIT_GET_BIT_32(bms_get_fault_single_bit(0 , kFaultLevel_First), 5)) //一级单体低温
- {
- tmp = 1;
- }
- else
- {
- tmp = 0;
- }
- return tmp;
- case 5:
- if (KIT_GET_BIT_32(bms_get_fault_single_bit(0 , kFaultLevel_First), 6)) //一级单体压差
- {
- tmp = 1;
- }
- else
- {
- tmp = 0;
- }
- return tmp;
- case 6:
- if (bms_get_run_status() == kRunStatus_Chg)
- {
- if (KIT_GET_BIT_32(bms_get_fault_single_bit(0 , kFaultLevel_First), 8)) //一级充电电流过大
- {
- tmp = 1;
- }
- else
- {
- tmp = 0;
- }
- }
- return tmp;
- case 7:
- if (bms_get_run_status() == kRunStatus_Dis)
- {
- if (KIT_GET_BIT_32(bms_get_fault_single_bit(0 , kFaultLevel_First), 8)) //一级放电电流过大
- {
- tmp = 1;
- }
- else
- {
- tmp = 0;
- }
- }
- return tmp;
- case 8:
- if (KIT_GET_BIT_32(bms_get_fault_single_bit(0 , kFaultLevel_First), 14)) //一级SOC过低
- {
- tmp = 1;
- }
- else
- {
- tmp = 0;
- }
- return tmp;
- case 9:
- tmp = 0; //一级SOC差异过大
- return tmp;
- case 10:
- if (KIT_GET_BIT_32(bms_get_fault_single_bit(0 , kFaultLevel_First), 15)) //一级绝缘过低
- {
- tmp = 1;
- }
- else
- {
- tmp = 0;
- }
- return tmp;
- case 11:
- if (KIT_GET_BIT_32(bms_get_fault_single_bit(0 , kFaultLevel_First), 0)) //一级总压过压--组端过压
- {
- tmp = 1;
- }
- else
- {
- tmp = 0;
- }
- return tmp;
- case 12:
- if (KIT_GET_BIT_32(bms_get_fault_single_bit(0 , kFaultLevel_First), 1)) //一级总压欠压--组端欠压
- {
- tmp = 1;
- }
- else
- {
- tmp = 0;
- }
- case 13:
- if (KIT_GET_BIT_32(bms_get_fault_single_bit(1 , kFaultLevel_First), 12)) //1级极柱过温
- {
- tmp = 1;
- }
- else
- {
- tmp = 0;
- }
- return tmp;
- case 14:
- if (KIT_GET_BIT_32(bms_get_fault_single_bit(0 , kFaultLevel_First), 9)) //高压异常
- {
- tmp = 1;
- }
- else
- {
- tmp = 0;
- }
- return tmp;
- case 15:
- tmp = get_eeprom_data(kEep_TempNum, kEepromDataType_Full);
- return tmp;
- case 16:
- tmp = bms_get_statistic_data(kStatisticData_OnlineTempNum);
- break;
- default:
- return 0;
- }
+ uint32_t tmp = 0;
+
+ switch(input)
+ {
+ case 1:
+ if (KIT_GET_BIT_32(bms_get_fault_single_bit(0, kFaultLevel_First), 2)) //一级单体过压
+ {
+ tmp = 1;
+ }
+ else
+ {
+ tmp = 0;
+ }
+ return tmp;
+ case 2:
+ if (KIT_GET_BIT_32(bms_get_fault_single_bit(0, kFaultLevel_First), 3)) //一级单体欠压
+ {
+ tmp = 1;
+ }
+ else
+ {
+ tmp = 0;
+ }
+ return tmp;
+ case 3:
+ if (KIT_GET_BIT_32(bms_get_fault_single_bit(0, kFaultLevel_First), 4)) //一级单体过温
+ {
+ tmp = 1;
+ }
+ else
+ {
+ tmp = 0;
+ }
+ return tmp;
+ case 4:
+ if (KIT_GET_BIT_32(bms_get_fault_single_bit(0, kFaultLevel_First), 5)) //一级单体低温
+ {
+ tmp = 1;
+ }
+ else
+ {
+ tmp = 0;
+ }
+ return tmp;
+ case 5:
+ if (KIT_GET_BIT_32(bms_get_fault_single_bit(0, kFaultLevel_First), 6)) //一级单体压差
+ {
+ tmp = 1;
+ }
+ else
+ {
+ tmp = 0;
+ }
+ return tmp;
+ case 6:
+ if (bms_get_run_status() == kRunStatus_Chg)
+ {
+ if (KIT_GET_BIT_32(bms_get_fault_single_bit(0, kFaultLevel_First), 8)) //一级充电电流过大
+ {
+ tmp = 1;
+ }
+ else
+ {
+ tmp = 0;
+ }
+ }
+ return tmp;
+ case 7:
+ if (bms_get_run_status() == kRunStatus_Dis)
+ {
+ if (KIT_GET_BIT_32(bms_get_fault_single_bit(0, kFaultLevel_First), 8)) //一级放电电流过大
+ {
+ tmp = 1;
+ }
+ else
+ {
+ tmp = 0;
+ }
+ }
+ return tmp;
+ case 8:
+ if (KIT_GET_BIT_32(bms_get_fault_single_bit(0, kFaultLevel_First), 14)) //一级SOC过低
+ {
+ tmp = 1;
+ }
+ else
+ {
+ tmp = 0;
+ }
+ return tmp;
+ case 9:
+ tmp = 0; //一级SOC差异过大
+ return tmp;
+ case 10:
+ if (KIT_GET_BIT_32(bms_get_fault_single_bit(0, kFaultLevel_First), 15)) //一级绝缘过低
+ {
+ tmp = 1;
+ }
+ else
+ {
+ tmp = 0;
+ }
+ return tmp;
+ case 11:
+ if (KIT_GET_BIT_32(bms_get_fault_single_bit(0, kFaultLevel_First), 0)) //一级总压过压--组端过压
+ {
+ tmp = 1;
+ }
+ else
+ {
+ tmp = 0;
+ }
+ return tmp;
+ case 12:
+ if (KIT_GET_BIT_32(bms_get_fault_single_bit(0, kFaultLevel_First), 1)) //一级总压欠压--组端欠压
+ {
+ tmp = 1;
+ }
+ else
+ {
+ tmp = 0;
+ }
+ case 13:
+ if (KIT_GET_BIT_32(bms_get_fault_single_bit(1, kFaultLevel_First), 12)) //1级极柱过温
+ {
+ tmp = 1;
+ }
+ else
+ {
+ tmp = 0;
+ }
+ return tmp;
+ case 14:
+ if (KIT_GET_BIT_32(bms_get_fault_single_bit(0, kFaultLevel_First), 9)) //高压异常
+ {
+ tmp = 1;
+ }
+ else
+ {
+ tmp = 0;
+ }
+ return tmp;
+ case 15:
+ tmp = get_eeprom_data(kEep_TempNum, kEepromDataType_Full);
+ return tmp;
+ case 16:
+ tmp = bms_get_statistic_data(kStatisticData_OnlineTempNum);
+ break;
+ default:
+ return 0;
+ }
}
uint32_t bms_get_fault_level_2(uint16_t input)
{
- uint32_t tmp = 0;
-
- switch(input)
- {
- case 1:
- if (KIT_GET_BIT_32(bms_get_fault_single_bit(0 , kFaultLevel_Second), 2)) //2级单体过压
- {
- tmp = 1;
- }
- else
- {
- tmp = 0;
- }
- return tmp;
- case 2:
- if (KIT_GET_BIT_32(bms_get_fault_single_bit(0 , kFaultLevel_Second), 3)) //2级单体欠压
- {
- tmp = 1;
- }
- else
- {
- tmp = 0;
- }
- return tmp;
- case 3:
- if (KIT_GET_BIT_32(bms_get_fault_single_bit(0 , kFaultLevel_Second), 4)) //2级单体过温
- {
- tmp = 1;
- }
- else
- {
- tmp = 0;
- }
- return tmp;
- case 4:
- if (KIT_GET_BIT_32(bms_get_fault_single_bit(0 , kFaultLevel_Second), 5)) //2级单体低温
- {
- tmp = 1;
- }
- else
- {
- tmp = 0;
- }
- return tmp;
- case 5:
- if (KIT_GET_BIT_32(bms_get_fault_single_bit(0 , kFaultLevel_Second), 6)) //2级单体压差
- {
- tmp = 1;
- }
- else
- {
- tmp = 0;
- }
- return tmp;
- case 6:
- if (bms_get_run_status() == kRunStatus_Chg)
- {
- if (KIT_GET_BIT_32(bms_get_fault_single_bit(0 , kFaultLevel_Second), 8)) //2级充电电流过大
- {
- tmp = 1;
- }
- else
- {
- tmp = 0;
- }
- }
- return tmp;
- case 7:
- if (bms_get_run_status() == kRunStatus_Dis)
- {
- if (KIT_GET_BIT_32(bms_get_fault_single_bit(0 , kFaultLevel_Second), 8)) //2级放电电流过大
- {
- tmp = 1;
- }
- else
- {
- tmp = 0;
- }
- }
- return tmp;
- case 8:
- if (KIT_GET_BIT_32(bms_get_fault_single_bit(0 , kFaultLevel_Second), 14)) //2级SOC过低
- {
- tmp = 1;
- }
- else
- {
- tmp = 0;
- }
- return tmp;
- case 9:
- tmp = 0; //一级SOC差异过大
- return tmp;
- case 10:
- if (KIT_GET_BIT_32(bms_get_fault_single_bit(0 , kFaultLevel_Second), 15)) //2级绝缘过低
- {
- tmp = 1;
- }
- else
- {
- tmp = 0;
- }
- return tmp;
- case 11:
- if (KIT_GET_BIT_32(bms_get_fault_single_bit(0 , kFaultLevel_Second), 0)) //2级总压过压--组端过压
- {
- tmp = 1;
- }
- else
- {
- tmp = 0;
- }
- return tmp;
- case 12:
- if (KIT_GET_BIT_32(bms_get_fault_single_bit(0 , kFaultLevel_Second), 1)) //2级总压欠压--组端欠压
- {
- tmp = 1;
- }
- else
- {
- tmp = 0;
- }
- case 13:
- if (KIT_GET_BIT_32(bms_get_fault_single_bit(1 , kFaultLevel_Second), 12)) //2级极柱过温
- {
- tmp = 1;
- }
- else
- {
- tmp = 0;
- }
- return tmp;
- case 14:
- tmp = bms_get_statistic_data(kStatisticData_OnlineCellNum);
- return tmp;
- case 15:
- tmp = get_eeprom_data(kEep_TempNum, kEepromDataType_Full);
- return tmp;
- case 16:
- tmp = bms_get_statistic_data(kStatisticData_OnlineTempNum);
- break;
- default:
- return 0;
- }
+ uint32_t tmp = 0;
+
+ switch(input)
+ {
+ case 1:
+ if (KIT_GET_BIT_32(bms_get_fault_single_bit(0, kFaultLevel_Second), 2)) //2级单体过压
+ {
+ tmp = 1;
+ }
+ else
+ {
+ tmp = 0;
+ }
+ return tmp;
+ case 2:
+ if (KIT_GET_BIT_32(bms_get_fault_single_bit(0, kFaultLevel_Second), 3)) //2级单体欠压
+ {
+ tmp = 1;
+ }
+ else
+ {
+ tmp = 0;
+ }
+ return tmp;
+ case 3:
+ if (KIT_GET_BIT_32(bms_get_fault_single_bit(0, kFaultLevel_Second), 4)) //2级单体过温
+ {
+ tmp = 1;
+ }
+ else
+ {
+ tmp = 0;
+ }
+ return tmp;
+ case 4:
+ if (KIT_GET_BIT_32(bms_get_fault_single_bit(0, kFaultLevel_Second), 5)) //2级单体低温
+ {
+ tmp = 1;
+ }
+ else
+ {
+ tmp = 0;
+ }
+ return tmp;
+ case 5:
+ if (KIT_GET_BIT_32(bms_get_fault_single_bit(0, kFaultLevel_Second), 6)) //2级单体压差
+ {
+ tmp = 1;
+ }
+ else
+ {
+ tmp = 0;
+ }
+ return tmp;
+ case 6:
+ if (bms_get_run_status() == kRunStatus_Chg)
+ {
+ if (KIT_GET_BIT_32(bms_get_fault_single_bit(0, kFaultLevel_Second), 8)) //2级充电电流过大
+ {
+ tmp = 1;
+ }
+ else
+ {
+ tmp = 0;
+ }
+ }
+ return tmp;
+ case 7:
+ if (bms_get_run_status() == kRunStatus_Dis)
+ {
+ if (KIT_GET_BIT_32(bms_get_fault_single_bit(0, kFaultLevel_Second), 8)) //2级放电电流过大
+ {
+ tmp = 1;
+ }
+ else
+ {
+ tmp = 0;
+ }
+ }
+ return tmp;
+ case 8:
+ if (KIT_GET_BIT_32(bms_get_fault_single_bit(0, kFaultLevel_Second), 14)) //2级SOC过低
+ {
+ tmp = 1;
+ }
+ else
+ {
+ tmp = 0;
+ }
+ return tmp;
+ case 9:
+ tmp = 0; //一级SOC差异过大
+ return tmp;
+ case 10:
+ if (KIT_GET_BIT_32(bms_get_fault_single_bit(0, kFaultLevel_Second), 15)) //2级绝缘过低
+ {
+ tmp = 1;
+ }
+ else
+ {
+ tmp = 0;
+ }
+ return tmp;
+ case 11:
+ if (KIT_GET_BIT_32(bms_get_fault_single_bit(0, kFaultLevel_Second), 0)) //2级总压过压--组端过压
+ {
+ tmp = 1;
+ }
+ else
+ {
+ tmp = 0;
+ }
+ return tmp;
+ case 12:
+ if (KIT_GET_BIT_32(bms_get_fault_single_bit(0, kFaultLevel_Second), 1)) //2级总压欠压--组端欠压
+ {
+ tmp = 1;
+ }
+ else
+ {
+ tmp = 0;
+ }
+ case 13:
+ if (KIT_GET_BIT_32(bms_get_fault_single_bit(1, kFaultLevel_Second), 12)) //2级极柱过温
+ {
+ tmp = 1;
+ }
+ else
+ {
+ tmp = 0;
+ }
+ return tmp;
+ case 14:
+ tmp = bms_get_statistic_data(kStatisticData_OnlineCellNum);
+ return tmp;
+ case 15:
+ tmp = get_eeprom_data(kEep_TempNum, kEepromDataType_Full);
+ return tmp;
+ case 16:
+ tmp = bms_get_statistic_data(kStatisticData_OnlineTempNum);
+ break;
+ default:
+ return 0;
+ }
}
uint32_t bms_get_fault_level_3(uint16_t input)
{
- uint32_t tmp = 0;
-
- switch(input)
- {
- case 1:
- if (KIT_GET_BIT_32(bms_get_fault_single_bit(0 , kFaultLevel_Third), 2)) //3级单体过压
- {
- tmp = 1;
- }
- else
- {
- tmp = 0;
- }
- return tmp;
- case 2:
- if (KIT_GET_BIT_32(bms_get_fault_single_bit(0 , kFaultLevel_Third), 3)) //3级单体欠压
- {
- tmp = 1;
- }
- else
- {
- tmp = 0;
- }
- return tmp;
- case 3:
- if (KIT_GET_BIT_32(bms_get_fault_single_bit(0 , kFaultLevel_Third), 4)) //3级单体过温
- {
- tmp = 1;
- }
- else
- {
- tmp = 0;
- }
- return tmp;
- case 4:
- if (KIT_GET_BIT_32(bms_get_fault_single_bit(0 , kFaultLevel_Third), 5)) //3级单体低温
- {
- tmp = 1;
- }
- else
- {
- tmp = 0;
- }
- return tmp;
- case 5:
- if (KIT_GET_BIT_32(bms_get_fault_single_bit(0 , kFaultLevel_Third), 6)) //3级单体压差
- {
- tmp = 1;
- }
- else
- {
- tmp = 0;
- }
- return tmp;
- case 6:
- if (bms_get_run_status() == kRunStatus_Chg)
- {
- if (KIT_GET_BIT_32(bms_get_fault_single_bit(0 , kFaultLevel_Third), 8)) //3级充电电流过大
- {
- tmp = 1;
- }
- else
- {
- tmp = 0;
- }
- }
- return tmp;
- case 7:
- if (bms_get_run_status() == kRunStatus_Dis)
- {
- if (KIT_GET_BIT_32(bms_get_fault_single_bit(0 , kFaultLevel_Third), 8)) //3级放电电流过大
- {
- tmp = 1;
- }
- else
- {
- tmp = 0;
- }
- }
- return tmp;
- case 8:
- if (KIT_GET_BIT_32(bms_get_fault_single_bit(0 , kFaultLevel_Third), 14)) //3级SOC过低
- {
- tmp = 1;
- }
- else
- {
- tmp = 0;
- }
- return tmp;
- case 9:
- tmp = 0; //一级SOC差异过大
- return tmp;
- case 10:
- if (KIT_GET_BIT_32(bms_get_fault_single_bit(0 , kFaultLevel_Third), 15)) //3级绝缘过低
- {
- tmp = 1;
- }
- else
- {
- tmp = 0;
- }
- return tmp;
- case 11:
- if (KIT_GET_BIT_32(bms_get_fault_single_bit(0 , kFaultLevel_Third), 0)) //3级总压过压--组端过压
- {
- tmp = 1;
- }
- else
- {
- tmp = 0;
- }
- return tmp;
- case 12:
- if (KIT_GET_BIT_32(bms_get_fault_single_bit(0 , kFaultLevel_Third), 1)) //3级总压欠压--组端欠压
- {
- tmp = 1;
- }
- else
- {
- tmp = 0;
- }
- case 13:
- if (KIT_GET_BIT_32(bms_get_fault_single_bit(1 , kFaultLevel_Third), 12)) //3级极柱过温
- {
- tmp = 1;
- }
- else
- {
- tmp = 0;
- }
- return tmp;
- case 14:
- if (KIT_GET_BIT_32(bms_get_fault_single_bit(1 , kFaultLevel_Third), 0)) //继电器粘连
- {
- tmp = 1;
- }
- else
- {
- tmp = 0;
- }
- case 15:
- if (KIT_GET_BIT_32(bms_get_fault_single_bit(2 , kFaultLevel_Third), 9)) //极限故障
- {
- tmp = 1;
- }
- else
- {
- tmp = 0;
- }
- case 16:
- if (KIT_GET_BIT_32(bms_get_fault_single_bit(1 , kFaultLevel_Third), 1)) //预充故障
- {
- tmp = 1;
- }
- else
- {
- tmp = 0;
- }
- case 17:
- if (KIT_GET_BIT_32(bms_get_fault_single_bit(2 , kFaultLevel_Third), 10)) //开路故障
- {
- tmp = 1;
- }
- else
- {
- tmp = 0;
- }
- default:
- return 0;
- }
+ uint32_t tmp = 0;
+
+ switch(input)
+ {
+ case 1:
+ if (KIT_GET_BIT_32(bms_get_fault_single_bit(0, kFaultLevel_Third), 2)) //3级单体过压
+ {
+ tmp = 1;
+ }
+ else
+ {
+ tmp = 0;
+ }
+ return tmp;
+ case 2:
+ if (KIT_GET_BIT_32(bms_get_fault_single_bit(0, kFaultLevel_Third), 3)) //3级单体欠压
+ {
+ tmp = 1;
+ }
+ else
+ {
+ tmp = 0;
+ }
+ return tmp;
+ case 3:
+ if (KIT_GET_BIT_32(bms_get_fault_single_bit(0, kFaultLevel_Third), 4)) //3级单体过温
+ {
+ tmp = 1;
+ }
+ else
+ {
+ tmp = 0;
+ }
+ return tmp;
+ case 4:
+ if (KIT_GET_BIT_32(bms_get_fault_single_bit(0, kFaultLevel_Third), 5)) //3级单体低温
+ {
+ tmp = 1;
+ }
+ else
+ {
+ tmp = 0;
+ }
+ return tmp;
+ case 5:
+ if (KIT_GET_BIT_32(bms_get_fault_single_bit(0, kFaultLevel_Third), 6)) //3级单体压差
+ {
+ tmp = 1;
+ }
+ else
+ {
+ tmp = 0;
+ }
+ return tmp;
+ case 6:
+ if (bms_get_run_status() == kRunStatus_Chg)
+ {
+ if (KIT_GET_BIT_32(bms_get_fault_single_bit(0, kFaultLevel_Third), 8)) //3级充电电流过大
+ {
+ tmp = 1;
+ }
+ else
+ {
+ tmp = 0;
+ }
+ }
+ return tmp;
+ case 7:
+ if (bms_get_run_status() == kRunStatus_Dis)
+ {
+ if (KIT_GET_BIT_32(bms_get_fault_single_bit(0, kFaultLevel_Third), 8)) //3级放电电流过大
+ {
+ tmp = 1;
+ }
+ else
+ {
+ tmp = 0;
+ }
+ }
+ return tmp;
+ case 8:
+ if (KIT_GET_BIT_32(bms_get_fault_single_bit(0, kFaultLevel_Third), 14)) //3级SOC过低
+ {
+ tmp = 1;
+ }
+ else
+ {
+ tmp = 0;
+ }
+ return tmp;
+ case 9:
+ tmp = 0; //一级SOC差异过大
+ return tmp;
+ case 10:
+ if (KIT_GET_BIT_32(bms_get_fault_single_bit(0, kFaultLevel_Third), 15)) //3级绝缘过低
+ {
+ tmp = 1;
+ }
+ else
+ {
+ tmp = 0;
+ }
+ return tmp;
+ case 11:
+ if (KIT_GET_BIT_32(bms_get_fault_single_bit(0, kFaultLevel_Third), 0)) //3级总压过压--组端过压
+ {
+ tmp = 1;
+ }
+ else
+ {
+ tmp = 0;
+ }
+ return tmp;
+ case 12:
+ if (KIT_GET_BIT_32(bms_get_fault_single_bit(0, kFaultLevel_Third), 1)) //3级总压欠压--组端欠压
+ {
+ tmp = 1;
+ }
+ else
+ {
+ tmp = 0;
+ }
+ case 13:
+ if (KIT_GET_BIT_32(bms_get_fault_single_bit(1, kFaultLevel_Third), 12)) //3级极柱过温
+ {
+ tmp = 1;
+ }
+ else
+ {
+ tmp = 0;
+ }
+ return tmp;
+ case 14:
+ if (KIT_GET_BIT_32(bms_get_fault_single_bit(1, kFaultLevel_Third), 0)) //继电器粘连
+ {
+ tmp = 1;
+ }
+ else
+ {
+ tmp = 0;
+ }
+ case 15:
+ if (KIT_GET_BIT_32(bms_get_fault_single_bit(2, kFaultLevel_Third), 9)) //极限故障
+ {
+ tmp = 1;
+ }
+ else
+ {
+ tmp = 0;
+ }
+ case 16:
+ if (KIT_GET_BIT_32(bms_get_fault_single_bit(1, kFaultLevel_Third), 1)) //预充故障
+ {
+ tmp = 1;
+ }
+ else
+ {
+ tmp = 0;
+ }
+ case 17:
+ if (KIT_GET_BIT_32(bms_get_fault_single_bit(2, kFaultLevel_Third), 10)) //开路故障
+ {
+ tmp = 1;
+ }
+ else
+ {
+ tmp = 0;
+ }
+ default:
+ return 0;
+ }
}
//把这个请按照数据模型填充完毕
const devPointMap bms_points[] = {
- {"BCU_2", 0, 0, bms_get_total_alarm}, // 总告警
- {"BCU_3", 0, 0, bms_get_total_fault}, // 总故障
- {"BCU_4", 0, 1, bms_get_fault_level_1}, // 单体过压告警一级
- {"BCU_5", 0, 2, bms_get_fault_level_1}, // 单体欠压告警一级
- {"BCU_6", 0, 3, bms_get_fault_level_1}, // 单体过温告警一级
- {"BCU_7", 0, 4, bms_get_fault_level_1}, // 单体低温告警一级
- {"BCU_8", 0, 5, bms_get_fault_level_1}, // 单体压差告警一级
- {"BCU_9", 0, 6, bms_get_fault_level_1}, // 充电过流告警一级
- {"BCU_10", 0, 7, bms_get_fault_level_1}, // 放电过流告警一级
- {"BCU_11", 0, 8, bms_get_fault_level_1}, // SOC过低告警一级
- {"BCU_12", 0, 9, bms_get_fault_level_1}, // SOC差异过大告警一级
- {"BCU_13", 0, 10, bms_get_fault_level_1}, // 绝缘过低告警一级
-
- {"BCU_14", 0, 1, bms_get_fault_level_2}, // 单体过压告警二级
- {"BCU_15", 0, 2, bms_get_fault_level_2}, // 单体欠压告警二级
- {"BCU_16", 0, 3, bms_get_fault_level_2}, // 单体过温告警二级
- {"BCU_17", 0, 4, bms_get_fault_level_2}, // 单体低温告警二级
- {"BCU_18", 0, 5, bms_get_fault_level_2}, // 单体压差告警二级
- {"BCU_19", 0, 6, bms_get_fault_level_2}, // 充电过流告警二级
- {"BCU_20", 0, 7, bms_get_fault_level_2}, // 放电过流告警二级
- {"BCU_21", 0, 8, bms_get_fault_level_2}, // SOC过低告警二级
- {"BCU_22", 0, 9, bms_get_fault_level_2}, // SOC差异过大告警二级
- {"BCU_23", 0, 10, bms_get_fault_level_2}, // 绝缘过低告警二级
-
- {"BCU_24", 0, 1, bms_get_fault_level_3}, // 单体过压告警三级
- {"BCU_25", 0, 2, bms_get_fault_level_3}, // 单体欠压告警三级
- {"BCU_26", 0, 3, bms_get_fault_level_3}, // 单体过温告警三级
- {"BCU_27", 0, 4, bms_get_fault_level_3}, // 单体低温告警三级
- {"BCU_28", 0, 5, bms_get_fault_level_3}, // 单体压差告警三级
- {"BCU_29", 0, 6, bms_get_fault_level_3}, // 充电过流告警三级
- {"BCU_30", 0, 7, bms_get_fault_level_3}, // 放电过流告警三级
- {"BCU_31", 0, 8, bms_get_fault_level_3}, // SOC过低告警三级
- {"BCU_32", 0, 9, bms_get_fault_level_3}, // SOC差异过大告警三级
- {"BCU_33", 0, 10, bms_get_fault_level_3}, // 绝缘过低告警三级
-
- {"BCU_34", 0, 0, NULL}, // 电芯温度极限告警
- {"BCU_35", 0, 0, NULL}, // 电芯电压极限告警
- {"BCU_36", 0, 0, NULL}, // 簇间环流1级告警
- {"BCU_37", 0, 0, NULL}, // 簇间环流2级告警
- {"BCU_38", 0, 0, NULL}, // 簇间环流3级告警
- {"BCU_39", 0, 0, NULL}, // 簇间电流差1级告警
- {"BCU_40", 0, 0, NULL}, // 簇间电流差2级告警
- {"BCU_41", 0, 0, NULL}, // 簇间电流差3级告警
-
- {"BCU_42", 1, 11, bms_get_fault_level_1}, // 组端过压1级告警
- {"BCU_43", 1, 11, bms_get_fault_level_2}, // 组端过压2级告警
- {"BCU_44", 1, 11, bms_get_fault_level_3}, // 组端过压3级告警
- {"BCU_45", 1, 12, bms_get_fault_level_1}, // 组端欠压1级告警
- {"BCU_46", 1, 12, bms_get_fault_level_2}, // 组端欠压2级告警
- {"BCU_47", 1, 12, bms_get_fault_level_3}, // 组端欠压3级告警
- {"BCU_48", 1, 13, bms_get_fault_level_1}, // 极柱过温1级告警
- {"BCU_49", 1, 13, bms_get_fault_level_2}, // 极柱过温2级告警
- {"BCU_50", 1, 13, bms_get_fault_level_3}, // 极柱过温3级告警
-
- {"BCU_51", 1, 0, NULL}, // AFE温感排线异常
- {"BCU_52", 1, 0, NULL}, // AFE电压排线异常
- {"BCU_53", 1, 0, NULL}, // 与电池簇通信告警
- {"BCU_54", 1, 0, NULL}, // 主从通讯告警
- {"BCU_55", 1, 14, bms_get_fault_level_3}, // 继电器粘连告警
- {"BCU_56", 1, 15, bms_get_fault_level_3}, // 电池极限故障
- {"BCU_57", 1, 0, NULL}, // 熔丝故障
- {"BCU_58", 1, 0, NULL}, // 断路器故障
- {"BCU_59", 1, 0, NULL}, // 空调故障
- {"BCU_60", 1, 0, NULL}, // 消防设备故障
- {"BCU_61", 1, 0, NULL}, // 消防火警
- {"BCU_62", 1, 0, NULL}, // 消防喷洒
- {"BCU_63", 1, 0, NULL}, // AFE故障
- {"BCU_64", 1, 14, bms_get_fault_level_1}, // 高压异常
- {"BCU_65", 1, 16, bms_get_fault_level_3}, // 预充告警
- {"BCU_66", 1, 17, bms_get_fault_level_3}, // 开路故障
-
- {"BCU_67", 1, 1, bms_get_baseInfo}, // 总压
- {"BCU_68", 1, 2, bms_get_baseInfo}, // 总电流
- {"BCU_69", 1, 3, bms_get_baseInfo}, // SOC
- {"BCU_70", 1, 4, bms_get_baseInfo}, // SOH
- {"BCU_71", 1, 5, bms_get_baseInfo}, // SOE
- {"BCU_72", 1, 6, bms_get_baseInfo}, // 额定总压
- {"BCU_73", 1, 7, bms_get_baseInfo}, // 额定容量
- {"BCU_74", 1, 8, bms_get_baseInfo}, // 剩余容量
- {"BCU_75", 1, 9, bms_get_baseInfo}, // 额定电量
- {"BCU_76", 1, 10, bms_get_baseInfo}, // 剩余电量
- {"BCU_77", 1, 11, bms_get_baseInfo}, // 从机总数(BMU)
- {"BCU_78", 1, 12, bms_get_baseInfo}, // 在线从机总数(BMU)
- {"BCU_79", 1, 13, bms_get_baseInfo}, // 电池总数
- {"BCU_80", 1, 14, bms_get_baseInfo}, // 在线电池总数
- {"BCU_81", 1, 15, bms_get_baseInfo}, // 温感总数
-
- {"BCU_82", 2, 16, bms_get_baseInfo}, // 在线温感总数
- {"BCU_83", 2, 17, bms_get_baseInfo}, // 最大允许放电电流
- {"BCU_84", 2, 18, bms_get_baseInfo}, // 最大允许放电功率
- {"BCU_85", 2, 19, bms_get_baseInfo}, // 最大允许充电电流
- {"BCU_86", 2, 20, bms_get_baseInfo}, // 最大允许充电功率
- {"BCU_87", 2, 21, bms_get_baseInfo}, // 正极绝缘阻值
- {"BCU_88", 2, 22, bms_get_baseInfo}, // 负极绝缘阻值
- {"BCU_89", 2, 23, bms_get_baseInfo}, // 单体平均电压
- {"BCU_90", 2, 24, bms_get_baseInfo}, // 单体最大压差
- {"BCU_91", 2, 25, bms_get_baseInfo}, // 最高单体电压
- {"BCU_92", 2, 26, bms_get_baseInfo}, // 最高单体电压从机号
- {"BCU_93", 2, 27, bms_get_baseInfo}, // 最高单体电压编号
- {"BCU_94", 2, 28, bms_get_baseInfo}, // 最低单体电压
- {"BCU_95", 2, 29, bms_get_baseInfo}, // 最低单体电压从机号
- {"BCU_96", 2, 30, bms_get_baseInfo}, // 最低单体电压编号
- {"BCU_97", 2, 31, bms_get_baseInfo}, // 单体平均温度
- {"BCU_98", 2, 32, bms_get_baseInfo}, // 最大温差
- {"BCU_99", 2, 33, bms_get_baseInfo}, // 最高单体温度
- {"BCU_100", 2, 34, bms_get_baseInfo}, // 最高单体温度从机号
- {"BCU_101", 2, 35, bms_get_baseInfo}, // 最高单体温度编号
- {"BCU_102", 2, 36, bms_get_baseInfo}, // 最低单体温度
- {"BCU_103", 2, 37, bms_get_baseInfo}, // 最低单体温度从机号
- {"BCU_104", 2, 38, bms_get_baseInfo}, // 最低单体温度编号
- {"BCU_105", 2, 39, bms_get_baseInfo}, // 日充电容量
- {"BCU_106", 2, 40, bms_get_baseInfo}, // 日充电电量
- {"BCU_107", 2, 41, bms_get_baseInfo}, // 日放电容量
- {"BCU_108", 2, 42, bms_get_baseInfo}, // 日放电电量
- {"BCU_109", 2, 43, bms_get_baseInfo}, // 日充电时间
- {"BCU_110", 2, 44, bms_get_baseInfo}, // 日放电时间
- {"BCU_111", 2, 45, bms_get_baseInfo}, // 累计充电容量
- {"BCU_112", 2, 46, bms_get_baseInfo}, // 累计充电电量
- {"BCU_113", 2, 47, bms_get_baseInfo}, // 累计放电容量
- {"BCU_114", 2, 48, bms_get_baseInfo}, // 累计放电电量
- {"BCU_115", 2, 49, bms_get_baseInfo}, // 累计充电时间
- {"BCU_116", 2, 50, bms_get_baseInfo}, // 累计放电时间
- {"BCU_117", 2, 51, bms_get_baseInfo}, // BCU工作状态
+ {"BCU_2", 0, 0, bms_get_total_alarm}, // 总告警
+ {"BCU_3", 0, 0, bms_get_total_fault}, // 总故障
+ {"BCU_4", 0, 1, bms_get_fault_level_1}, // 单体过压告警一级
+ {"BCU_5", 0, 2, bms_get_fault_level_1}, // 单体欠压告警一级
+ {"BCU_6", 0, 3, bms_get_fault_level_1}, // 单体过温告警一级
+ {"BCU_7", 0, 4, bms_get_fault_level_1}, // 单体低温告警一级
+ {"BCU_8", 0, 5, bms_get_fault_level_1}, // 单体压差告警一级
+ {"BCU_9", 0, 6, bms_get_fault_level_1}, // 充电过流告警一级
+ {"BCU_10", 0, 7, bms_get_fault_level_1}, // 放电过流告警一级
+ {"BCU_11", 0, 8, bms_get_fault_level_1}, // SOC过低告警一级
+ {"BCU_12", 0, 9, bms_get_fault_level_1}, // SOC差异过大告警一级
+ {"BCU_13", 0, 10, bms_get_fault_level_1}, // 绝缘过低告警一级
+
+ {"BCU_14", 0, 1, bms_get_fault_level_2}, // 单体过压告警二级
+ {"BCU_15", 0, 2, bms_get_fault_level_2}, // 单体欠压告警二级
+ {"BCU_16", 0, 3, bms_get_fault_level_2}, // 单体过温告警二级
+ {"BCU_17", 0, 4, bms_get_fault_level_2}, // 单体低温告警二级
+ {"BCU_18", 0, 5, bms_get_fault_level_2}, // 单体压差告警二级
+ {"BCU_19", 0, 6, bms_get_fault_level_2}, // 充电过流告警二级
+ {"BCU_20", 0, 7, bms_get_fault_level_2}, // 放电过流告警二级
+ {"BCU_21", 0, 8, bms_get_fault_level_2}, // SOC过低告警二级
+ {"BCU_22", 0, 9, bms_get_fault_level_2}, // SOC差异过大告警二级
+ {"BCU_23", 0, 10, bms_get_fault_level_2}, // 绝缘过低告警二级
+
+ {"BCU_24", 0, 1, bms_get_fault_level_3}, // 单体过压告警三级
+ {"BCU_25", 0, 2, bms_get_fault_level_3}, // 单体欠压告警三级
+ {"BCU_26", 0, 3, bms_get_fault_level_3}, // 单体过温告警三级
+ {"BCU_27", 0, 4, bms_get_fault_level_3}, // 单体低温告警三级
+ {"BCU_28", 0, 5, bms_get_fault_level_3}, // 单体压差告警三级
+ {"BCU_29", 0, 6, bms_get_fault_level_3}, // 充电过流告警三级
+ {"BCU_30", 0, 7, bms_get_fault_level_3}, // 放电过流告警三级
+ {"BCU_31", 0, 8, bms_get_fault_level_3}, // SOC过低告警三级
+ {"BCU_32", 0, 9, bms_get_fault_level_3}, // SOC差异过大告警三级
+ {"BCU_33", 0, 10, bms_get_fault_level_3}, // 绝缘过低告警三级
+
+ {"BCU_34", 0, 0, NULL}, // 电芯温度极限告警
+ {"BCU_35", 0, 0, NULL}, // 电芯电压极限告警
+ {"BCU_36", 0, 0, NULL}, // 簇间环流1级告警
+ {"BCU_37", 0, 0, NULL}, // 簇间环流2级告警
+ {"BCU_38", 0, 0, NULL}, // 簇间环流3级告警
+ {"BCU_39", 0, 0, NULL}, // 簇间电流差1级告警
+ {"BCU_40", 0, 0, NULL}, // 簇间电流差2级告警
+ {"BCU_41", 0, 0, NULL}, // 簇间电流差3级告警
+
+ {"BCU_42", 1, 11, bms_get_fault_level_1}, // 组端过压1级告警
+ {"BCU_43", 1, 11, bms_get_fault_level_2}, // 组端过压2级告警
+ {"BCU_44", 1, 11, bms_get_fault_level_3}, // 组端过压3级告警
+ {"BCU_45", 1, 12, bms_get_fault_level_1}, // 组端欠压1级告警
+ {"BCU_46", 1, 12, bms_get_fault_level_2}, // 组端欠压2级告警
+ {"BCU_47", 1, 12, bms_get_fault_level_3}, // 组端欠压3级告警
+ {"BCU_48", 1, 13, bms_get_fault_level_1}, // 极柱过温1级告警
+ {"BCU_49", 1, 13, bms_get_fault_level_2}, // 极柱过温2级告警
+ {"BCU_50", 1, 13, bms_get_fault_level_3}, // 极柱过温3级告警
+
+ {"BCU_51", 1, 0, NULL}, // AFE温感排线异常
+ {"BCU_52", 1, 0, NULL}, // AFE电压排线异常
+ {"BCU_53", 1, 0, NULL}, // 与电池簇通信告警
+ {"BCU_54", 1, 0, NULL}, // 主从通讯告警
+ {"BCU_55", 1, 14, bms_get_fault_level_3}, // 继电器粘连告警
+ {"BCU_56", 1, 15, bms_get_fault_level_3}, // 电池极限故障
+ {"BCU_57", 1, 0, NULL}, // 熔丝故障
+ {"BCU_58", 1, 0, NULL}, // 断路器故障
+ {"BCU_59", 1, 0, NULL}, // 空调故障
+ {"BCU_60", 1, 0, NULL}, // 消防设备故障
+ {"BCU_61", 1, 0, NULL}, // 消防火警
+ {"BCU_62", 1, 0, NULL}, // 消防喷洒
+ {"BCU_63", 1, 0, NULL}, // AFE故障
+ {"BCU_64", 1, 14, bms_get_fault_level_1}, // 高压异常
+ {"BCU_65", 1, 16, bms_get_fault_level_3}, // 预充告警
+ {"BCU_66", 1, 17, bms_get_fault_level_3}, // 开路故障
+
+ {"BCU_67", 1, 1, bms_get_baseInfo}, // 总压
+ {"BCU_68", 1, 2, bms_get_baseInfo}, // 总电流
+ {"BCU_69", 1, 3, bms_get_baseInfo}, // SOC
+ {"BCU_70", 1, 4, bms_get_baseInfo}, // SOH
+ {"BCU_71", 1, 5, bms_get_baseInfo}, // SOE
+ {"BCU_72", 1, 6, bms_get_baseInfo}, // 额定总压
+ {"BCU_73", 1, 7, bms_get_baseInfo}, // 额定容量
+ {"BCU_74", 1, 8, bms_get_baseInfo}, // 剩余容量
+ {"BCU_75", 1, 9, bms_get_baseInfo}, // 额定电量
+ {"BCU_76", 1, 10, bms_get_baseInfo}, // 剩余电量
+ {"BCU_77", 1, 11, bms_get_baseInfo}, // 从机总数(BMU)
+ {"BCU_78", 1, 12, bms_get_baseInfo}, // 在线从机总数(BMU)
+ {"BCU_79", 1, 13, bms_get_baseInfo}, // 电池总数
+ {"BCU_80", 1, 14, bms_get_baseInfo}, // 在线电池总数
+ {"BCU_81", 1, 15, bms_get_baseInfo}, // 温感总数
+
+ {"BCU_82", 2, 16, bms_get_baseInfo}, // 在线温感总数
+ {"BCU_83", 2, 17, bms_get_baseInfo}, // 最大允许放电电流
+ {"BCU_84", 2, 18, bms_get_baseInfo}, // 最大允许放电功率
+ {"BCU_85", 2, 19, bms_get_baseInfo}, // 最大允许充电电流
+ {"BCU_86", 2, 20, bms_get_baseInfo}, // 最大允许充电功率
+ {"BCU_87", 2, 21, bms_get_baseInfo}, // 正极绝缘阻值
+ {"BCU_88", 2, 22, bms_get_baseInfo}, // 负极绝缘阻值
+ {"BCU_89", 2, 23, bms_get_baseInfo}, // 单体平均电压
+ {"BCU_90", 2, 24, bms_get_baseInfo}, // 单体最大压差
+ {"BCU_91", 2, 25, bms_get_baseInfo}, // 最高单体电压
+ {"BCU_92", 2, 26, bms_get_baseInfo}, // 最高单体电压从机号
+ {"BCU_93", 2, 27, bms_get_baseInfo}, // 最高单体电压编号
+ {"BCU_94", 2, 28, bms_get_baseInfo}, // 最低单体电压
+ {"BCU_95", 2, 29, bms_get_baseInfo}, // 最低单体电压从机号
+ {"BCU_96", 2, 30, bms_get_baseInfo}, // 最低单体电压编号
+ {"BCU_97", 2, 31, bms_get_baseInfo}, // 单体平均温度
+ {"BCU_98", 2, 32, bms_get_baseInfo}, // 最大温差
+ {"BCU_99", 2, 33, bms_get_baseInfo}, // 最高单体温度
+ {"BCU_100", 2, 34, bms_get_baseInfo}, // 最高单体温度从机号
+ {"BCU_101", 2, 35, bms_get_baseInfo}, // 最高单体温度编号
+ {"BCU_102", 2, 36, bms_get_baseInfo}, // 最低单体温度
+ {"BCU_103", 2, 37, bms_get_baseInfo}, // 最低单体温度从机号
+ {"BCU_104", 2, 38, bms_get_baseInfo}, // 最低单体温度编号
+ {"BCU_105", 2, 39, bms_get_baseInfo}, // 日充电容量
+ {"BCU_106", 2, 40, bms_get_baseInfo}, // 日充电电量
+ {"BCU_107", 2, 41, bms_get_baseInfo}, // 日放电容量
+ {"BCU_108", 2, 42, bms_get_baseInfo}, // 日放电电量
+ {"BCU_109", 2, 43, bms_get_baseInfo}, // 日充电时间
+ {"BCU_110", 2, 44, bms_get_baseInfo}, // 日放电时间
+ {"BCU_111", 2, 45, bms_get_baseInfo}, // 累计充电容量
+ {"BCU_112", 2, 46, bms_get_baseInfo}, // 累计充电电量
+ {"BCU_113", 2, 47, bms_get_baseInfo}, // 累计放电容量
+ {"BCU_114", 2, 48, bms_get_baseInfo}, // 累计放电电量
+ {"BCU_115", 2, 49, bms_get_baseInfo}, // 累计充电时间
+ {"BCU_116", 2, 50, bms_get_baseInfo}, // 累计放电时间
+ {"BCU_117", 2, 51, bms_get_baseInfo}, // BCU工作状态
};
const int bms_point_count = sizeof(bms_points) / sizeof(bms_points[0]);
+/*
+ const char* key; // JSON 中的键,比如 "BCU_"后面不带数字,数据后面通过BCU_pointId组合
+ uint16_t pointId; // 用于记录开始的测点号,见bcu模型
+ uint16_t startCellIndex; // 开始的电压序号(入参)
+ uint16_t endCellIndex; // 结束的电压序号(入参)
+ uint32_t (*get_val)(uint16_t); // 对应值的获取函数
+*/
+const devCellPointMap bms_volt_points[] =
+{
+ {"BCU_", 191, 0, 39,bms_get_baseInfo}, // 1号~40号电池电压
+ {"BCU_", 191, 40, 79,bms_get_baseInfo}, // 41号~80号电池电压
+ {"BCU_", 191, 80, 119,bms_get_baseInfo}, // 81号~120号电池电压
+ {"BCU_", 191, 120, 159,bms_get_baseInfo}, // 121号~160号电池电压
+ {"BCU_", 191, 160, 199,bms_get_baseInfo}, // 161号~200号电池电压
+ {"BCU_", 191, 200, 239,bms_get_baseInfo}, // 201号~240号电池电压
+ {"BCU_", 191, 240, 279,bms_get_baseInfo}, // 241号~280号电池电压
+ {"BCU_", 191, 280, 319,bms_get_baseInfo}, // 281号~320号电池电压
+ {"BCU_", 191, 320, 359,bms_get_baseInfo}, // 321号~360号电池电压
+ {"BCU_", 191, 360, 399,bms_get_baseInfo}, // 361号~400号电池电压
+};
+
+const devCellPointMap bms_temp_points[] =
+{
+ {"BCU_", 611, 0, 39,bms_get_baseInfo}, // 1号~40号电池温度
+ {"BCU_", 611, 40, 79,bms_get_baseInfo}, // 41号~80号电池温度
+ {"BCU_", 611, 80, 119,bms_get_baseInfo}, // 81号~120号电池温度
+ {"BCU_", 611, 120, 159,bms_get_baseInfo}, // 121号~160号电池温度
+ {"BCU_", 611, 160, 199,bms_get_baseInfo}, // 161号~200号电池温度
+};
+
+const int bms_volt_count = sizeof(bms_volt_points) / sizeof(devCellPointMap);
+const int bms_temp_count = sizeof(bms_temp_points) / sizeof(devCellPointMap);
+
+
+
void protocol_build_json(uint16_t groupId)
{
- int val = 0;
+ int val = 0;
cJSON* root = cJSON_CreateObject();
cJSON_AddNumberToObject(root, "timeStamp", drv_rtc_get_tick());
@@ -845,62 +880,177 @@ void protocol_build_json(uint16_t groupId)
for (int i = 0; i < bms_point_count; ++i)
{
- const devPointMap* point = &bms_points[i];
- if(point->groupId == groupId)
- {
- if (bms_points[i].get_val != NULL)
- {
- val = point->get_val(point->input);
- }
- else
- {
- val = 0; // 默认值
- }
- }
- cJSON_AddNumberToObject(dataObj, point->key, val);
+ const devPointMap* point = &bms_points[i];
+ if(point->groupId == groupId)
+ {
+ if (bms_points[i].get_val != NULL)
+ {
+ val = point->get_val(point->input);
+ }
+ else
+ {
+ val = 0; // 默认值
+ }
+ }
+ cJSON_AddNumberToObject(dataObj, point->key, val);
}
// 转为 JSON 字符串
- char* json_str = cJSON_PrintUnformatted(root);
- if (json_str)
- {
- drv_mqtt_publish(json_str, strlen(json_str));
- cJSON_free(json_str);
- }
-
+ char* json_str = cJSON_PrintUnformatted(root);
+ if (json_str)
+ {
+ drv_mqtt_publish(json_str, strlen(json_str));
+ cJSON_free(json_str);
+ }
+
cJSON_Delete(root);
}
-void publish_all_bms_groups(void) {
- uint8_t max_group = 0;
+void protocol_build_volt_json(uint8_t i)
+{
+ const devCellPointMap* item = &bms_volt_points[i];
+ int val = 0;
+ char key[10] = {0};
+ cJSON* root = cJSON_CreateObject();
- for (size_t i = 0; i < bms_point_count; i++)
- {
- if (bms_points[i].groupId > max_group)
- {
+ cJSON_AddNumberToObject(root, "timeStamp", drv_rtc_get_tick());
+
+ // devData 数组
+ cJSON* devDataArr = cJSON_CreateArray();
+ cJSON_AddItemToObject(root, "devData", devDataArr);
+
+ // 构建每一个设备项
+ cJSON* deviceObj = cJSON_CreateObject();
+ cJSON_AddItemToArray(devDataArr, deviceObj);
+
+ cJSON_AddStringToObject(deviceObj, "devType", "4");
+ cJSON_AddStringToObject(deviceObj, "devName", "BCU");
+ cJSON_AddStringToObject(deviceObj, "devId", "001");
+ cJSON_AddStringToObject(deviceObj, "sn", "SN123456");
+
+ // 构建 data 对象
+ cJSON* dataObj = cJSON_CreateObject();
+ cJSON_AddItemToObject(deviceObj, "data", dataObj);
+
+
+ for (int i = item->startCellIndex; i <= item->endCellIndex; ++i)
+ {
+ sprintf(key,"%s%d",item->key,item->pointId + i);
+ if (item->get_val != NULL)
+ {
+ val = item->get_val(i);
+ }
+ else
+ {
+ val = 0; // 默认值
+ }
+ cJSON_AddNumberToObject(dataObj, key, val);
+ }
+
+ // 转为 JSON 字符串
+ char* json_str = cJSON_PrintUnformatted(root);
+ if (json_str)
+ {
+ drv_mqtt_publish(json_str, strlen(json_str));
+ cJSON_free(json_str);
+ }
+
+ cJSON_Delete(root);
+}
+
+void protocol_build_temp_json(uint8_t i)
+{
+ const devCellPointMap* item = &bms_temp_points[i];
+ int val = 0;
+ char key[10] = {0};
+ cJSON* root = cJSON_CreateObject();
+
+ cJSON_AddNumberToObject(root, "timeStamp", drv_rtc_get_tick());
+
+ // devData 数组
+ cJSON* devDataArr = cJSON_CreateArray();
+ cJSON_AddItemToObject(root, "devData", devDataArr);
+
+ // 构建每一个设备项
+ cJSON* deviceObj = cJSON_CreateObject();
+ cJSON_AddItemToArray(devDataArr, deviceObj);
+
+ cJSON_AddStringToObject(deviceObj, "devType", "4");
+ cJSON_AddStringToObject(deviceObj, "devName", "BCU");
+ cJSON_AddStringToObject(deviceObj, "devId", "001");
+ cJSON_AddStringToObject(deviceObj, "sn", "SN123456");
+
+ // 构建 data 对象
+ cJSON* dataObj = cJSON_CreateObject();
+ cJSON_AddItemToObject(deviceObj, "data", dataObj);
+
+
+ for (int i = item->startCellIndex; i <= item->endCellIndex; ++i)
+ {
+ sprintf(key,"%s%d",item->key,item->pointId + i);
+ if (item->get_val != NULL)
+ {
+ val = item->get_val(i);
+ }
+ else
+ {
+ val = 0; // 默认值
+ }
+ cJSON_AddNumberToObject(dataObj, key, val);
+ }
+
+ // 转为 JSON 字符串
+ char* json_str = cJSON_PrintUnformatted(root);
+ if (json_str)
+ {
+ drv_mqtt_publish(json_str, strlen(json_str));
+ cJSON_free(json_str);
+ }
+
+ cJSON_Delete(root);
+}
+
+void publish_all_bms_groups(void)
+{
+ uint8_t max_group = 0;
+ uint8_t i = 0;
+ for (i = 0; i < bms_point_count; i++)
+ {
+ if (bms_points[i].groupId > max_group)
+ {
max_group = bms_points[i].groupId;
}
}
- for (uint8_t g = 0; g <= max_group; g++)
- {
+ for (uint8_t g = 0; g <= max_group; g++)
+ {
protocol_build_json(g);
}
+
+ for (i = 0; i < bms_volt_count; i++)
+ {
+ protocol_build_volt_json(i);
+ }
+
+ for (i = 0; i < bms_temp_count; i++)
+ {
+ protocol_build_temp_json(i);
+ }
+
}
void mqtt_publish_bms_data(uint32_t basetime)
{
static uint32_t mqtt_cycle_tick = 0;
- static uint8_t groupMax = 0;
- uint16_t i = 0;
+ static uint8_t groupMax = 0;
mqtt_cycle_tick += basetime;
if(mqtt_cycle_tick > 60000)
{
mqtt_cycle_tick = 0;
- publish_all_bms_groups();
+ publish_all_bms_groups();
}
}
diff --git a/app/stm32fxxx_app/protocol/protocol_mqtt_bcu.c.orig b/app/stm32fxxx_app/protocol/protocol_mqtt_bcu.c.orig
index 3ddcdda..7bf89de 100644
--- a/app/stm32fxxx_app/protocol/protocol_mqtt_bcu.c.orig
+++ b/app/stm32fxxx_app/protocol/protocol_mqtt_bcu.c.orig
@@ -7,27 +7,858 @@
******************************************************************************/
#include "protocol_mqtt_bcu.h"
+#include "iso_check.h"
+#include "soc_calculate.h"
+#include "sop_calculate.h"
+#include "version_manager.h"
+#include "dido_manager.h"
+#include "fault_manager.h"
+#include "flash_manager.h"
+#include "comm_manager.h"
+#include "hv_adc_manager.h"
+#include "eeprom_manager.h"
+#include "signal_manager.h"
+#include "statistic_manager.h"
+#include "bmu_manager.h"
+#include "protocol_comm.h"
+uint32_t bms_get_baseInfo(uint16_t input)
+{
+ uint32_t tmp;
+ uint16_t bms_stu = 0;
+ if(bms_get_run_status() == kRunStatus_Init)
+ {
+ bms_stu = 0;
+ }
+ else if(bms_get_run_status() == kRunStatus_Standby)
+ {
+ bms_stu |= 0x1;
+ }
+ else if(bms_get_run_status() == kRunStatus_Chg)
+ {
+ bms_stu |= 0x2;
+ }
+ else if(bms_get_run_status() == kRunStatus_Dis)
+ {
+ bms_stu |= 0x3;
+ }
+ if(bms_get_signal(kSignalIdx_ForbidChg) == kSignalStatus_High)
+ {
+ bms_stu |= 0x10;
+ }
+ if(bms_get_signal(kSignalIdx_ForbidDis) == kSignalStatus_High)
+ {
+ bms_stu |= 0x20;
+ }
+
+ switch(input)
+ {
+ case 1:
+ tmp = bms_get_statistic_data(kStatisticData_TotalVolt);
+ return tmp;
+ case 2:
+ tmp = bms_get_show_current();
+ return tmp;
+ case 3:
+ tmp = bms_get_soc() / 100;
+ return tmp;
+ case 4:
+ tmp = bms_get_soh() / 100;
+ return tmp;
+ case 5:
+ tmp = bms_get_soc() / 100;
+ return tmp;
+ case 6:
+ tmp = get_eeprom_data(kEep_RatedTotalVolt,kEepromDataType_Full);
+ return tmp;
+ case 7:
+ tmp = get_eeprom_data(kEep_RatedCapacity,kEepromDataType_Full);
+ return tmp;
+ case 8:
+ tmp = (uint32_t)bms_get_soc()*get_eeprom_data(kEep_RatedCapacity, kEepromDataType_Full)/10000;
+ return tmp;
+ case 9:
+ tmp = get_eeprom_data(kEep_RatedCapacity, kEepromDataType_Full)*get_eeprom_data(kEep_RatedTotalVolt, kEepromDataType_Full)/10000;
+ return tmp;
+ case 10:
+ tmp = (uint32_t)bms_get_soc() * get_eeprom_data(kEep_RatedCapacity, kEepromDataType_Full)/10000*get_eeprom_data(kEep_RatedTotalVolt, kEepromDataType_Full)/10000;
+ return tmp;
+ case 11:
+ tmp = bms_get_bmu_num();
+ return tmp;
+ case 12:
+ tmp = bms_get_bmu_online_num();
+ return tmp;
+ case 13:
+ tmp = get_eeprom_data(kEep_CellNum, kEepromDataType_Full);
+ return tmp;
+ case 14:
+ tmp = bms_get_statistic_data(kStatisticData_OnlineCellNum);
+ return tmp;
+ case 15:
+ tmp = get_eeprom_data(kEep_TempNum, kEepromDataType_Full);
+ return tmp;
+ case 16:
+ tmp = bms_get_statistic_data(kStatisticData_OnlineTempNum);
+ return tmp;
+ case 17:
+ tmp = bms_get_sop_data(kSopData_DisCur);
+ return tmp;
+ case 18:
+ tmp = (uint32_t)bms_get_sop_data(kSopData_DisCur)*get_eeprom_data(kEep_RatedTotalVolt, kEepromDataType_Full)/10000;
+ return tmp;
+ case 19:
+ tmp = bms_get_sop_data(kSopData_ChgCur);
+ return tmp;
+ case 20:
+ tmp = (uint32_t)bms_get_sop_data(kSopData_ChgCur)*get_eeprom_data(kEep_RatedTotalVolt, kEepromDataType_Full)/10000;
+ return tmp;
+ case 21:
+ tmp = bms_get_iso_data(kIsoData_PosRes);
+ return tmp;
+ case 22:
+ tmp = bms_get_iso_data(kIsoData_NegRes);
+ return tmp;
+ case 23:
+ tmp = bms_get_statistic_data(kStatisticData_AvgVolt);
+ return tmp;
+ case 24:
+ tmp = bms_get_statistic_data(kStatisticData_VoltDiff);
+ return tmp;
+ case 25:
+ tmp = bms_get_statistic_data(kStatisticData_MaxVolt);
+ return tmp;
+ case 26:
+ tmp = bms_get_statistic_data(kStatisticData_MaxVoltBmuIdx) + 1;
+ return tmp;
+ case 27:
+ tmp = bms_get_statistic_data(kStatisticData_MaxVoltIdx) + 1;
+ return tmp;
+ case 28:
+ tmp = bms_get_statistic_data(kStatisticData_MinVolt);
+ return tmp;
+ case 29:
+ tmp = bms_get_statistic_data(kStatisticData_MinVoltBmuIdx) + 1;
+ return tmp;
+ case 30:
+ tmp = bms_get_statistic_data(kStatisticData_MinVoltIdx) + 1;
+ return tmp;
+ case 31:
+ tmp = bms_get_statistic_data(kStatisticData_AvgTemp);
+ return tmp;
+ case 32:
+ tmp = bms_get_statistic_data(kStatisticData_TempDiff);
+ return tmp;
+ case 33:
+ tmp = bms_get_statistic_data(kStatisticData_MaxTemp);
+ return tmp;
+ case 34:
+ tmp = bms_get_statistic_data(kStatisticData_MaxTempBmuIdx) + 1;
+ return tmp;
+ case 35:
+ tmp = bms_get_statistic_data(kStatisticData_MaxTempIdx) + 1;
+ return tmp;
+ case 36:
+ tmp = bms_get_statistic_data(kStatisticData_MinTemp);
+ return tmp;
+ case 37:
+ tmp = bms_get_statistic_data(kStatisticData_MinTempBmuIdx) + 1;
+ return tmp;
+ case 38:
+ tmp = bms_get_statistic_data(kStatisticData_MinTempIdx) + 1;
+ return tmp;
+ case 39:
+ tmp = (uint16_t)bms_get_cumulate_data(kCumulateData_DayChgCap);
+ return tmp;
+ case 40:
+ tmp = (uint16_t)bms_get_cumulate_data(kCumulateData_DayChgEnergy);
+ return tmp;
+ case 41:
+ tmp = (uint16_t)bms_get_cumulate_data(kCumulateData_DayDisCap);
+ return tmp;
+ case 42:
+ tmp = (uint16_t)bms_get_cumulate_data(kCumulateData_DayDisEnergy);
+ return tmp;
+ case 43:
+ tmp = (uint16_t)bms_get_cumulate_data(kCumulateData_DayChgTime);
+ return tmp;
+ case 44:
+ tmp = (uint16_t)bms_get_cumulate_data(kCumulateData_DayDisTime);
+ return tmp;
+ case 45:
+ tmp = bms_get_cumulate_data(kCumulateData_AccChgCap);
+ return tmp;
+ case 46:
+ tmp = bms_get_cumulate_data(kCumulateData_AccChgEnergy);
+ return tmp;
+ case 47:
+ tmp = bms_get_cumulate_data(kCumulateData_AccDisCap);
+ return tmp;
+ case 48:
+ tmp = bms_get_cumulate_data(kCumulateData_AccDisEnergy);
+ return tmp;
+ case 49:
+ tmp = bms_get_cumulate_data(kCumulateData_AccChgTime);
+ return tmp;
+ case 50:
+ tmp = bms_get_cumulate_data(kCumulateData_AccDisTime);
+ return tmp;
+ case 51:
+ tmp = bms_stu;
+ return tmp;
+ default:
+ return 0;
+ }
+}
+
+uint32_t bms_get_fault_level_1(uint16_t input)
+{
+ uint32_t tmp = 0;
+
+ switch(input)
+ {
+ case 1:
+ if (KIT_GET_BIT_32(bms_get_fault_single_bit(0, kFaultLevel_First), 2)) //一级单体过压
+ {
+ tmp = 1;
+ }
+ else
+ {
+ tmp = 0;
+ }
+ return tmp;
+ case 2:
+ if (KIT_GET_BIT_32(bms_get_fault_single_bit(0, kFaultLevel_First), 3)) //一级单体欠压
+ {
+ tmp = 1;
+ }
+ else
+ {
+ tmp = 0;
+ }
+ return tmp;
+ case 3:
+ if (KIT_GET_BIT_32(bms_get_fault_single_bit(0, kFaultLevel_First), 4)) //一级单体过温
+ {
+ tmp = 1;
+ }
+ else
+ {
+ tmp = 0;
+ }
+ return tmp;
+ case 4:
+ if (KIT_GET_BIT_32(bms_get_fault_single_bit(0, kFaultLevel_First), 5)) //一级单体低温
+ {
+ tmp = 1;
+ }
+ else
+ {
+ tmp = 0;
+ }
+ return tmp;
+ case 5:
+ if (KIT_GET_BIT_32(bms_get_fault_single_bit(0, kFaultLevel_First), 6)) //一级单体压差
+ {
+ tmp = 1;
+ }
+ else
+ {
+ tmp = 0;
+ }
+ return tmp;
+ case 6:
+ if (bms_get_run_status() == kRunStatus_Chg)
+ {
+ if (KIT_GET_BIT_32(bms_get_fault_single_bit(0, kFaultLevel_First), 8)) //一级充电电流过大
+ {
+ tmp = 1;
+ }
+ else
+ {
+ tmp = 0;
+ }
+ }
+ return tmp;
+ case 7:
+ if (bms_get_run_status() == kRunStatus_Dis)
+ {
+ if (KIT_GET_BIT_32(bms_get_fault_single_bit(0, kFaultLevel_First), 8)) //一级放电电流过大
+ {
+ tmp = 1;
+ }
+ else
+ {
+ tmp = 0;
+ }
+ }
+ return tmp;
+ case 8:
+ if (KIT_GET_BIT_32(bms_get_fault_single_bit(0, kFaultLevel_First), 14)) //一级SOC过低
+ {
+ tmp = 1;
+ }
+ else
+ {
+ tmp = 0;
+ }
+ return tmp;
+ case 9:
+ tmp = 0; //一级SOC差异过大
+ return tmp;
+ case 10:
+ if (KIT_GET_BIT_32(bms_get_fault_single_bit(0, kFaultLevel_First), 15)) //一级绝缘过低
+ {
+ tmp = 1;
+ }
+ else
+ {
+ tmp = 0;
+ }
+ return tmp;
+ case 11:
+ if (KIT_GET_BIT_32(bms_get_fault_single_bit(0, kFaultLevel_First), 0)) //一级总压过压--组端过压
+ {
+ tmp = 1;
+ }
+ else
+ {
+ tmp = 0;
+ }
+ return tmp;
+ case 12:
+ if (KIT_GET_BIT_32(bms_get_fault_single_bit(0, kFaultLevel_First), 1)) //一级总压欠压--组端欠压
+ {
+ tmp = 1;
+ }
+ else
+ {
+ tmp = 0;
+ }
+ case 13:
+ if (KIT_GET_BIT_32(bms_get_fault_single_bit(1, kFaultLevel_First), 12)) //1级极柱过温
+ {
+ tmp = 1;
+ }
+ else
+ {
+ tmp = 0;
+ }
+ return tmp;
+ case 14:
+ if (KIT_GET_BIT_32(bms_get_fault_single_bit(0, kFaultLevel_First), 9)) //高压异常
+ {
+ tmp = 1;
+ }
+ else
+ {
+ tmp = 0;
+ }
+ return tmp;
+ case 15:
+ tmp = get_eeprom_data(kEep_TempNum, kEepromDataType_Full);
+ return tmp;
+ case 16:
+ tmp = bms_get_statistic_data(kStatisticData_OnlineTempNum);
+ break;
+ default:
+ return 0;
+ }
+}
+
+uint32_t bms_get_fault_level_2(uint16_t input)
+{
+ uint32_t tmp = 0;
+
+ switch(input)
+ {
+ case 1:
+ if (KIT_GET_BIT_32(bms_get_fault_single_bit(0, kFaultLevel_Second), 2)) //2级单体过压
+ {
+ tmp = 1;
+ }
+ else
+ {
+ tmp = 0;
+ }
+ return tmp;
+ case 2:
+ if (KIT_GET_BIT_32(bms_get_fault_single_bit(0, kFaultLevel_Second), 3)) //2级单体欠压
+ {
+ tmp = 1;
+ }
+ else
+ {
+ tmp = 0;
+ }
+ return tmp;
+ case 3:
+ if (KIT_GET_BIT_32(bms_get_fault_single_bit(0, kFaultLevel_Second), 4)) //2级单体过温
+ {
+ tmp = 1;
+ }
+ else
+ {
+ tmp = 0;
+ }
+ return tmp;
+ case 4:
+ if (KIT_GET_BIT_32(bms_get_fault_single_bit(0, kFaultLevel_Second), 5)) //2级单体低温
+ {
+ tmp = 1;
+ }
+ else
+ {
+ tmp = 0;
+ }
+ return tmp;
+ case 5:
+ if (KIT_GET_BIT_32(bms_get_fault_single_bit(0, kFaultLevel_Second), 6)) //2级单体压差
+ {
+ tmp = 1;
+ }
+ else
+ {
+ tmp = 0;
+ }
+ return tmp;
+ case 6:
+ if (bms_get_run_status() == kRunStatus_Chg)
+ {
+ if (KIT_GET_BIT_32(bms_get_fault_single_bit(0, kFaultLevel_Second), 8)) //2级充电电流过大
+ {
+ tmp = 1;
+ }
+ else
+ {
+ tmp = 0;
+ }
+ }
+ return tmp;
+ case 7:
+ if (bms_get_run_status() == kRunStatus_Dis)
+ {
+ if (KIT_GET_BIT_32(bms_get_fault_single_bit(0, kFaultLevel_Second), 8)) //2级放电电流过大
+ {
+ tmp = 1;
+ }
+ else
+ {
+ tmp = 0;
+ }
+ }
+ return tmp;
+ case 8:
+ if (KIT_GET_BIT_32(bms_get_fault_single_bit(0, kFaultLevel_Second), 14)) //2级SOC过低
+ {
+ tmp = 1;
+ }
+ else
+ {
+ tmp = 0;
+ }
+ return tmp;
+ case 9:
+ tmp = 0; //一级SOC差异过大
+ return tmp;
+ case 10:
+ if (KIT_GET_BIT_32(bms_get_fault_single_bit(0, kFaultLevel_Second), 15)) //2级绝缘过低
+ {
+ tmp = 1;
+ }
+ else
+ {
+ tmp = 0;
+ }
+ return tmp;
+ case 11:
+ if (KIT_GET_BIT_32(bms_get_fault_single_bit(0, kFaultLevel_Second), 0)) //2级总压过压--组端过压
+ {
+ tmp = 1;
+ }
+ else
+ {
+ tmp = 0;
+ }
+ return tmp;
+ case 12:
+ if (KIT_GET_BIT_32(bms_get_fault_single_bit(0, kFaultLevel_Second), 1)) //2级总压欠压--组端欠压
+ {
+ tmp = 1;
+ }
+ else
+ {
+ tmp = 0;
+ }
+ case 13:
+ if (KIT_GET_BIT_32(bms_get_fault_single_bit(1, kFaultLevel_Second), 12)) //2级极柱过温
+ {
+ tmp = 1;
+ }
+ else
+ {
+ tmp = 0;
+ }
+ return tmp;
+ case 14:
+ tmp = bms_get_statistic_data(kStatisticData_OnlineCellNum);
+ return tmp;
+ case 15:
+ tmp = get_eeprom_data(kEep_TempNum, kEepromDataType_Full);
+ return tmp;
+ case 16:
+ tmp = bms_get_statistic_data(kStatisticData_OnlineTempNum);
+ break;
+ default:
+ return 0;
+ }
+}
+
+uint32_t bms_get_fault_level_3(uint16_t input)
+{
+ uint32_t tmp = 0;
+
+ switch(input)
+ {
+ case 1:
+ if (KIT_GET_BIT_32(bms_get_fault_single_bit(0, kFaultLevel_Third), 2)) //3级单体过压
+ {
+ tmp = 1;
+ }
+ else
+ {
+ tmp = 0;
+ }
+ return tmp;
+ case 2:
+ if (KIT_GET_BIT_32(bms_get_fault_single_bit(0, kFaultLevel_Third), 3)) //3级单体欠压
+ {
+ tmp = 1;
+ }
+ else
+ {
+ tmp = 0;
+ }
+ return tmp;
+ case 3:
+ if (KIT_GET_BIT_32(bms_get_fault_single_bit(0, kFaultLevel_Third), 4)) //3级单体过温
+ {
+ tmp = 1;
+ }
+ else
+ {
+ tmp = 0;
+ }
+ return tmp;
+ case 4:
+ if (KIT_GET_BIT_32(bms_get_fault_single_bit(0, kFaultLevel_Third), 5)) //3级单体低温
+ {
+ tmp = 1;
+ }
+ else
+ {
+ tmp = 0;
+ }
+ return tmp;
+ case 5:
+ if (KIT_GET_BIT_32(bms_get_fault_single_bit(0, kFaultLevel_Third), 6)) //3级单体压差
+ {
+ tmp = 1;
+ }
+ else
+ {
+ tmp = 0;
+ }
+ return tmp;
+ case 6:
+ if (bms_get_run_status() == kRunStatus_Chg)
+ {
+ if (KIT_GET_BIT_32(bms_get_fault_single_bit(0, kFaultLevel_Third), 8)) //3级充电电流过大
+ {
+ tmp = 1;
+ }
+ else
+ {
+ tmp = 0;
+ }
+ }
+ return tmp;
+ case 7:
+ if (bms_get_run_status() == kRunStatus_Dis)
+ {
+ if (KIT_GET_BIT_32(bms_get_fault_single_bit(0, kFaultLevel_Third), 8)) //3级放电电流过大
+ {
+ tmp = 1;
+ }
+ else
+ {
+ tmp = 0;
+ }
+ }
+ return tmp;
+ case 8:
+ if (KIT_GET_BIT_32(bms_get_fault_single_bit(0, kFaultLevel_Third), 14)) //3级SOC过低
+ {
+ tmp = 1;
+ }
+ else
+ {
+ tmp = 0;
+ }
+ return tmp;
+ case 9:
+ tmp = 0; //一级SOC差异过大
+ return tmp;
+ case 10:
+ if (KIT_GET_BIT_32(bms_get_fault_single_bit(0, kFaultLevel_Third), 15)) //3级绝缘过低
+ {
+ tmp = 1;
+ }
+ else
+ {
+ tmp = 0;
+ }
+ return tmp;
+ case 11:
+ if (KIT_GET_BIT_32(bms_get_fault_single_bit(0, kFaultLevel_Third), 0)) //3级总压过压--组端过压
+ {
+ tmp = 1;
+ }
+ else
+ {
+ tmp = 0;
+ }
+ return tmp;
+ case 12:
+ if (KIT_GET_BIT_32(bms_get_fault_single_bit(0, kFaultLevel_Third), 1)) //3级总压欠压--组端欠压
+ {
+ tmp = 1;
+ }
+ else
+ {
+ tmp = 0;
+ }
+ case 13:
+ if (KIT_GET_BIT_32(bms_get_fault_single_bit(1, kFaultLevel_Third), 12)) //3级极柱过温
+ {
+ tmp = 1;
+ }
+ else
+ {
+ tmp = 0;
+ }
+ return tmp;
+ case 14:
+ if (KIT_GET_BIT_32(bms_get_fault_single_bit(1, kFaultLevel_Third), 0)) //继电器粘连
+ {
+ tmp = 1;
+ }
+ else
+ {
+ tmp = 0;
+ }
+ case 15:
+ if (KIT_GET_BIT_32(bms_get_fault_single_bit(2, kFaultLevel_Third), 9)) //极限故障
+ {
+ tmp = 1;
+ }
+ else
+ {
+ tmp = 0;
+ }
+ case 16:
+ if (KIT_GET_BIT_32(bms_get_fault_single_bit(1, kFaultLevel_Third), 1)) //预充故障
+ {
+ tmp = 1;
+ }
+ else
+ {
+ tmp = 0;
+ }
+ case 17:
+ if (KIT_GET_BIT_32(bms_get_fault_single_bit(2, kFaultLevel_Third), 10)) //开路故障
+ {
+ tmp = 1;
+ }
+ else
+ {
+ tmp = 0;
+ }
+ default:
+ return 0;
+ }
+}
+
+//把这个请按照数据模型填充完毕
const devPointMap bms_points[] = {
- {"BCU_2", NULL}, // 总告警
- {"BCU_3", NULL}, // 总故障
- {"BCU_4", NULL}, // 单体过压告警一级
- {"BCU_5", NULL}, // 单体欠压告警一级
- {"BCU_6", NULL}, // 单体过温告警一级
- {"BCU_7", NULL}, // 单体低温告警一级
- {"BCU_8", NULL}, // 单体压差告警一级
- {"BCU_9", NULL}, // 充电过流告警一级
+ {"BCU_2", 0, 0, bms_get_total_alarm}, // 总告警
+ {"BCU_3", 0, 0, bms_get_total_fault}, // 总故障
+ {"BCU_4", 0, 1, bms_get_fault_level_1}, // 单体过压告警一级
+ {"BCU_5", 0, 2, bms_get_fault_level_1}, // 单体欠压告警一级
+ {"BCU_6", 0, 3, bms_get_fault_level_1}, // 单体过温告警一级
+ {"BCU_7", 0, 4, bms_get_fault_level_1}, // 单体低温告警一级
+ {"BCU_8", 0, 5, bms_get_fault_level_1}, // 单体压差告警一级
+ {"BCU_9", 0, 6, bms_get_fault_level_1}, // 充电过流告警一级
+ {"BCU_10", 0, 7, bms_get_fault_level_1}, // 放电过流告警一级
+ {"BCU_11", 0, 8, bms_get_fault_level_1}, // SOC过低告警一级
+ {"BCU_12", 0, 9, bms_get_fault_level_1}, // SOC差异过大告警一级
+ {"BCU_13", 0, 10, bms_get_fault_level_1}, // 绝缘过低告警一级
+
+ {"BCU_14", 0, 1, bms_get_fault_level_2}, // 单体过压告警二级
+ {"BCU_15", 0, 2, bms_get_fault_level_2}, // 单体欠压告警二级
+ {"BCU_16", 0, 3, bms_get_fault_level_2}, // 单体过温告警二级
+ {"BCU_17", 0, 4, bms_get_fault_level_2}, // 单体低温告警二级
+ {"BCU_18", 0, 5, bms_get_fault_level_2}, // 单体压差告警二级
+ {"BCU_19", 0, 6, bms_get_fault_level_2}, // 充电过流告警二级
+ {"BCU_20", 0, 7, bms_get_fault_level_2}, // 放电过流告警二级
+ {"BCU_21", 0, 8, bms_get_fault_level_2}, // SOC过低告警二级
+ {"BCU_22", 0, 9, bms_get_fault_level_2}, // SOC差异过大告警二级
+ {"BCU_23", 0, 10, bms_get_fault_level_2}, // 绝缘过低告警二级
+
+ {"BCU_24", 0, 1, bms_get_fault_level_3}, // 单体过压告警三级
+ {"BCU_25", 0, 2, bms_get_fault_level_3}, // 单体欠压告警三级
+ {"BCU_26", 0, 3, bms_get_fault_level_3}, // 单体过温告警三级
+ {"BCU_27", 0, 4, bms_get_fault_level_3}, // 单体低温告警三级
+ {"BCU_28", 0, 5, bms_get_fault_level_3}, // 单体压差告警三级
+ {"BCU_29", 0, 6, bms_get_fault_level_3}, // 充电过流告警三级
+ {"BCU_30", 0, 7, bms_get_fault_level_3}, // 放电过流告警三级
+ {"BCU_31", 0, 8, bms_get_fault_level_3}, // SOC过低告警三级
+ {"BCU_32", 0, 9, bms_get_fault_level_3}, // SOC差异过大告警三级
+ {"BCU_33", 0, 10, bms_get_fault_level_3}, // 绝缘过低告警三级
+
+ {"BCU_34", 0, 0, NULL}, // 电芯温度极限告警
+ {"BCU_35", 0, 0, NULL}, // 电芯电压极限告警
+ {"BCU_36", 0, 0, NULL}, // 簇间环流1级告警
+ {"BCU_37", 0, 0, NULL}, // 簇间环流2级告警
+ {"BCU_38", 0, 0, NULL}, // 簇间环流3级告警
+ {"BCU_39", 0, 0, NULL}, // 簇间电流差1级告警
+ {"BCU_40", 0, 0, NULL}, // 簇间电流差2级告警
+ {"BCU_41", 0, 0, NULL}, // 簇间电流差3级告警
+
+ {"BCU_42", 1, 11, bms_get_fault_level_1}, // 组端过压1级告警
+ {"BCU_43", 1, 11, bms_get_fault_level_2}, // 组端过压2级告警
+ {"BCU_44", 1, 11, bms_get_fault_level_3}, // 组端过压3级告警
+ {"BCU_45", 1, 12, bms_get_fault_level_1}, // 组端欠压1级告警
+ {"BCU_46", 1, 12, bms_get_fault_level_2}, // 组端欠压2级告警
+ {"BCU_47", 1, 12, bms_get_fault_level_3}, // 组端欠压3级告警
+ {"BCU_48", 1, 13, bms_get_fault_level_1}, // 极柱过温1级告警
+ {"BCU_49", 1, 13, bms_get_fault_level_2}, // 极柱过温2级告警
+ {"BCU_50", 1, 13, bms_get_fault_level_3}, // 极柱过温3级告警
+
+ {"BCU_51", 1, 0, NULL}, // AFE温感排线异常
+ {"BCU_52", 1, 0, NULL}, // AFE电压排线异常
+ {"BCU_53", 1, 0, NULL}, // 与电池簇通信告警
+ {"BCU_54", 1, 0, NULL}, // 主从通讯告警
+ {"BCU_55", 1, 14, bms_get_fault_level_3}, // 继电器粘连告警
+ {"BCU_56", 1, 15, bms_get_fault_level_3}, // 电池极限故障
+ {"BCU_57", 1, 0, NULL}, // 熔丝故障
+ {"BCU_58", 1, 0, NULL}, // 断路器故障
+ {"BCU_59", 1, 0, NULL}, // 空调故障
+ {"BCU_60", 1, 0, NULL}, // 消防设备故障
+ {"BCU_61", 1, 0, NULL}, // 消防火警
+ {"BCU_62", 1, 0, NULL}, // 消防喷洒
+ {"BCU_63", 1, 0, NULL}, // AFE故障
+ {"BCU_64", 1, 14, bms_get_fault_level_1}, // 高压异常
+ {"BCU_65", 1, 16, bms_get_fault_level_3}, // 预充告警
+ {"BCU_66", 1, 17, bms_get_fault_level_3}, // 开路故障
+
+ {"BCU_67", 1, 1, bms_get_baseInfo}, // 总压
+ {"BCU_68", 1, 2, bms_get_baseInfo}, // 总电流
+ {"BCU_69", 1, 3, bms_get_baseInfo}, // SOC
+ {"BCU_70", 1, 4, bms_get_baseInfo}, // SOH
+ {"BCU_71", 1, 5, bms_get_baseInfo}, // SOE
+ {"BCU_72", 1, 6, bms_get_baseInfo}, // 额定总压
+ {"BCU_73", 1, 7, bms_get_baseInfo}, // 额定容量
+ {"BCU_74", 1, 8, bms_get_baseInfo}, // 剩余容量
+ {"BCU_75", 1, 9, bms_get_baseInfo}, // 额定电量
+ {"BCU_76", 1, 10, bms_get_baseInfo}, // 剩余电量
+ {"BCU_77", 1, 11, bms_get_baseInfo}, // 从机总数(BMU)
+ {"BCU_78", 1, 12, bms_get_baseInfo}, // 在线从机总数(BMU)
+ {"BCU_79", 1, 13, bms_get_baseInfo}, // 电池总数
+ {"BCU_80", 1, 14, bms_get_baseInfo}, // 在线电池总数
+ {"BCU_81", 1, 15, bms_get_baseInfo}, // 温感总数
+
+ {"BCU_82", 2, 16, bms_get_baseInfo}, // 在线温感总数
+ {"BCU_83", 2, 17, bms_get_baseInfo}, // 最大允许放电电流
+ {"BCU_84", 2, 18, bms_get_baseInfo}, // 最大允许放电功率
+ {"BCU_85", 2, 19, bms_get_baseInfo}, // 最大允许充电电流
+ {"BCU_86", 2, 20, bms_get_baseInfo}, // 最大允许充电功率
+ {"BCU_87", 2, 21, bms_get_baseInfo}, // 正极绝缘阻值
+ {"BCU_88", 2, 22, bms_get_baseInfo}, // 负极绝缘阻值
+ {"BCU_89", 2, 23, bms_get_baseInfo}, // 单体平均电压
+ {"BCU_90", 2, 24, bms_get_baseInfo}, // 单体最大压差
+ {"BCU_91", 2, 25, bms_get_baseInfo}, // 最高单体电压
+ {"BCU_92", 2, 26, bms_get_baseInfo}, // 最高单体电压从机号
+ {"BCU_93", 2, 27, bms_get_baseInfo}, // 最高单体电压编号
+ {"BCU_94", 2, 28, bms_get_baseInfo}, // 最低单体电压
+ {"BCU_95", 2, 29, bms_get_baseInfo}, // 最低单体电压从机号
+ {"BCU_96", 2, 30, bms_get_baseInfo}, // 最低单体电压编号
+ {"BCU_97", 2, 31, bms_get_baseInfo}, // 单体平均温度
+ {"BCU_98", 2, 32, bms_get_baseInfo}, // 最大温差
+ {"BCU_99", 2, 33, bms_get_baseInfo}, // 最高单体温度
+ {"BCU_100", 2, 34, bms_get_baseInfo}, // 最高单体温度从机号
+ {"BCU_101", 2, 35, bms_get_baseInfo}, // 最高单体温度编号
+ {"BCU_102", 2, 36, bms_get_baseInfo}, // 最低单体温度
+ {"BCU_103", 2, 37, bms_get_baseInfo}, // 最低单体温度从机号
+ {"BCU_104", 2, 38, bms_get_baseInfo}, // 最低单体温度编号
+ {"BCU_105", 2, 39, bms_get_baseInfo}, // 日充电容量
+ {"BCU_106", 2, 40, bms_get_baseInfo}, // 日充电电量
+ {"BCU_107", 2, 41, bms_get_baseInfo}, // 日放电容量
+ {"BCU_108", 2, 42, bms_get_baseInfo}, // 日放电电量
+ {"BCU_109", 2, 43, bms_get_baseInfo}, // 日充电时间
+ {"BCU_110", 2, 44, bms_get_baseInfo}, // 日放电时间
+ {"BCU_111", 2, 45, bms_get_baseInfo}, // 累计充电容量
+ {"BCU_112", 2, 46, bms_get_baseInfo}, // 累计充电电量
+ {"BCU_113", 2, 47, bms_get_baseInfo}, // 累计放电容量
+ {"BCU_114", 2, 48, bms_get_baseInfo}, // 累计放电电量
+ {"BCU_115", 2, 49, bms_get_baseInfo}, // 累计充电时间
+ {"BCU_116", 2, 50, bms_get_baseInfo}, // 累计放电时间
+ {"BCU_117", 2, 51, bms_get_baseInfo}, // BCU工作状态
};
const int bms_point_count = sizeof(bms_points) / sizeof(bms_points[0]);
-char* protocol_build_json(void)
+/*
+ const char* key; // JSON 中的键,比如 "BCU_"后面不带数字,数据后面通过BCU_pointId组合
+ uint16_t pointId; // 用于记录开始的测点号,见bcu模型
+ uint16_t startCellIndex; // 开始的电压序号(入参)
+ uint16_t endCellIndex; // 结束的电压序号(入参)
+ uint32_t (*get_val)(uint16_t); // 对应值的获取函数
+*/
+const devCellPointMap bms_volt_points[] =
{
- cJSON* root = cJSON_CreateObject();
- if (!root) return NULL;
+ {"BCU_", 191, 0, 39,bms_get_baseInfo}, // 1号~40号电池电压
+ {"BCU_", 191, 40, 79,bms_get_baseInfo}, // 41号~80号电池电压
+ {"BCU_", 191, 80, 119,bms_get_baseInfo}, // 81号~120号电池电压
+ {"BCU_", 191, 120, 159,bms_get_baseInfo}, // 121号~160号电池电压
+ {"BCU_", 191, 160, 199,bms_get_baseInfo}, // 161号~200号电池电压
+ {"BCU_", 191, 200, 239,bms_get_baseInfo}, // 201号~240号电池电压
+ {"BCU_", 191, 240, 279,bms_get_baseInfo}, // 241号~280号电池电压
+ {"BCU_", 191, 280, 319,bms_get_baseInfo}, // 281号~320号电池电压
+ {"BCU_", 191, 320, 359,bms_get_baseInfo}, // 321号~360号电池电压
+ {"BCU_", 191, 360, 399,bms_get_baseInfo}, // 361号~400号电池电压
+};
+
+const devCellPointMap bms_temp_points[] =
+{
+ {"BCU_", 611, 0, 39,bms_get_baseInfo}, // 1号~40号电池温度
+ {"BCU_", 611, 40, 79,bms_get_baseInfo}, // 41号~80号电池温度
+ {"BCU_", 611, 80, 119,bms_get_baseInfo}, // 81号~120号电池温度
+ {"BCU_", 611, 120, 159,bms_get_baseInfo}, // 121号~160号电池温度
+ {"BCU_", 611, 160, 199,bms_get_baseInfo}, // 161号~200号电池温度
+};
+
+const int bms_volt_count = sizeof(bms_volt_points) / sizeof(devCellPointMap);
+const int bms_temp_count = sizeof(bms_temp_points) / sizeof(devCellPointMap);
+
+
+
+void protocol_build_json(uint16_t groupId)
+{
+ int val = 0;
+ cJSON* root = cJSON_CreateObject();
- // 时间戳字段(此处你需替换成实际时间函数)
cJSON_AddNumberToObject(root, "timeStamp", drv_rtc_get_tick());
// devData 数组
@@ -38,7 +869,7 @@ char* protocol_build_json(void)
cJSON* deviceObj = cJSON_CreateObject();
cJSON_AddItemToArray(devDataArr, deviceObj);
- cJSON_AddStringToObject(deviceObj, "devType", "BMS");
+ cJSON_AddStringToObject(deviceObj, "devType", "4");
cJSON_AddStringToObject(deviceObj, "devName", "BCU");
cJSON_AddStringToObject(deviceObj, "devId", "001");
cJSON_AddStringToObject(deviceObj, "sn", "SN123456");
@@ -49,45 +880,117 @@ char* protocol_build_json(void)
for (int i = 0; i < bms_point_count; ++i)
{
- const char* key = bms_points[i].key;
- int val = 0;
-
- if (bms_points[i].get_val != NULL)
+ const devPointMap* point = &bms_points[i];
+ if(point->groupId == groupId)
{
- val = bms_points[i].get_val();
+ if (bms_points[i].get_val != NULL)
+ {
+ val = point->get_val(point->input);
+ }
+ else
+ {
+ val = 0; // 默认值
+ }
}
- else
- {
- val = 0; // 默认值
- }
-
- cJSON_AddNumberToObject(dataObj, key, val);
+ cJSON_AddNumberToObject(dataObj, point->key, val);
}
// 转为 JSON 字符串
- char* json_str = cJSON_PrintUnformatted(root); // 使用 Unformatted 避免换行
- cJSON_Delete(root);
- return json_str;
-}
-
-void mqtt_publish_bms_data(uint16_t basetime)
-{
- static uint32_t mqtt_cycle_tick = 0;
- mqtt_cycle_tick += basetime;
-
- if(mqtt_cycle_tick > 60000)
- {
- mqtt_cycle_tick = 0;
- char* json_str = protocol_build_json();
- if (json_str == NULL)
+ char* json_str = cJSON_PrintUnformatted(root);
+ if (json_str)
{
- return;
+ drv_mqtt_publish(json_str, strlen(json_str));
+ cJSON_free(json_str);
}
- drv_mqtt_publish(json_str, strlen(json_str));
+ cJSON_Delete(root);
+}
- cJSON_free(json_str);
- }
+
+void protocol_build_volt_json(devCellPointMap* item)
+{
+ int val = 0;
+ char key[10] = {0};
+ cJSON* root = cJSON_CreateObject();
+
+ cJSON_AddNumberToObject(root, "timeStamp", drv_rtc_get_tick());
+
+ // devData 数组
+ cJSON* devDataArr = cJSON_CreateArray();
+ cJSON_AddItemToObject(root, "devData", devDataArr);
+
+ // 构建每一个设备项
+ cJSON* deviceObj = cJSON_CreateObject();
+ cJSON_AddItemToArray(devDataArr, deviceObj);
+
+ cJSON_AddStringToObject(deviceObj, "devType", "4");
+ cJSON_AddStringToObject(deviceObj, "devName", "BCU");
+ cJSON_AddStringToObject(deviceObj, "devId", "001");
+ cJSON_AddStringToObject(deviceObj, "sn", "SN123456");
+
+ // 构建 data 对象
+ cJSON* dataObj = cJSON_CreateObject();
+ cJSON_AddItemToObject(deviceObj, "data", dataObj);
+
+
+ for (int i = item->startCellIndex; i <= item->endCellIndex; ++i)
+ {
+
+ const devPointMap* point = item->get_val(i);
+ if (bms_points[i].get_val != NULL)
+ {
+ val = point->get_val(point->input);
+ }
+ else
+ {
+ val = 0; // 默认值
+ }
+ cJSON_AddNumberToObject(dataObj, point->key, val);
+ }
+
+ // 转为 JSON 字符串
+ char* json_str = cJSON_PrintUnformatted(root);
+ if (json_str)
+ {
+ drv_mqtt_publish(json_str, strlen(json_str));
+ cJSON_free(json_str);
+ }
+
+ cJSON_Delete(root);
+}
+
+
+void publish_all_bms_groups(void)
+{
+ uint8_t max_group = 0;
+
+ for (size_t i = 0; i < bms_point_count; i++)
+ {
+ if (bms_points[i].groupId > max_group)
+ {
+ max_group = bms_points[i].groupId;
+ }
+ }
+
+ for (uint8_t g = 0; g <= max_group; g++)
+ {
+ protocol_build_json(g);
+ }
+}
+
+void mqtt_publish_bms_data(uint32_t basetime)
+{
+ static uint32_t mqtt_cycle_tick = 0;
+ static uint8_t groupMax = 0;
+ uint16_t i = 0;
+
+ mqtt_cycle_tick += basetime;
+
+ if(mqtt_cycle_tick > 60000)
+ {
+ mqtt_cycle_tick = 0;
+ publish_all_bms_groups();
+ }
}
diff --git a/app/stm32fxxx_app/protocol/protocol_mqtt_bcu.h b/app/stm32fxxx_app/protocol/protocol_mqtt_bcu.h
index d28ef31..0e9bd65 100644
--- a/app/stm32fxxx_app/protocol/protocol_mqtt_bcu.h
+++ b/app/stm32fxxx_app/protocol/protocol_mqtt_bcu.h
@@ -21,13 +21,22 @@ extern "C" {
typedef struct {
const char* key; // JSON 中的键,比如 "BCU_2"
- uint8_t groupId; // mqtt因为json长度限制,这里面用于分组传输,从0开始,
- uint16_t input; // get_val的入参,用于获取key对应的数据
+ uint8_t groupId; // mqtt因为json长度限制,这里面用于分组传输,从0开始,
+ uint16_t input; // get_val的入参,用于获取key对应的数据
uint32_t (*get_val)(uint16_t); // 对应值的获取函数
} devPointMap;
+typedef struct {
+ const char* key; // JSON 中的键,比如 "BCU_"后面不带数字,数据后面通过BCU_pointId组合
+ uint16_t pointId; // 用于记录开始的测点号,见bcu模型
+ uint16_t startCellIndex; // 开始的电压序号(入参)
+ uint16_t endCellIndex; // 结束的电压序号(入参)
+ uint32_t (*get_val)(uint16_t); // 对应值的获取函数
+} devCellPointMap;
extern const devPointMap bms_points[];
+extern const devCellPointMap bms_volt_points[];
+extern const devCellPointMap bms_temp_points[];
void mqtt_publish_bms_data(uint32_t basetime);
diff --git a/app/stm32fxxx_app/protocol/protocol_mqtt_bcu.h.orig b/app/stm32fxxx_app/protocol/protocol_mqtt_bcu.h.orig
index 61bf6d7..d28ef31 100644
--- a/app/stm32fxxx_app/protocol/protocol_mqtt_bcu.h.orig
+++ b/app/stm32fxxx_app/protocol/protocol_mqtt_bcu.h.orig
@@ -10,17 +10,19 @@
#ifdef __cplusplus
extern "C" {
-#endif
-
+#endif
+
#include
#include
#include
#include "cJSON.h"
#include "drv_qfc41d.h"
#include "drv_rtc.h"
-
+
typedef struct {
- const char* key; // JSON 中的键,比如 "BCU_2"
+ const char* key; // JSON 中的键,比如 "BCU_2"
+ uint8_t groupId; // mqtt因为json长度限制,这里面用于分组传输,从0开始,
+ uint16_t input; // get_val的入参,用于获取key对应的数据
uint32_t (*get_val)(uint16_t); // 对应值的获取函数
} devPointMap;
@@ -28,9 +30,9 @@ typedef struct {
extern const devPointMap bms_points[];
void mqtt_publish_bms_data(uint32_t basetime);
-
+
#ifdef __cplusplus
}
#endif
-
+
#endif
\ No newline at end of file