forked from gary/BCU
2
0
Fork 0
BCU/app/stm32fxxx_app/protocol/protocol_can_bcu.c

699 lines
20 KiB
C
Raw Normal View History

2024-11-26 15:52:49 +08:00
#include "kit_data.h"
#include "bsp_can.h"
#include "bsp_eeprom.h"
#include "bmu_manager.h"
#include "iso_check.h"
#include "version_manager.h"
#include "soc_calculate.h"
#include "sop_calculate.h"
#include "fault_manager.h"
#include "hv_adc_manager.h"
#include "eeprom_manager.h"
#include "dido_manager.h"
#include "statistic_manager.h"
#include "run_status.h"
#include "bmu_manager.h"
#include "protocol_comm.h"
//BCU广播报文1
void bcu_send_0x18010000(can_dev_e can)
{
uint8_t len = 0, buf[8];
uint16_t tmp_16u;
uint8_t tmp_8u,status;
static uint8_t heart_bit = 0;
switch(bms_get_run_status())
{
case kRunStatus_Init:
status = 0;
break;
case kRunStatus_Standby:
status = 1;
break;
case kRunStatus_Chg:
status = 2;
break;
case kRunStatus_Dis:
status = 3;
default:
break;
}
//电池组总电压
tmp_16u = bms_get_statistic_data(kStatisticData_TotalVolt);
WRITE_LT_INT16U(buf, len, tmp_16u);
//电池组充/放电总电流
tmp_16u = bms_get_current() + 32000;
WRITE_LT_INT16U(buf, len, tmp_16u);
//电池模块SOC
tmp_8u = (uint8_t )(bms_get_soc()/100);
WRITE_LT_INT8U(buf, len, tmp_8u);
//电池模块SOH
tmp_8u = (uint8_t)(bms_get_soh()/100);
WRITE_LT_INT8U(buf, len, tmp_8u);
//BMS工作状态
tmp_8u = status;
WRITE_LT_INT8U(buf, len, tmp_8u);
//BMS心跳
tmp_8u = heart_bit++;
WRITE_LT_INT8U(buf, len, tmp_8u);
2025-02-06 15:08:48 +08:00
bsp_can_ext_data_sync_send(can, 0x18010000, buf, len);
2024-11-26 15:52:49 +08:00
}
//BCU广播报文2
void bcu_send_0x18020000(can_dev_e can)
{
uint8_t len = 0, buf[8];
uint16_t tmp_16u;
//电池总容量
tmp_16u = get_eeprom_data(kEep_RatedCapacity, kEepromDataType_Full);
WRITE_LT_INT16U(buf, len, tmp_16u);
//电池剩余容量
tmp_16u = (uint32_t)bms_get_soc()*get_eeprom_data(kEep_RatedCapacity, kEepromDataType_Full)/10000;;
WRITE_LT_INT16U(buf, len, tmp_16u);
//系统额定电量
tmp_16u = get_eeprom_data(kEep_RatedCapacity, kEepromDataType_Full)*get_eeprom_data(kEep_RatedTotalVolt, kEepromDataType_Full)/10000;
WRITE_LT_INT16U(buf, len, tmp_16u);
//预留
WRITE_LT_INT16U(buf, len, 0);
bsp_can_ext_data_sync_send(can, 0x18020000, buf, len);
}
//BCU广播报文3
void bcu_send_0x18030000(can_dev_e can)
{
uint8_t len = 0, buf[8];
uint16_t tmp_16u;
//在线电池总数
tmp_16u = bms_get_statistic_data(kStatisticData_OnlineCellNum);
WRITE_LT_INT16U(buf, len, tmp_16u);
//在线温感总数
tmp_16u = get_eeprom_data(kEep_TempNum, kEepromDataType_Full);
WRITE_LT_INT16U(buf, len, tmp_16u);
//循环次数
tmp_16u = bms_get_cycle();
WRITE_LT_INT16U(buf, len, tmp_16u);
//预留
tmp_16u = 0;
WRITE_LT_INT16U(buf, len, tmp_16u);
bsp_can_ext_data_sync_send(can, 0x18030000, buf, len);
}
//BCU广播报文4
void bcu_send_0x18040000(can_dev_e can)
{
uint8_t len = 0, buf[8];
uint16_t tmp_16u;
//最大允许充电电流
tmp_16u = bms_get_sop_data(kSopData_ChgCur);
WRITE_LT_INT16U(buf, len, tmp_16u);
//最大允许放电电流
tmp_16u = bms_get_sop_data(kSopData_DisCur);
WRITE_LT_INT16U(buf, len, tmp_16u);
//最大允许充电功率
tmp_16u = bms_get_sop_data(kSopData_ChgCur) * bms_get_statistic_data(kStatisticData_TotalVolt) / 10000;
WRITE_LT_INT16U(buf, len, tmp_16u);
//最大允许放电功率
tmp_16u = get_eeprom_data(kEep_DisLTVoltLTAlarm1, kEepromDataType_Full);
WRITE_LT_INT16U(buf, len, tmp_16u);
bsp_can_ext_data_sync_send(can, 0x18040000, buf, len);
}
//BCU广播报文5
void bcu_send_0x18050000(can_dev_e can)
{
uint8_t len = 0, buf[8];
uint16_t tmp_16u;
//最高单体电压
tmp_16u = bms_get_statistic_data(kStatisticData_MaxVolt);
WRITE_LT_INT16U(buf, len, tmp_16u);
//最低单体电压
tmp_16u = bms_get_statistic_data(kStatisticData_MinVolt);
WRITE_LT_INT16U(buf, len, tmp_16u);
//最大压差
tmp_16u = bms_get_statistic_data(kStatisticData_VoltDiff);
WRITE_LT_INT16U(buf, len, tmp_16u);
//平均电压
tmp_16u = bms_get_statistic_data(kStatisticData_AvgVolt);
WRITE_LT_INT16U(buf, len, tmp_16u);
bsp_can_ext_data_sync_send(can, 0x18050000, buf, len);
}
//BCU广播报文6
void bcu_send_0x18060000(can_dev_e can)
{
uint8_t len = 0, buf[8];
uint16_t tmp_16u;
//最高单体温度
tmp_16u = bms_get_statistic_data(kStatisticData_MaxTemp);
WRITE_LT_INT16U(buf, len, tmp_16u);
//最低单体温度
tmp_16u = bms_get_statistic_data(kStatisticData_MinTemp);
WRITE_LT_INT16U(buf, len, tmp_16u);
//单体温差
tmp_16u = bms_get_statistic_data(kStatisticData_TempDiff);
WRITE_LT_INT16U(buf, len, tmp_16u);
//平均温度
tmp_16u = bms_get_statistic_data(kStatisticData_AvgTemp);
WRITE_LT_INT16U(buf, len, tmp_16u);
bsp_can_ext_data_sync_send(can, 0x1806FF00, buf, len);
}
//BCU广播报文7
void bcu_send_0x18070000(can_dev_e can)
{
uint8_t len = 0, buf[8];
uint8_t tmp_8u;
//最高单体电压从机序号
tmp_8u = bms_get_statistic_data(kStatisticData_MaxVoltBmuIdx) + 1;
WRITE_LT_INT8U(buf, len, tmp_8u);
//最高单体电压电池序号
tmp_8u = bms_get_statistic_data(kStatisticData_MaxVoltIdx) + 1;
WRITE_LT_INT8U(buf, len, tmp_8u);
//最低单体电压从机序号
tmp_8u = bms_get_statistic_data(kStatisticData_MinVoltBmuIdx) + 1;
WRITE_LT_INT8U(buf, len, tmp_8u);
//最低单体电压电池序号
tmp_8u = bms_get_statistic_data(kStatisticData_MinVoltIdx) + 1;
WRITE_LT_INT8U(buf, len, tmp_8u);
//最高单体温度从机序号
tmp_8u = bms_get_statistic_data(kStatisticData_MaxTempBmuIdx) + 1;
WRITE_LT_INT8U(buf, len, tmp_8u);
//最高单体温度温感序号
tmp_8u = bms_get_statistic_data(kStatisticData_MaxTempIdx) + 1;
WRITE_LT_INT8U(buf, len, tmp_8u);
//最低单体温度从机序号
tmp_8u = bms_get_statistic_data(kStatisticData_MinTempBmuIdx) + 1;
WRITE_LT_INT8U(buf, len, tmp_8u);
//最低单体温度温感序号
tmp_8u = bms_get_statistic_data(kStatisticData_MinTempIdx) + 1;
WRITE_LT_INT8U(buf, len, tmp_8u);
bsp_can_ext_data_sync_send(can, 0x18070000, buf, len);
}
#include "signal_manager.h"
//BCU广播报文8
void bcu_send_0x18080000(can_dev_e can)
{
uint8_t len = 0, buf[8];
uint8_t tmp_8u;
//故障最高等级
tmp_8u = bms_get_max_fault_level();
WRITE_LT_INT8U(buf, len, tmp_8u);
//断继电器故障
tmp_8u = (bms_get_fault_relay_off_bit() != 0);
WRITE_LT_INT8U(buf, len, tmp_8u);
//禁充标志
tmp_8u = (bms_get_signal(kSignalIdx_ForbidChg) == kSignalStatus_High);
WRITE_LT_INT8U(buf, len, tmp_8u);
//禁放标志
tmp_8u = (bms_get_signal(kSignalIdx_ForbidDis) == kSignalStatus_High);
WRITE_LT_INT8U(buf, len, tmp_8u);
WRITE_LT_INT32U(buf, len, 0);
bsp_can_ext_data_sync_send(can, 0x18080000, buf, len);
}
void bcu_can_receive(CanMsg *msg, can_dev_e can)
{
uint8_t code = 0,value = 0;
if(msg->id.value == 0x181CFFF4)
{
code = msg->data.byte[0];
value = msg->data.byte[1];
if(code == 1)
{
bsp_eeprom_save_data(kEep_ChgDisChangeBasis_RelayOnOffMode, value,kEepromDataType_Low);
}
if(code == 0 && get_eeprom_data(kEep_ChgDisChangeBasis_RelayOnOffMode, kEepromDataType_Low) == kRunCtrl_Cmd)
{
bms_set_circuit_cmd_status((CircuitStatus)value);
}
}
}
void bcu_can_send(uint32_t base_time,can_dev_e can)
{
static uint32_t dly = 0;
dly += base_time;
if((dly % 100) == 0)
{
dly = 0;
bcu_send_0x18010000(can);
bcu_send_0x18020000(can);
bcu_send_0x18030000(can);
bcu_send_0x18040000(can);
bcu_send_0x18050000(can);
bcu_send_0x18060000(can);
bcu_send_0x18070000(can);
bcu_send_0x18080000(can);
}
}
void protocol_can_bcu_init(can_dev_e can)
{
protocol_can_set_call(can, bcu_can_receive, bcu_can_send,NULL);
}
2025-02-06 15:08:48 +08:00
2025-04-09 15:17:27 +08:00
/*********************pylon can*********************/
/*********************pylon can*********************/
/*********************pylon can*********************/
void bcu_send_0x42100000(can_dev_e can)
{
uint8_t len = 0, buf[8];
uint16_t tmp_16u;
uint8_t tmp_8u;
//电池组总电压
tmp_16u = bms_get_statistic_data(kStatisticData_TotalVolt);
WRITE_LT_INT16U(buf, len, tmp_16u);
//电池组充/放电总电流
tmp_16u = bms_get_current();
WRITE_LT_INT16U(buf, len, tmp_16u);
//主控温度--我们点表中没有,用单体平均温度替代
tmp_16u = bms_get_statistic_data(kStatisticData_AvgTemp);
WRITE_LT_INT16U(buf, len, tmp_16u);
//电池模块SOC
tmp_8u = (uint8_t )(bms_get_soc()/100);
WRITE_LT_INT8U(buf, len, tmp_8u);
//电池模块SOH
tmp_8u = (uint8_t)(bms_get_soh()/100);
WRITE_LT_INT8U(buf, len, tmp_8u);
2025-04-15 19:21:49 +08:00
bsp_can_ext_data_sync_send(can, 0x00004210, buf, len);
2025-04-09 15:17:27 +08:00
}
void bcu_send_0x42200000(can_dev_e can)
{
uint8_t len = 0, buf[8];
uint16_t tmp_16u;
//充电截止电压
tmp_16u = get_eeprom_data(kEep_ChgHTVoltHTAlarm1, kEepromDataType_Full);
WRITE_LT_INT16U(buf, len, tmp_16u);
//放点截止电压
tmp_16u = get_eeprom_data(kEep_DisLTVoltHTAlarm1, kEepromDataType_Full);
WRITE_LT_INT16U(buf, len, tmp_16u);
//最大充电电流
tmp_16u = bms_get_sop_data(kSopData_ChgCur);
WRITE_LT_INT16U(buf, len, tmp_16u);
//最大放电电流
tmp_16u = bms_get_sop_data(kSopData_DisCur);
WRITE_LT_INT16U(buf, len, tmp_16u);
2025-04-15 19:21:49 +08:00
bsp_can_ext_data_sync_send(can, 0x00004220, buf, len);
2025-04-09 15:17:27 +08:00
}
void bcu_send_0x42300000(can_dev_e can)
{
uint8_t len = 0, buf[8];
uint16_t tmp_16u;
//最高单体电池电压
tmp_16u = bms_get_statistic_data(kStatisticData_MaxVolt);
WRITE_LT_INT16U(buf, len, tmp_16u);
//最低单体电池电压
tmp_16u = bms_get_statistic_data(kStatisticData_MinVolt);
WRITE_LT_INT16U(buf, len, tmp_16u);
//最高单体电池电压编号
tmp_16u = bms_get_statistic_data(kStatisticData_MaxVoltIdx) + 1;
WRITE_LT_INT16U(buf, len, tmp_16u);
//最低单体电池电压编号
tmp_16u = bms_get_statistic_data(kStatisticData_MinVoltIdx) + 1;
WRITE_LT_INT16U(buf, len, tmp_16u);
2025-04-15 19:21:49 +08:00
bsp_can_ext_data_sync_send(can, 0x00004230, buf, len);
2025-04-09 15:17:27 +08:00
}
void bcu_send_0x42400000(can_dev_e can)
{
uint8_t len = 0, buf[8];
uint16_t tmp_16u;
//最高单体电池温度
tmp_16u = bms_get_statistic_data(kStatisticData_MaxTemp);
WRITE_LT_INT16U(buf, len, tmp_16u);
//最低单体电池温度
tmp_16u = bms_get_statistic_data(kStatisticData_MinTemp);
WRITE_LT_INT16U(buf, len, tmp_16u);
//最高单体电池温度编号
tmp_16u = bms_get_statistic_data(kStatisticData_MaxTempIdx) + 1;
WRITE_LT_INT16U(buf, len, tmp_16u);
//最低单体电池温度编号
tmp_16u = bms_get_statistic_data(kStatisticData_MinTempIdx) + 1;
WRITE_LT_INT16U(buf, len, tmp_16u);
2025-04-15 19:21:49 +08:00
bsp_can_ext_data_sync_send(can, 0x00004240, buf, len);
2025-04-09 15:17:27 +08:00
}
void bcu_send_0x42500000(can_dev_e can)
{
uint8_t len = 0, buf[8];
uint16_t tmp_16u;
uint8_t tmp_8u, status;
uint16_t temp_second;
uint16_t temp_third;
/* 基本状态
pylon bluesun
0
1
2
3
*/
switch(bms_get_run_status())
{
case kRunStatus_Standby:
status = 0;
break;
case kRunStatus_Chg:
status = 1;
break;
case kRunStatus_Dis:
status = 2;
break;
case kRunStatus_PwrOff:
status = 3;
default:
break;
}
//基本状态
tmp_8u = status;
WRITE_LT_INT8U(buf, len, tmp_8u);
//循环周期
tmp_16u = bms_get_cycle();
WRITE_LT_INT16U(buf, len, tmp_16u);
//故障--无
tmp_8u = 0;
WRITE_LT_INT8U(buf, len, tmp_8u);
//告警--二三级放入告警中
//每个告警的位的位置需要测一下
temp_second = set_bit_based_on_source_pylon(status, kFaultLevel_Second);
temp_third = set_bit_based_on_source_pylon(status, kFaultLevel_Third);
tmp_16u = temp_second | temp_third;
WRITE_LT_INT16U(buf, len, tmp_16u);
//保护--一级放入保护中
//每个告警的位的位置需要测一下
tmp_16u = set_bit_based_on_source_pylon(status, kFaultLevel_First);
WRITE_LT_INT16U(buf, len, tmp_16u);
2025-04-15 19:21:49 +08:00
bsp_can_ext_data_sync_send(can, 0x00004250, buf, len);
2025-04-09 15:17:27 +08:00
}
void bcu_send_0x42600000(can_dev_e can)
{
uint8_t len = 0, buf[8];
uint16_t tmp_16u;
//最高电池模块电压--无,用单体平均电压×16代替
tmp_16u = bms_get_statistic_data(kStatisticData_AvgVolt) * 16;
WRITE_LT_INT16U(buf, len, tmp_16u);
//最低电池模块电压--无用单体平均电压×16代替
tmp_16u = bms_get_statistic_data(kStatisticData_AvgVolt) * 16;
WRITE_LT_INT16U(buf, len, tmp_16u);
//最高电池模块电压编号--无,用单体从机号代替
tmp_16u = bms_get_statistic_data(kStatisticData_MaxVoltBmuIdx) + 1;
WRITE_LT_INT16U(buf, len, tmp_16u);
//最低电池模块电压编号--无,用单体从机号代替
tmp_16u = bms_get_statistic_data(kStatisticData_MinVoltBmuIdx) + 1;
WRITE_LT_INT16U(buf, len, tmp_16u);
2025-04-15 19:21:49 +08:00
bsp_can_ext_data_sync_send(can, 0x00004260, buf, len);
2025-04-09 15:17:27 +08:00
}
void bcu_send_0x42700000(can_dev_e can)
{
uint8_t len = 0, buf[8];
uint16_t tmp_16u;
//最高电池模块温度--无,用最高单体温度代替
tmp_16u = bms_get_statistic_data(kStatisticData_MaxTemp);
WRITE_LT_INT16U(buf, len, tmp_16u);
//最低电池模块温度--无,用最低单体温度代替
tmp_16u = bms_get_statistic_data(kStatisticData_MinTemp);
WRITE_LT_INT16U(buf, len, tmp_16u);
//最高电池模块温度编号--无,用单体从机号代替
tmp_16u = bms_get_statistic_data(kStatisticData_MaxTempBmuIdx) + 1;
WRITE_LT_INT16U(buf, len, tmp_16u);
//最低电池模块温度编号--无,用单体从机号代替
tmp_16u = bms_get_statistic_data(kStatisticData_MinTempBmuIdx) + 1;
WRITE_LT_INT16U(buf, len, tmp_16u);
2025-04-15 19:21:49 +08:00
bsp_can_ext_data_sync_send(can, 0x00004270, buf, len);
2025-04-09 15:17:27 +08:00
}
2025-02-06 15:08:48 +08:00
2025-04-09 15:17:27 +08:00
void bcu_send_0x42800000(can_dev_e can)
{
uint8_t len = 0, buf[8];
uint16_t tmp_16u;
uint8_t tmp_8u;
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;
}
//禁止充电标志
if ((bms_stu & 0x10) >> 4 == 1)
{
tmp_8u = 0xAA;
}
else
{
tmp_8u = 0;
}
WRITE_LT_INT8U(buf, len, tmp_8u);
//禁止放电标志
if ((bms_stu & 0x10) >> 5 == 1)
{
tmp_8u = 0xAA;
}
else
{
tmp_8u = 0;
}
WRITE_LT_INT8U(buf, len, tmp_8u);
//预留
tmp_16u = 0;
WRITE_LT_INT16U(buf, len, tmp_16u);
//预留
tmp_16u = 0;
WRITE_LT_INT16U(buf, len, tmp_16u);
//预留
tmp_16u = 0;
WRITE_LT_INT16U(buf, len, tmp_16u);
2025-04-15 19:21:49 +08:00
bsp_can_ext_data_sync_send(can, 0x00004280, buf, len);
2025-04-09 15:17:27 +08:00
}
void bcu_send_0x73100000(can_dev_e can)
{
uint8_t len = 0, buf[8];
uint16_t tmp_16u;
uint8_t tmp_8u;
//Hardware Version
tmp_8u = 1;
WRITE_LT_INT8U(buf, len, tmp_8u);
//预留
tmp_8u = 1;
WRITE_LT_INT8U(buf, len, tmp_8u);
//硬件版本-V
tmp_8u = 1;
WRITE_LT_INT8U(buf, len, tmp_8u);
//硬件版本-R
tmp_8u = 1;
WRITE_LT_INT8U(buf, len, tmp_8u);
//软件版本-V主版本Major
tmp_8u = 1;
WRITE_LT_INT8U(buf, len, tmp_8u);
//软件版本-V子版本Minor
tmp_8u = 1;
WRITE_LT_INT8U(buf, len, tmp_8u);
//开发主版本
tmp_8u = 1;
WRITE_LT_INT8U(buf, len, tmp_8u);
//开发子版本
tmp_8u = 1;
WRITE_LT_INT8U(buf, len, tmp_8u);
2025-04-15 19:21:49 +08:00
bsp_can_ext_data_sync_send(can, 0x00007310, buf, len);
2025-04-09 15:17:27 +08:00
}
void bcu_can_send_pylon(uint32_t base_time,can_dev_e can)
{
static uint32_t dly = 0;
dly += base_time;
if((dly % 100) == 0)
{
dly = 0;
bcu_send_0x42100000(can);
bcu_send_0x42200000(can);
bcu_send_0x42300000(can);
bcu_send_0x42400000(can);
bcu_send_0x42500000(can);
bcu_send_0x42600000(can);
bcu_send_0x42700000(can);
bcu_send_0x42800000(can);
bcu_send_0x73100000(can);
}
}
uint16_t set_bit_based_on_source_pylon(uint8_t status, FaultLevel alarmLevel)
{
uint16_t tmp_16u = 0;
if (KIT_GET_BIT_32(bms_get_fault_single_bit(0 , alarmLevel), 0)) //一级总压过压--电池组充电高压保护
{
if (status == 1)
{
KIT_SET_BIT_MASK_32(tmp_16u, 3);
//tmp_16u = set_bit_based_on_source_pylon(bms_get_fault_single_bit(0 , kFaultLevel_First), 0, tmp_16u, 3);
}
}
if (KIT_GET_BIT_32(bms_get_fault_single_bit(0 , alarmLevel), 1)) //一级总压欠压--电池组放电低压保护
{
if (status == 2)
{
KIT_SET_BIT_MASK_32(tmp_16u, 2);
//tmp_16u = set_bit_based_on_source_pylon(bms_get_fault_single_bit(0 , kFaultLevel_First), 1, tmp_16u, 2);
}
}
if (KIT_GET_BIT_32(bms_get_fault_single_bit(0 , alarmLevel), 2)) //一级单体过压--电池单体高压保护
{
KIT_SET_BIT_MASK_32(tmp_16u, 1);
//tmp_16u = set_bit_based_on_source_pylon(bms_get_fault_single_bit(0 , kFaultLevel_First), 2, tmp_16u, 1);
}
if (KIT_GET_BIT_32(bms_get_fault_single_bit(0 , alarmLevel), 3)) //一级单体欠压--电池单体低压保护
{
KIT_SET_BIT_MASK_32(tmp_16u, 0);
//tmp_16u = set_bit_based_on_source_pylon(bms_get_fault_single_bit(0 , kFaultLevel_First), 3, tmp_16u, 0);
}
if (KIT_GET_BIT_32(bms_get_fault_single_bit(0 , alarmLevel), 4)) //一级单体过温--充电高温保护 && 放电高温保护
{
if (status == 1)
{
KIT_SET_BIT_MASK_32(tmp_16u, 5);
//tmp_16u = set_bit_based_on_source_pylon(bms_get_fault_single_bit(0 , kFaultLevel_First), 4, tmp_16u, 5);
}
else if (status == 2)
{
KIT_SET_BIT_MASK_32(tmp_16u, 7);
//tmp_16u = set_bit_based_on_source_pylon(bms_get_fault_single_bit(0 , kFaultLevel_First), 4, tmp_16u, 7);
}
}
if (KIT_GET_BIT_32(bms_get_fault_single_bit(0 , alarmLevel), 5)) //一级单体低温--充电低温保护 && 放电低温保护
{
if (status == 1)
{
KIT_SET_BIT_MASK_32(tmp_16u, 4);
//tmp_16u = set_bit_based_on_source_pylon(bms_get_fault_single_bit(0 , kFaultLevel_First), 5, tmp_16u, 4);
}
else if (status == 2)
{
KIT_SET_BIT_MASK_32(tmp_16u, 6);
//tmp_16u = set_bit_based_on_source_pylon(bms_get_fault_single_bit(0 , kFaultLevel_First), 5, tmp_16u, 6);
}
}
if (KIT_GET_BIT_32(bms_get_fault_single_bit(0 , alarmLevel), 8)) //一级电流过大--电池组充电过流保护 && 电池组放电过流保护
{
if (status == 1)
{
KIT_SET_BIT_MASK_32(tmp_16u, 8);
//tmp_16u = set_bit_based_on_source_pylon(bms_get_fault_single_bit(0 , kFaultLevel_First), 8, tmp_16u, 8);
}
else if (status == 2)
{
KIT_SET_BIT_MASK_32(tmp_16u, 9);
//tmp_16u = set_bit_based_on_source_pylon(bms_get_fault_single_bit(0 , kFaultLevel_First), 8, tmp_16u, 9);
}
}
return tmp_16u;
}
//pylon接收函数休眠和唤醒控制充电放电命令
void bcu_can_receive_pylon(CanMsg *msg, can_dev_e can)
{
uint8_t code = 0,value = 0, statusChg = 0, statusDischg = 0;
if(msg->id.value == 0x620)
{
code = msg->data.byte[0];
if(code == 0x55)
{
//控制设备进入休眠状态,断开总正总负继电器
bms_crtl_do_status(kDoType_Positive, kDoCtrlStatus_Off, 100);
bms_crtl_do_status(kDoType_Negative, kDoCtrlStatus_Off, 100);
}
else if (code == 0xAA)
{
//控制设备退出休眠状态,闭合总正总负继电器
bms_crtl_do_status(kDoType_Positive, kDoCtrlStatus_On, 100);
bms_crtl_do_status(kDoType_Negative, kDoCtrlStatus_On, 100);
}
}
if(msg->id.value == 0x621)
{
statusChg = msg->data.byte[0];
statusDischg = msg->data.byte[1];
if(statusChg == 0xAA)
{
//充电命令,闭合总正总负继电器
bms_crtl_do_status(kDoType_Positive, kDoCtrlStatus_On, 100);
bms_crtl_do_status(kDoType_Negative, kDoCtrlStatus_On, 100);
}
else if (statusDischg == 0xAA)
{
//放电命令,闭合总正总负继电器
bms_crtl_do_status(kDoType_Positive, kDoCtrlStatus_On, 100);
bms_crtl_do_status(kDoType_Negative, kDoCtrlStatus_On, 100);
}
}
}
void protocol_pylon_can_init(can_dev_e can)
{
protocol_can_set_call(can, bcu_can_receive_pylon, bcu_can_send_pylon, NULL);
}
2025-02-06 15:08:48 +08:00