b61c21c648
Signed-off-by: lidun <1084178170@qq.com>
1396 lines
44 KiB
C
1396 lines
44 KiB
C
#include "can.h"
|
||
#include "REV_CarMessage.h"
|
||
#include <stdbool.h>
|
||
#include <string.h>
|
||
#include "CDZ_DATA.h"
|
||
#include "Err_Info_Process.h"
|
||
#include "Err_code.h"
|
||
|
||
#define DEBUG_BMS 1
|
||
|
||
#if DEBUG_BMS > 0
|
||
#define BMS_PRINT DEPRINT
|
||
#define BMS_PRINT_ARRAY DEPRINT_ARRAY
|
||
#else
|
||
#define BMS_PRINT
|
||
#define BMS_PRINT_ARRAY
|
||
#endif
|
||
|
||
|
||
extern uint8_t stopChargeReason;
|
||
extern int8_t can_write( CanTxMsg *TxMessage);
|
||
extern int8_t can_write2( CanTxMsg *TxMessage);
|
||
|
||
// SOC
|
||
uint8_t Bms_BatChargeRealObdBatCurSOC = 0 ;
|
||
|
||
|
||
//bms 发送报文 握手
|
||
void bms_SendBHM(uint16_t MaxVoltage);
|
||
//bms 发送报文 辨识
|
||
void bms_SendBRM(uint16_t step);
|
||
//bms 发送报文 动力蓄电池参数
|
||
void bms_SendBCP(uint16_t step);
|
||
// 电池准备就绪状态 BRO
|
||
//0x0--BMS不能辨识 0xaa--BMS能辨识
|
||
void bms_SendBRO(uint8_t Ready);
|
||
//电池充电需求 BCL
|
||
void bms_SendBCL(void);
|
||
//bms 发送报文 电池总状态 BCS
|
||
void bms_SendBCS(uint16_t step);
|
||
//bms 发送报文 动力蓄电池 状态 BSM
|
||
void bms_SendBSM(uint16_t step);
|
||
//bms 发送报文 中止充电报文 BST
|
||
void bms_SendBST(uint16_t step);
|
||
//bms 发送报文 BMS统计报文 BSD
|
||
void bms_SendBSD(uint16_t step);
|
||
//bms 发送报文 BMS错误报文 BEM
|
||
void bms_SendBEM(uint16_t step);
|
||
|
||
|
||
record_t ChargeRecordInfo ={0}; //
|
||
|
||
|
||
ChargeParam_t CDZ_ChargeInfo;
|
||
|
||
|
||
/*参数初始化定义*/
|
||
|
||
Bms_BatInfo_t Bms_BatInfo;
|
||
/* 充电配置参数 */
|
||
static CDZ_BAT_CONFIG_PARAM_t Bms_BatConfigParam ;
|
||
/*充电阶段参数信息*/
|
||
Bms_BatRealInfo_t Bms_BatChargeRealInfo ;
|
||
CanRxMsg BMSCAN1Msg;
|
||
CanTxMsg BMS_CanTxData;
|
||
CanTxMsg BMS_Can2TxData;
|
||
|
||
|
||
void BmsParaDataInit(void)
|
||
{
|
||
|
||
}
|
||
|
||
|
||
/************************************************************************
|
||
* Function: HEX2BCD
|
||
* Description: ?16??????BCD?
|
||
* Input: hex: ?????16??
|
||
* Return: ?????BCD?
|
||
**************************************************************************/
|
||
u8 HEX2BCD(u8 hex)
|
||
{
|
||
return (((hex / 10) << 4) & 0xf0) | ((hex % 10) & 0xf);
|
||
}
|
||
/************************************************************************
|
||
* Function: BCD2HEX
|
||
* Description: ?BCD????16??
|
||
* Input: bcd: ?????BCD?
|
||
* Return: ?????16????
|
||
**************************************************************************/
|
||
u8 BCD2HEX(u8 bcd)
|
||
{
|
||
return (((bcd >> 4) & 0xf) * 10 + (bcd & 0xf));
|
||
}
|
||
|
||
//===========================充电桩各个报文解析 ====================================
|
||
//充电桩握手
|
||
static int8_t CDZ_ParseCHM(const uint8_t *pData, int32_t iLen, int8_t Ch)
|
||
{
|
||
if(iLen >3)iLen =3;
|
||
memcpy(CDZ_ChargeInfo.VersionNo,pData,iLen);
|
||
return TRUE;
|
||
}
|
||
//充电桩辨识
|
||
static int8_t CDZ_ParseCRM(const uint8_t *pData, int32_t iLen, int8_t Ch)
|
||
{
|
||
if(iLen >8)iLen =8;
|
||
CDZ_ChargeInfo.identify = pData[0];
|
||
CDZ_ChargeInfo.SerialNo[0] = pData[1];
|
||
CDZ_ChargeInfo.SerialNo[1] = pData[2];
|
||
CDZ_ChargeInfo.SerialNo[2] = pData[3];
|
||
CDZ_ChargeInfo.SerialNo[3] = pData[4];
|
||
CDZ_ChargeInfo.RegionalCode[0] = pData[5];
|
||
CDZ_ChargeInfo.RegionalCode[1] = pData[6];
|
||
CDZ_ChargeInfo.RegionalCode[2] = pData[7];
|
||
return TRUE;
|
||
}
|
||
//充电桩时间同步
|
||
static int8_t CDZ_ParseCTS(const uint8_t *pData, int32_t iLen, int8_t Ch)
|
||
{
|
||
if(iLen >8)iLen =8;
|
||
CDZ_ChargeInfo.date[0] =BCD2HEX(pData[0]); // s 29
|
||
CDZ_ChargeInfo.date[1] = BCD2HEX(pData[1]);//min 59
|
||
CDZ_ChargeInfo.date[2] = BCD2HEX(pData[2]);//hour 23
|
||
CDZ_ChargeInfo.date[3] = BCD2HEX(pData[3]);//day 12
|
||
CDZ_ChargeInfo.date[4] = BCD2HEX(pData[4]); //mon 6
|
||
CDZ_ChargeInfo.date[5] = BCD2HEX(pData[5]); //year 19
|
||
CDZ_ChargeInfo.date[6] = BCD2HEX(pData[6]); //year 20
|
||
|
||
memcpy((uint8_t *)&ChargeRecordInfo.date[0],(uint8_t *)&CDZ_ChargeInfo.date[0],7) ;
|
||
|
||
return TRUE;
|
||
}
|
||
//充电桩最大输出能力
|
||
static int8_t CDZ_ParseCML(const uint8_t *pData, int32_t iLen, int8_t Ch)
|
||
{
|
||
|
||
int16_t data = 0;
|
||
CDZ_ChargeInfo.ChargeOutMaxVoltage =(pData[1] <<8) | pData[0]; // 0.1V
|
||
CDZ_ChargeInfo.ChargeOutMinVoltage =(pData[3] <<8 )| pData[2]; // 0.1V
|
||
data = (pData[5] <<8 | pData[4]);
|
||
data = data > 4000 ? (data - 4000): (4000-data);
|
||
CDZ_ChargeInfo.ChargeOutMaxCurrent =data; // 0.1A
|
||
data = (pData[7] <<8 | pData[6]);
|
||
data = data > 4000 ? (data - 4000): (4000-data);
|
||
CDZ_ChargeInfo.ChargeOutMinCurrent =data; // 0.1 A
|
||
|
||
return TRUE;
|
||
}
|
||
//充电桩准备就绪 CRO
|
||
static int8_t CDZ_ParseCRO(const uint8_t *pData, int32_t iLen, int8_t Ch)
|
||
{
|
||
CDZ_ChargeInfo.ready = pData[0]; // 0.1V
|
||
return TRUE;
|
||
}
|
||
//充电桩充电状态报文 CCS
|
||
static int8_t CDZ_ParseCCS(const uint8_t *pData, int32_t iLen, int8_t Ch)
|
||
{
|
||
int16_t data = 0;
|
||
CDZ_ChargeInfo.ChargeOutVoltage = (pData[1] <<8) + pData[0]; // 0.1V
|
||
data = (pData[3] <<8) + pData[2];
|
||
data = data > 4000 ? (data - 4000): (4000-data);
|
||
CDZ_ChargeInfo.ChargeOutCurrent = data; // 0.1A
|
||
//Bms_BatChargeRealInfo.BatRealVol =CDZ_ChargeInfo.ChargeOutVoltage ;
|
||
if(data >= 10)// 超过1A时
|
||
{
|
||
Bms_BatChargeRealInfo.BatRealCur =CDZ_ChargeInfo.ChargeOutCurrent ;
|
||
//Bms_BatChargeRealInfo.BatRealVol =CDZ_ChargeInfo.ChargeOutVoltage ;
|
||
}
|
||
else
|
||
{
|
||
Bms_BatChargeRealInfo.BatRealCur = 0 ;
|
||
}
|
||
CDZ_ChargeInfo.ChargeTime = (pData[5] <<8) + pData[4]; // 0.1V
|
||
CDZ_ChargeInfo.ChargeTime = CDZ_ChargeInfo.ChargeTime ;
|
||
CDZ_ChargeInfo.ChargeAllow = pData[6]; // 是否允许充电
|
||
|
||
return TRUE;
|
||
}
|
||
|
||
//充电桩充电中止报文 CST
|
||
static int8_t CDZ_ParseCST(const uint8_t *pData, int32_t iLen, int8_t Ch)
|
||
{
|
||
|
||
CDZ_ChargeInfo.end.stats[1] = pData[0];
|
||
CDZ_ChargeInfo.end.stats[2] = pData[1];
|
||
CDZ_ChargeInfo.end.stats[3] = pData[2];
|
||
CDZ_ChargeInfo.end.stats[4] = pData[3];
|
||
|
||
// CDZ_ChargeInfo.StopReason = pData[0]; // 0.1V
|
||
// CDZ_ChargeInfo.ChargeEndFaultCode = (pData[2] <<8) + pData[1]; // 0.1V
|
||
// CDZ_ChargeInfo.ChargeEndErrCode = pData[3]; //
|
||
|
||
return TRUE;
|
||
}
|
||
//充电桩结束阶段报文 CSD
|
||
static int8_t CDZ_ParseCSD(const uint8_t *pData, int32_t iLen, int8_t Ch)
|
||
{
|
||
|
||
// CSD 充电机统计数据报文
|
||
// CDZ_ChargeInfo.ChargeTimeTotal = (pData[1]<<8)+ pData[0]; // 0.1V
|
||
//CDZ_ChargeInfo.ChargeEnergyTotal = (pData[3] <<8) + pData[2]; // 0.1V
|
||
CDZ_ChargeInfo.SerialNumber[0] = pData[4];
|
||
CDZ_ChargeInfo.SerialNumber[1] = pData[5];
|
||
CDZ_ChargeInfo.SerialNumber[2] = pData[6];
|
||
CDZ_ChargeInfo.SerialNumber[3] = pData[7];
|
||
return TRUE;
|
||
}
|
||
//充电桩错误报文 CEM
|
||
static int8_t CDZ_ParseCEM(const uint8_t *pData, int32_t iLen, int8_t Ch)
|
||
{
|
||
// CDZ_ChargeInfo.BmsRcvCode = (pData[3] <<24) + (pData[2]<<16)+ (pData[1]<<8)+ pData[0]; // 0.1V
|
||
|
||
CDZ_ChargeInfo.end.stats[5] = pData[0];
|
||
CDZ_ChargeInfo.end.stats[6] = pData[1];
|
||
CDZ_ChargeInfo.end.stats[7] = pData[2];
|
||
CDZ_ChargeInfo.end.stats[8] = pData[3];
|
||
return TRUE;
|
||
}
|
||
|
||
|
||
/*********************************************************************************
|
||
函数名称:bms_check_status
|
||
功能描述: 充电过程检测是否收到错误报文
|
||
输 入:命令
|
||
输 出:无
|
||
返 回 值:false 故障 true 无故障
|
||
*********************************************************************************/
|
||
int8_t bms_check_status(void)
|
||
{
|
||
return TRUE;
|
||
}
|
||
|
||
/*********************************************************************************
|
||
函数名称:wulingbms_check_status
|
||
功能描述:充电过程检查车辆bms是否有故障
|
||
输 入:命令
|
||
输 出:无
|
||
返 回 值:false 故障 true 无故障
|
||
*********************************************************************************/
|
||
int8_t wulingbms_check_status(void)
|
||
{
|
||
return TRUE;
|
||
}
|
||
|
||
CanRxMsg testBMSCAN1Msg;
|
||
|
||
|
||
/*********************************************************************************
|
||
函数名称:wulingbms_check_status
|
||
功能描述:充电过程检查车辆bms是否有故障
|
||
输 入:命令
|
||
输 出:无
|
||
返 回 值:false 故障 true 无故障
|
||
*********************************************************************************/
|
||
static void bms_parseData(int32_t objId, uint8_t *cCanData, int32_t can_DataLen, int8_t Ch)
|
||
{
|
||
int8_t bParseResult = 0;
|
||
|
||
// BMS_PRINT("\n\r收到充电桩can 数据[%d]:",Ch);
|
||
// BMS_PRINT("%x \n",objId);
|
||
// BMS_PRINT_ARRAY(cCanData,can_DataLen);
|
||
//CDZ_ChargeInfo.BmsRcvTimeCount = 0;
|
||
CDZ_Time_Out_Handl();//超时处理
|
||
switch(objId)
|
||
{
|
||
case CanCHMID: //电池握手报文
|
||
|
||
bParseResult = CDZ_ParseCHM(cCanData, can_DataLen, Ch);
|
||
if (bParseResult)
|
||
{
|
||
CDZ_ChargeInfo.BmsRcvCode |= D_CDZ_HANDING_CHM;
|
||
// test_bmsrevdata =1;
|
||
//BMS_PRINT("\n\r握手报文 st_BmsStatusInfo[%d].BmsRcvCode = %x\n\r",Ch,st_BmsStatusInfo[Ch].BmsRcvCode);
|
||
}
|
||
|
||
break;
|
||
case CanCRMID:
|
||
{
|
||
bParseResult = CDZ_ParseCRM(cCanData, can_DataLen, Ch);
|
||
if (bParseResult)
|
||
{
|
||
CDZ_ChargeInfo.BmsRcvCode |= D_CDZ_HANDING_CRM;
|
||
}
|
||
break;
|
||
}
|
||
case CanCTSID:
|
||
{
|
||
bParseResult = CDZ_ParseCTS(cCanData, can_DataLen, Ch);
|
||
if (bParseResult)
|
||
{
|
||
CDZ_ChargeInfo.BmsRcvCode |= D_CDZ_CONFIG_CTS;
|
||
}
|
||
break;
|
||
}
|
||
case CanCMLID:
|
||
{
|
||
bParseResult = CDZ_ParseCML(cCanData, can_DataLen, Ch);
|
||
if (bParseResult)
|
||
{
|
||
CDZ_ChargeInfo.BmsRcvCode |= D_CDZ_CONFIG_CML;
|
||
}
|
||
break;
|
||
}
|
||
case CanCROID:
|
||
{
|
||
bParseResult = CDZ_ParseCRO(cCanData, can_DataLen, Ch);
|
||
if (bParseResult)
|
||
{
|
||
CDZ_ChargeInfo.BmsRcvCode |= D_CDZ_CONFIG_CRO;
|
||
}
|
||
break;
|
||
}
|
||
case CanCCSID:
|
||
{
|
||
bParseResult = CDZ_ParseCCS(cCanData, can_DataLen, Ch);
|
||
if (bParseResult)
|
||
{
|
||
CDZ_ChargeInfo.BmsRcvCode |= D_CDZ_CHARGE_CCS;
|
||
}
|
||
break;
|
||
}
|
||
case CanCSTID:
|
||
case CanCSTID1:
|
||
{
|
||
bParseResult = CDZ_ParseCST(cCanData, can_DataLen, Ch);
|
||
if (bParseResult)
|
||
{
|
||
CDZ_ChargeInfo.BmsRcvCode |= D_CDZ_END_CST;
|
||
}
|
||
break;
|
||
}
|
||
case CanCSDID:
|
||
{
|
||
bParseResult = CDZ_ParseCSD(cCanData, can_DataLen, Ch);
|
||
if (bParseResult)
|
||
{
|
||
CDZ_ChargeInfo.BmsRcvCode |= D_CDZ_END_CSD;
|
||
}
|
||
break;
|
||
}
|
||
case CanCEMID:
|
||
{
|
||
bParseResult = CDZ_ParseCEM(cCanData, can_DataLen, Ch);
|
||
if (bParseResult)
|
||
{
|
||
CDZ_ChargeInfo.BmsRcvCode |= D_CDZ_END_CEM;
|
||
}
|
||
break;
|
||
}
|
||
|
||
default:
|
||
break;
|
||
}
|
||
}
|
||
|
||
/*********************************************************************************
|
||
函数名称:接收充电桩数据
|
||
功能描述:接收can1数据
|
||
输 入:命令
|
||
输 出:无
|
||
返 回 值:-1异常 1正常
|
||
*********************************************************************************/
|
||
int bms_RcvCanSingleDataProc(CanRxMsg pSingleCanRxData)
|
||
{
|
||
static CanRxMsg SingleCanRxData = {0};
|
||
static uint32_t SingleId;
|
||
SingleCanRxData = pSingleCanRxData;
|
||
SingleId = SingleCanRxData.ExtId;
|
||
|
||
if((SingleCanRxData.ExtId & 0x0000FFFF) != 0x0000F456) //不是充电桩报文
|
||
return -1;
|
||
|
||
if((SingleCanRxData.ExtId & 0xFFFF0000) == CAN_CM_CTRL_ID)//收到bms多包数据连接请求
|
||
{
|
||
BMSCAN1Msg = SingleCanRxData;
|
||
return -1;
|
||
}
|
||
if((SingleCanRxData.ExtId & 0xFFFF0000) == CAN_CM_DATA_ID)//收到bms发送多包数据
|
||
{
|
||
BMSCAN1Msg = SingleCanRxData;
|
||
return -1;
|
||
}
|
||
|
||
if(
|
||
(SingleId == CanCHMID) || (SingleId== CanCRMID) ||
|
||
(SingleId == CanCTSID) || (SingleId == CanCMLID) ||
|
||
(SingleId == CanCROID) || (SingleId == CanCCSID) ||
|
||
(SingleId == CanCSDID) || (SingleId == CanCEMID) ||
|
||
(SingleId == CanCSTID) || (SingleId == CanCSTID1)
|
||
)
|
||
{
|
||
testBMSCAN1Msg = SingleCanRxData;
|
||
bms_parseData(SingleCanRxData.ExtId, SingleCanRxData.Data, SingleCanRxData.DLC, 0);
|
||
}
|
||
|
||
return 0;
|
||
}
|
||
|
||
static CAN_REV_Mutli_t CanMessage;// add dxm ??bms???????
|
||
uint32_t MutliRecvTimer = 0;//add dxm
|
||
uint32_t MutliRecvCount = 0;//add dxm
|
||
|
||
/*********************************************************************************
|
||
函数名称:bms_RcvCanMutliData
|
||
功能描述:解析多包数据
|
||
输 入:can
|
||
输 出:无
|
||
返 回 值:无
|
||
*********************************************************************************/
|
||
void bms_RcvCanMutliData(CanRxMsg candata,uint8_t channel,uint8_t *flag)
|
||
{
|
||
static uint8_t uPackNum = 0;
|
||
if(CanMessage.tail < CAN_MAX_PACKET)
|
||
{
|
||
CanMessage.Msgbody[CanMessage.tail] = candata;
|
||
CanMessage.tail++;
|
||
}
|
||
|
||
if((candata.ExtId & 0xFFFF0000) == CAN_CM_CTRL_ID) //收到充电桩多包数据请求
|
||
{
|
||
if(candata.Data[0] == CM_RTS_CTRL_CODE || candata.Data[0] == CM_EMA_CTRL_CODE)
|
||
{
|
||
uPackNum = candata.Data[3];
|
||
}
|
||
else if(candata.Data[0] == CM_CTS_CTRL_CODE)
|
||
{
|
||
uPackNum = candata.Data[1];
|
||
}
|
||
MutliRecvCount = 10;//15ms????
|
||
}
|
||
else if((candata.ExtId & 0xFFFF0000) == CAN_CM_DATA_ID) //收到多包数据
|
||
{
|
||
if(uPackNum == candata.Data[0])
|
||
{
|
||
MutliRecvCount = 20;
|
||
uPackNum = 0;
|
||
}
|
||
else
|
||
{
|
||
MutliRecvCount = 50;
|
||
}
|
||
}
|
||
TickOut(&MutliRecvTimer,0);
|
||
*flag =0;
|
||
}
|
||
|
||
uint8_t bms_rev_busy_flag = 0;
|
||
|
||
|
||
|
||
volatile uint8_t MutliRecvFlag = {0};
|
||
CanRxMsg MutliBMSCAN1Msg;
|
||
|
||
/*********************************************************************************
|
||
函数名称:bms_RcvCanMutliData
|
||
功能描述:can接收中断
|
||
输 入:命令
|
||
输 出:无
|
||
返 回 值:无
|
||
*********************************************************************************/
|
||
//void USB_LP_CAN1_RX0_IRQHandler(void)
|
||
//{
|
||
// CanRxMsg RxMessage;
|
||
// CAN_Receive(CAN1,CAN_FIFO0,&RxMessage);
|
||
|
||
// bms_rev_busy_flag = 1;
|
||
|
||
// if(bms_RcvCanSingleDataProc(RxMessage) == 1)
|
||
// {
|
||
// MutliBMSCAN1Msg = RxMessage;
|
||
// bms_RcvCanMutliData(MutliBMSCAN1Msg,0,&bms_rev_busy_flag);
|
||
// }
|
||
//}
|
||
|
||
|
||
|
||
|
||
/*********************************************************************************
|
||
函数名称:Is_bms_RcvMutliMsgOverFlag
|
||
功能描述:判断多包数据是否接收完毕
|
||
输 入:Ch 通道
|
||
输 出:无
|
||
返 回 值:无
|
||
*********************************************************************************/
|
||
static void Is_bms_RcvMutliMsgOverFlag()
|
||
{
|
||
if(MutliRecvCount)
|
||
{
|
||
if(TickOut(&MutliRecvTimer,MutliRecvCount)== TRUE)
|
||
{
|
||
// BMS_PRINT("\n\r多帧接收完毕,延时[%d]毫秒\r\n",MutliRecvCount);
|
||
MutliRecvFlag = 1;//接收多包数据完成标志位
|
||
MutliRecvCount= 0;//延时清0
|
||
}
|
||
else
|
||
{
|
||
//未超时暂不处理
|
||
}
|
||
}
|
||
else //test
|
||
{
|
||
|
||
}
|
||
}
|
||
|
||
/*********************************************************************************
|
||
函数名称:bms_RcvCanMutliDataProc
|
||
功能描述:多包内容接收和解析
|
||
输 入:Ch CAN 通道 (0/1)
|
||
输 出:无
|
||
返 回 值:无
|
||
*********************************************************************************/
|
||
static CanRxMsg st_CanRxData= {0};
|
||
void bms_RcvCanMutliDataProc()
|
||
{
|
||
static uint32_t objId= 0;
|
||
static uint8_t MutliPacketFlag = FALSE;//多包解析数据标记
|
||
static uint16_t cCanMutliDataLen= 0; //多包数据字节数
|
||
//static CanRxMsg st_CanRxData= 0;
|
||
Is_bms_RcvMutliMsgOverFlag(); //判断多包数据是否接收完毕多包标志是否置位
|
||
|
||
if(MutliRecvFlag == 1)//多包数据已接收完
|
||
{
|
||
if(CanMessage.head >= CanMessage.tail)
|
||
{
|
||
MutliRecvFlag = 0;
|
||
CanMessage.tail =0;
|
||
CanMessage.head =0;
|
||
// BMS_PRINT("\n\r多帧处理完毕\r\n");
|
||
return;
|
||
}
|
||
memcpy(&st_CanRxData,&CanMessage.Msgbody[CanMessage.head++],sizeof(CanRxMsg));
|
||
|
||
if((st_CanRxData.ExtId & 0x0000FFFF) != 0x000056F4 ) //ID过滤
|
||
return;
|
||
else
|
||
{
|
||
if((st_CanRxData.ExtId & 0xFFFF0000) == CAN_CM_CTRL_ID ) //传输连接控制
|
||
{
|
||
if(st_CanRxData.Data[0] == CM_RTS_CTRL_CODE) //传输控制请求
|
||
{
|
||
|
||
}
|
||
else if(st_CanRxData.Data[0] == CM_CTS_CTRL_CODE) //传输控制请求
|
||
{
|
||
|
||
}
|
||
return;
|
||
}
|
||
else if( (st_CanRxData.ExtId & 0xFFFF0000) == CAN_CM_DATA_ID ) //传输连接数据传输
|
||
{
|
||
|
||
}
|
||
}
|
||
}
|
||
|
||
if(MutliPacketFlag == TRUE) //多包接收完成
|
||
{
|
||
MutliPacketFlag = FALSE;
|
||
bms_parseData(objId, 0, cCanMutliDataLen, 0);
|
||
cCanMutliDataLen= 0;
|
||
}
|
||
}
|
||
|
||
|
||
|
||
|
||
|
||
|
||
/*****************************************************can2发送*****************************/
|
||
#define WAIT_TIME_MS 3
|
||
|
||
//bms 发送报文数据握手
|
||
void bms_SendBHM(uint16_t MaxVoltage)
|
||
{
|
||
BMS_CanTxData.StdId = 0;
|
||
BMS_CanTxData.ExtId = CanBHMID;
|
||
BMS_CanTxData.IDE = CAN_ID_EXT;
|
||
BMS_CanTxData.RTR = CAN_RTR_DATA;
|
||
BMS_CanTxData.DLC = 2;
|
||
|
||
memset(BMS_CanTxData.Data, 0xff, 8);
|
||
BMS_CanTxData.Data[0] = MaxVoltage &0xff;
|
||
BMS_CanTxData.Data[1] =(MaxVoltage >> 8)&0xff;//最高充电允许电压
|
||
can_write(&BMS_CanTxData);
|
||
}
|
||
|
||
//bms 发送报文 辨识
|
||
void bms_SendBRM(uint16_t step)
|
||
{
|
||
uint8_t ucVehichleBmsInfo[17] ={0}; //车辆辨识信息 VIN码
|
||
|
||
if(step == 1)
|
||
{
|
||
BMS_CanTxData.StdId = 0;
|
||
BMS_CanTxData.ExtId = CanBRMID1;
|
||
BMS_CanTxData.IDE = CAN_ID_EXT;
|
||
BMS_CanTxData.RTR = CAN_RTR_DATA;
|
||
BMS_CanTxData.DLC = 8;
|
||
memset(BMS_CanTxData.Data,0xff,8);
|
||
|
||
BMS_CanTxData.Data[0] = 0x10;
|
||
BMS_CanTxData.Data[1] = 0x31;//数据长度
|
||
BMS_CanTxData.Data[2] = 0x00;//数据长度
|
||
BMS_CanTxData.Data[3] = 0x07;//49帧数据需要7包数据发送
|
||
BMS_CanTxData.Data[4] = 0xff;
|
||
BMS_CanTxData.Data[5] = 0x00;
|
||
BMS_CanTxData.Data[6] = 0x02;
|
||
BMS_CanTxData.Data[7] = 0x00;
|
||
can_write(&BMS_CanTxData);
|
||
}
|
||
else if(step == 2)
|
||
{
|
||
BMS_CanTxData.StdId = 0;
|
||
BMS_CanTxData.ExtId = CanBRMID2;
|
||
BMS_CanTxData.IDE = CAN_ID_EXT;
|
||
BMS_CanTxData.RTR = CAN_RTR_DATA;
|
||
BMS_CanTxData.DLC = 8;
|
||
memset(BMS_CanTxData.Data, 0xff, 8);
|
||
//01 01 01 01 03 e8 03 58
|
||
//010101当前版本信息
|
||
//03磷酸铁锂电池类型
|
||
// 0x03e8 蓄电池额定容量
|
||
// 蓄电池额定总电压 :0x1b58 = 7000 =700V
|
||
//厂商名称:0x00000000
|
||
BMS_CanTxData.Data[0] = 0x01;
|
||
BMS_CanTxData.Data[1] = GetBRM_VersionArr_0();
|
||
BMS_CanTxData.Data[2] = GetBRM_VersionArr_1();
|
||
BMS_CanTxData.Data[3] = GetBRM_VersionArr_2(); //bms通讯协议版本号默认 00 01 01
|
||
BMS_CanTxData.Data[4] = GetBRM_Battery_TYPE(); //电池类型
|
||
BMS_CanTxData.Data[5] = GetBRM_RatedCapacity()&0xff;
|
||
BMS_CanTxData.Data[6] = (GetBRM_RatedCapacity()>>8)&0xff;//额定容量
|
||
BMS_CanTxData.Data[7] = GetBRM_RatedTotalVoltage()&0xff;
|
||
can_write(&BMS_CanTxData);
|
||
|
||
//延时 10ms
|
||
Delay_MS(WAIT_TIME_MS);
|
||
BMS_CanTxData.Data[0] = 0x02;
|
||
BMS_CanTxData.Data[1] =(GetBRM_RatedTotalVoltage()>>8)&0xff; //电池总电压
|
||
BMS_CanTxData.Data[2] = BMSDefaultParameters.BRM.Battery_manufacturer[0];
|
||
BMS_CanTxData.Data[3] = BMSDefaultParameters.BRM.Battery_manufacturer[1];
|
||
BMS_CanTxData.Data[4] = BMSDefaultParameters.BRM.Battery_manufacturer[2];
|
||
BMS_CanTxData.Data[5] = BMSDefaultParameters.BRM.Battery_manufacturer[3]; //电池厂商名字--4字节
|
||
BMS_CanTxData.Data[6] = 0x00;//电池组序号
|
||
BMS_CanTxData.Data[7] = 0x00;//电池组序号
|
||
can_write(&BMS_CanTxData);
|
||
|
||
//延时 10ms
|
||
Delay_MS(WAIT_TIME_MS);
|
||
BMS_CanTxData.Data[0] = 0x03;//包序
|
||
BMS_CanTxData.Data[1] = 0x01;//电池组序号
|
||
BMS_CanTxData.Data[2] = 0x02;//电池组序号 //电池组号--4字节
|
||
BMS_CanTxData.Data[3] = BMSDefaultParameters.BRM.Batteryack_production_dateYesr; //-电池生产日期--3字节 年
|
||
BMS_CanTxData.Data[4] = BMSDefaultParameters.BRM.Batteryack_production_dateMouth; // 月
|
||
BMS_CanTxData.Data[5] = BMSDefaultParameters.BRM.Batteryack_production_dateData; // 日
|
||
|
||
BMS_CanTxData.Data[6] = BMSDefaultParameters.BRM.Battery_pack_charge_count.fields.ChargeCount[0];
|
||
BMS_CanTxData.Data[7] = BMSDefaultParameters.BRM.Battery_pack_charge_count.fields.ChargeCount[1];
|
||
can_write(&BMS_CanTxData);
|
||
//延时 10ms
|
||
Delay_MS(WAIT_TIME_MS);
|
||
|
||
SysParaPileD.VIN_Enable = 0;//不上报VIN
|
||
if(SysParaPileD.VIN_Enable == 1) //上报VIN
|
||
{
|
||
memcpy(ucVehichleBmsInfo, BMSDefaultParameters.BRM.ucCarVin,sizeof(Bms_BatInfo.ucVehichleInfo));
|
||
}
|
||
else //不上报 VIN
|
||
{
|
||
memset(ucVehichleBmsInfo,0xFF,sizeof(ucVehichleBmsInfo));
|
||
}
|
||
BMS_CanTxData.Data[0] = 0x04;
|
||
BMS_CanTxData.Data[1] = BMSDefaultParameters.BRM.Battery_pack_charge_count.fields.ChargeCount[2];//电池组充电次数--3字节
|
||
BMS_CanTxData.Data[2] = BMSDefaultParameters.BRM.Battery_pack_property_right_identification; //电池产权租赁
|
||
BMS_CanTxData.Data[3] = 0x00; // 预留
|
||
BMS_CanTxData.Data[4] = ucVehichleBmsInfo[0]; // 车辆 VIN
|
||
BMS_CanTxData.Data[5] = ucVehichleBmsInfo[1];
|
||
BMS_CanTxData.Data[6] = ucVehichleBmsInfo[2];
|
||
BMS_CanTxData.Data[7] = ucVehichleBmsInfo[3];
|
||
can_write(&BMS_CanTxData);
|
||
|
||
//延时 10ms
|
||
Delay_MS(WAIT_TIME_MS);
|
||
BMS_CanTxData.Data[0] = 0x05;
|
||
BMS_CanTxData.Data[1] = ucVehichleBmsInfo[4];
|
||
BMS_CanTxData.Data[2] = ucVehichleBmsInfo[5];
|
||
BMS_CanTxData.Data[3] = ucVehichleBmsInfo[6];
|
||
BMS_CanTxData.Data[4] = ucVehichleBmsInfo[7];
|
||
BMS_CanTxData.Data[5] = ucVehichleBmsInfo[8];
|
||
BMS_CanTxData.Data[6] = ucVehichleBmsInfo[9];
|
||
BMS_CanTxData.Data[7] = ucVehichleBmsInfo[10];
|
||
can_write(&BMS_CanTxData);
|
||
|
||
//延时 10ms
|
||
Delay_MS(WAIT_TIME_MS);
|
||
BMS_CanTxData.Data[0] = 0x06;
|
||
BMS_CanTxData.Data[1] = ucVehichleBmsInfo[11];
|
||
BMS_CanTxData.Data[2] = ucVehichleBmsInfo[12];
|
||
BMS_CanTxData.Data[3] = ucVehichleBmsInfo[13];
|
||
BMS_CanTxData.Data[4] = ucVehichleBmsInfo[14];
|
||
BMS_CanTxData.Data[5] = ucVehichleBmsInfo[15];
|
||
BMS_CanTxData.Data[6] = ucVehichleBmsInfo[16];
|
||
BMS_CanTxData.Data[7] = 0x10; //bms软件版本号
|
||
can_write(&BMS_CanTxData);
|
||
|
||
//延时 10ms
|
||
Delay_MS(WAIT_TIME_MS);
|
||
BMS_CanTxData.Data[0] = 0x07;
|
||
BMS_CanTxData.Data[1] = 0x0A; //日10
|
||
BMS_CanTxData.Data[2] = 0x0B; //月11
|
||
BMS_CanTxData.Data[3] = 0x07; //年20
|
||
BMS_CanTxData.Data[4] = 0xE0; // 16
|
||
BMS_CanTxData.Data[5] = 0xff; //预留默认0xff
|
||
BMS_CanTxData.Data[6] = 0xff; //预留默认0xff
|
||
BMS_CanTxData.Data[7] = 0xff; //预留默认0xff
|
||
can_write(&BMS_CanTxData);
|
||
}
|
||
}
|
||
#include "adc.h"
|
||
|
||
//bms 发送报文 动力蓄电池参数
|
||
void bms_SendBCP(uint16_t step)
|
||
{
|
||
if(step == 1)
|
||
{
|
||
BMS_CanTxData.StdId = 0;
|
||
BMS_CanTxData.ExtId = CanBRMID1;
|
||
BMS_CanTxData.IDE = CAN_ID_EXT;
|
||
BMS_CanTxData.RTR = CAN_RTR_DATA;
|
||
BMS_CanTxData.DLC = 8;
|
||
memset(BMS_CanTxData.Data, 0xff, 8);
|
||
|
||
BMS_CanTxData.Data[0] = 0x10;
|
||
BMS_CanTxData.Data[1] = 0x0d;
|
||
BMS_CanTxData.Data[2] = 0x00;
|
||
BMS_CanTxData.Data[3] = 0x02;
|
||
BMS_CanTxData.Data[4] = 0xff;
|
||
BMS_CanTxData.Data[5] = 0x00;
|
||
BMS_CanTxData.Data[6] = 0x06;
|
||
BMS_CanTxData.Data[7] = 0x00;
|
||
can_write(&BMS_CanTxData);
|
||
}
|
||
else if(step == 2)
|
||
{
|
||
BMS_CanTxData.StdId = 0;
|
||
BMS_CanTxData.ExtId = CanBRMID2;
|
||
BMS_CanTxData.IDE = CAN_ID_EXT;
|
||
BMS_CanTxData.RTR = CAN_RTR_DATA;
|
||
BMS_CanTxData.DLC = 8;
|
||
memset(BMS_CanTxData.Data, 0xff, 8);
|
||
/*单体最高电压:375 (0.1v), 电流:1720 (0.1A)
|
||
最高允许充电电压:5994 (0.1V),最高允许温度:60 (C)
|
||
整车总电荷状态:458 (0.1%), 当前总电压:5335 (0.1V)*/
|
||
|
||
BMS_CanTxData.Data[0] = 0x01;
|
||
BMS_CanTxData.Data[1] = BMSDefaultParameters.BCP.MaxChargingVoltageSingle&0xff;
|
||
BMS_CanTxData.Data[2] = (BMSDefaultParameters.BCP.MaxChargingVoltageSingle>>8)&0xff; //单体蓄电池最高允许充电电压420*0.01 = 4.2v 精度0.01
|
||
BMS_CanTxData.Data[3] = (4000-BMSDefaultParameters.BCP.MaxChargingCurrent)&0xff;
|
||
BMS_CanTxData.Data[4] = ((4000-BMSDefaultParameters.BCP.MaxChargingCurrent)>>8)&0xff;//最高允许充电电流 精度0.1 偏移量-400
|
||
BMS_CanTxData.Data[5] = BMSDefaultParameters.BCP.NominalTotalEnergy&0xff;
|
||
BMS_CanTxData.Data[6] = (BMSDefaultParameters.BCP.NominalTotalEnergy>>8)&0xff; //动力蓄电池标称总能量 精度0.1
|
||
BMS_CanTxData.Data[7] = BMSDefaultParameters.BCP.MaxTotalChargingVoltage&0xff;
|
||
can_write(&BMS_CanTxData);
|
||
//延时 10ms 50 00 f4 01 64 19 00
|
||
Delay_MS(WAIT_TIME_MS);
|
||
BMS_CanTxData.Data[0] = 0x02;
|
||
BMS_CanTxData.Data[1] =(BMSDefaultParameters.BCP.MaxTotalChargingVoltage>>8)&0xff; //最高允许充电总电压
|
||
BMS_CanTxData.Data[2] = BMSDefaultParameters.BCP.MaxTemperature+10; //动力蓄电池最高温度110 -50 = 60°C 偏移量-50
|
||
BMS_CanTxData.Data[3] = GetBCP_ChargeState()&0xff;
|
||
BMS_CanTxData.Data[4] = (GetBCP_ChargeState()>>8)&0xff; //整车Soc状态 精度0.1
|
||
|
||
BMS_CanTxData.Data[5] = BMSDefaultParameters.BCP.CurrentVoltage&0xff ;
|
||
BMS_CanTxData.Data[6] = (BMSDefaultParameters.BCP.CurrentVoltage >>8)&0xff;//整车动力蓄电池当前电压300v
|
||
BMS_CanTxData.Data[7] = 0x00;
|
||
can_write(&BMS_CanTxData);
|
||
}
|
||
}
|
||
|
||
// 电池准备就绪状态 BRO
|
||
//0x0--BMS不能辨识 0xaa--BMS能辨识
|
||
void bms_SendBRO(uint8_t Ready)
|
||
{
|
||
BMS_CanTxData.StdId = 0;
|
||
BMS_CanTxData.ExtId = CanBROID;
|
||
BMS_CanTxData.IDE = CAN_ID_EXT;
|
||
BMS_CanTxData.RTR = CAN_RTR_DATA;
|
||
BMS_CanTxData.DLC = 1;
|
||
memset(BMS_CanTxData.Data, 0xff, 8);
|
||
|
||
BMS_CanTxData.Data[0] = Ready;
|
||
can_write(&BMS_CanTxData);
|
||
}
|
||
|
||
//电池充电需求 BCL
|
||
void bms_SendBCL(void)
|
||
{
|
||
uint16_t fTotalBatVol ,fTotalBatCur;
|
||
BMS_CanTxData.StdId = 0;
|
||
BMS_CanTxData.ExtId = CanBCLID;
|
||
BMS_CanTxData.IDE = CAN_ID_EXT;
|
||
BMS_CanTxData.RTR = CAN_RTR_DATA;
|
||
BMS_CanTxData.DLC = 5;
|
||
memset(BMS_CanTxData.Data, 0xff, 8);
|
||
|
||
/* 电池充电需求 BCL 需求电压:0xfa0 =4000=400V
|
||
需求电流:0xf46 充电模式:02 恒流充电*/
|
||
fTotalBatVol = BMSDefaultParameters.BCL.VoltageDemand;
|
||
fTotalBatCur = (4000-BMSDefaultParameters.BCL.CurrentDemand);
|
||
// Bms_BatChargeRealInfo.uChargeMode = 2 ; //2恒流 1--恒压
|
||
|
||
BMS_CanTxData.Data[0] = (fTotalBatVol)&0xff;
|
||
BMS_CanTxData.Data[1] = (fTotalBatVol>>8)&0xff; //电压需求 精度0.1
|
||
BMS_CanTxData.Data[2] = (fTotalBatCur)&0xff;
|
||
BMS_CanTxData.Data[3] = (fTotalBatCur>>8)&0xff; //电流需求 精度0.1 偏移量-400
|
||
BMS_CanTxData.Data[4] = BMSDefaultParameters.BCL.Mode?2:1;//充电模式 0x1:恒压 0x2:恒流
|
||
can_write(&BMS_CanTxData);
|
||
}
|
||
|
||
//bms 发送报文 电池总状态 BCS
|
||
void bms_SendBCS(uint16_t step)
|
||
{
|
||
if(step == 1)
|
||
{
|
||
BMS_CanTxData.StdId = 0;
|
||
BMS_CanTxData.ExtId = CanBRMID1;
|
||
BMS_CanTxData.IDE = CAN_ID_EXT;
|
||
BMS_CanTxData.RTR = CAN_RTR_DATA;
|
||
BMS_CanTxData.DLC = 8;
|
||
memset(BMS_CanTxData.Data, 0xff, 8);
|
||
|
||
BMS_CanTxData.Data[0] = 0x10;
|
||
BMS_CanTxData.Data[1] = 0x09;
|
||
BMS_CanTxData.Data[2] = 0x00;
|
||
BMS_CanTxData.Data[3] = 0x02;
|
||
BMS_CanTxData.Data[4] = 0xff;
|
||
BMS_CanTxData.Data[5] = 0x00;
|
||
BMS_CanTxData.Data[6] = 0x11;
|
||
BMS_CanTxData.Data[7] = 0x00;
|
||
can_write(&BMS_CanTxData);
|
||
}
|
||
else if(step == 2)
|
||
{
|
||
BMS_CanTxData.StdId = 0;
|
||
BMS_CanTxData.ExtId = CanBRMID2;
|
||
BMS_CanTxData.IDE = CAN_ID_EXT;
|
||
BMS_CanTxData.RTR = CAN_RTR_DATA;
|
||
BMS_CanTxData.DLC = 8;
|
||
memset(BMS_CanTxData.Data, 0xff, 8);
|
||
/*充电电压测量值:0x139e =5022 电流测量值:0x
|
||
fa0 = 4000 =400A(偏移-400A) 荷电状态: 32%
|
||
估算剩余时间 0x0050 分钟*/
|
||
|
||
BMS_CanTxData.Data[0] = 0x01;
|
||
|
||
//1-12位:最高单体电压 精度0.01
|
||
//13~16位:最高单体电压所在序号0~15
|
||
//Bms_BatChargeRealInfo.nBayMaxVolInfo =((1<<12) |( Bms_BatConfigParam.BatMaxChargeVol-100));
|
||
//BMSDefaultParameters.BCS.MaxSingleCellVoltage.value =((1<<12) |( BMSDefaultParameters.BCS.MaxSingleCellVoltage.value-100));
|
||
BMS_CanTxData.Data[1] = BMSDefaultParameters.BCS.ChargingVoltage&0xff;
|
||
BMS_CanTxData.Data[2] = (BMSDefaultParameters.BCS.ChargingVoltage>>8)&0xff; //充电电压测量值
|
||
BMS_CanTxData.Data[3] = BMSDefaultParameters.BCS.ChargingCurrent&0xff;
|
||
BMS_CanTxData.Data[4] = (BMSDefaultParameters.BCS.ChargingCurrent>>8)&0xff;//充电电流测量值
|
||
|
||
BMS_CanTxData.Data[5] = BMSDefaultParameters.BCS.MaxSingleCellVoltage.value&0xff;
|
||
BMS_CanTxData.Data[6] = (BMSDefaultParameters.BCS.MaxSingleCellVoltage.value>>8)&0xff;
|
||
BMS_CanTxData.Data[7] = BMSDefaultParameters.uBatCurSOC; //当前SOC状态
|
||
can_write(&BMS_CanTxData);
|
||
|
||
|
||
Delay_MS(WAIT_TIME_MS);
|
||
//延时 10ms 50 00 f4 01 64 19 00
|
||
BMSDefaultParameters.BCS.RemainingChargeTime = 100 - BMSDefaultParameters.uBatCurSOC;
|
||
BMS_CanTxData.Data[0] = 0x02;
|
||
BMS_CanTxData.Data[1] = BMSDefaultParameters.BCS.RemainingChargeTime&0xff;
|
||
BMS_CanTxData.Data[2] = (BMSDefaultParameters.BCS.RemainingChargeTime>>8)&0xff; //估算剩余充电时间
|
||
BMS_CanTxData.Data[3] = 0;
|
||
BMS_CanTxData.Data[4] = 0;
|
||
BMS_CanTxData.Data[5] = 0;
|
||
BMS_CanTxData.Data[6] = 0;
|
||
BMS_CanTxData.Data[7] = 0;
|
||
can_write(&BMS_CanTxData);
|
||
}
|
||
}
|
||
|
||
//bms 发送报文 动力蓄电池 状态 BSM
|
||
void bms_SendBSM(uint16_t step)
|
||
{
|
||
|
||
uint8_t BatMaxVoltNum = 0; //电池最高电压编号
|
||
uint8_t BatMaxtemp = 0; //电池最高温度
|
||
uint8_t BatMaxTempNum = 0; //电池最高温度编号
|
||
int8_t BatMintemp = 0; //电池最低温度
|
||
int8_t BatMintempNum = 0; //电池最低温度编号
|
||
int8_t BMS_Insulation_Fault; //动力蓄电池绝缘状态
|
||
|
||
BMS_CanTxData.StdId = 0;
|
||
BMS_CanTxData.ExtId = CanBSMID;
|
||
BMS_CanTxData.IDE = CAN_ID_EXT;
|
||
BMS_CanTxData.RTR = CAN_RTR_DATA;
|
||
BMS_CanTxData.DLC = 7;
|
||
memset(BMS_CanTxData.Data, 0xff, 8);
|
||
|
||
if(SysParaPileD.SocSimulaType == 1)
|
||
{
|
||
BatMaxVoltNum = 0x05; //电池最高电压编号
|
||
BatMaxtemp = 0x4B; //电池最高温度 (偏移量-50°C所以加50)
|
||
BatMaxTempNum = 0x04; //电池最高温度编号
|
||
BatMintemp = 0x4A; //电池最低温度 (偏移量-50°C所以加50)
|
||
BatMintempNum = 0x03; //电池最低温度编号
|
||
}
|
||
else
|
||
{
|
||
BatMaxVoltNum = 0x05; //电池最高电压编号 5号
|
||
BatMaxtemp = 0x4B; //电池最高温度 75-50 = 25°C (偏移量-50°C所以加50)
|
||
BatMaxTempNum = 0x04; //电池最高温度编号 4号
|
||
BatMintemp = 0x4A; //电池最低温度 74-50 = 24°C (偏移量-50°C所以加50)
|
||
BatMintempNum = 0x03; //电池最低温度编号 3号
|
||
}
|
||
|
||
|
||
//6.0~6.1位:单体蓄电池电压过高/过低 00:正常 01:过高 10:过低
|
||
//6.2~6.3位:电池SOC状态过高/过低 00:正常 01:过高 10:过低
|
||
//6.4~6.5位:单体蓄电池充电过流 00:正常 01:过流 10:不可信
|
||
//6.6~6.7位:单体蓄电池温度过高 00:正常 01:过高 10:不可信
|
||
|
||
//7.0~7.1位:动力蓄电池绝缘状态 00:正常 01:过高 10:过低
|
||
//7.2~7.3位:动力蓄电池输出连接器连接状态 00:正常 01:过高 10:过低
|
||
//7.4~7.5位:充电允许 00:禁止 01:允许
|
||
|
||
if(Err_Read(43) || Err_Read(44))//单体蓄电池电压过高/过低
|
||
BMSDefaultParameters.BSM.BSM_DATA_FAULT.bits.high_low_voltage_status = 0x1;
|
||
else
|
||
BMSDefaultParameters.BSM.BSM_DATA_FAULT.bits.high_low_voltage_status = 0x0;
|
||
|
||
if(Err_Read(45) || Err_Read(12))//电池SOC状态过高/过低
|
||
BMSDefaultParameters.BSM.BSM_DATA_FAULT.bits.high_low_SOC_status = 0x1;
|
||
else
|
||
BMSDefaultParameters.BSM.BSM_DATA_FAULT.bits.high_low_SOC_status = 0x0;
|
||
|
||
if(Err_Read(46))//单体蓄电池充电过流
|
||
BMSDefaultParameters.BSM.BSM_DATA_FAULT.bits.charging_overcurrent_status = 0x1;
|
||
else
|
||
BMSDefaultParameters.BSM.BSM_DATA_FAULT.bits.charging_overcurrent_status = 0x0;
|
||
|
||
if(Err_Read(11))//单体蓄电池温度过高
|
||
BMSDefaultParameters.BSM.BSM_DATA_FAULT.bits.high_temperature_status = 0x1;
|
||
else
|
||
BMSDefaultParameters.BSM.BSM_DATA_FAULT.bits.high_temperature_status = 0x0;
|
||
|
||
|
||
if(Err_Read(14) || Err_Read(26))//动力蓄电池绝缘状态
|
||
BMSDefaultParameters.BSM.BSM_DATA_FAULT.bits.insulation_status = 0x1;
|
||
else
|
||
BMSDefaultParameters.BSM.BSM_DATA_FAULT.bits.insulation_status = 0x0;
|
||
|
||
if(GetBSM_output_connector_status() == true)//动力蓄电池输出连接器连接状态
|
||
BMSDefaultParameters.BSM.BSM_DATA_FAULT.bits.output_connector_status = 0x1;
|
||
else
|
||
BMSDefaultParameters.BSM.BSM_DATA_FAULT.bits.output_connector_status = 0x0;
|
||
|
||
if(GetBSM_charging_permission() == true)//充电允许
|
||
BMSDefaultParameters.BSM.BSM_DATA_FAULT.bits.charging_permission = 0x1;
|
||
else
|
||
BMSDefaultParameters.BSM.BSM_DATA_FAULT.bits.charging_permission = 0x0;
|
||
|
||
BMS_CanTxData.Data[0] = GetBSM_highest_cell_voltage_number(); //最高单体蓄电池电压所在编号
|
||
BMS_CanTxData.Data[1] = GetBSM_highest_battery_temperature()+10; //最高动力蓄电池温度
|
||
BMS_CanTxData.Data[2] = GetBSM_highest_temperature_detection_point(); //最高温度编号
|
||
BMS_CanTxData.Data[3] = GetBSM_lowest_battery_temperature()+10; //最低动力蓄电池温度
|
||
BMS_CanTxData.Data[4] = GetBSM_lowest_temperature_detection_point(); //最低温度编号
|
||
BMS_CanTxData.Data[5] = BMSDefaultParameters.BSM.BSM_DATA_FAULT.stats[0]; //未使用
|
||
BMS_CanTxData.Data[6] = BMSDefaultParameters.BSM.BSM_DATA_FAULT.stats[1]; //充电允许
|
||
can_write(&BMS_CanTxData);
|
||
}
|
||
|
||
//bms 发送报文 中止充电报文 BST
|
||
void bms_SendBST(uint16_t step)
|
||
{
|
||
BMS_CanTxData.StdId = 0;
|
||
BMS_CanTxData.ExtId = CanBSTID;
|
||
BMS_CanTxData.IDE = CAN_ID_EXT;
|
||
BMS_CanTxData.RTR = CAN_RTR_DATA;
|
||
BMS_CanTxData.DLC = 4;
|
||
//memset(BMS_CanTxData.Data, 0xff, 8);
|
||
|
||
//bms中止原因
|
||
//1.1~1.2位:达到所需求的SOC 00:未达到 01:达到 10:不可信
|
||
//3.3~3.4位:达到总电压设定值 00:未达到 01:达到 10:不可信
|
||
//3.5~3.6位:达到单体电压设定值 00:未达到 01:达到 10:不可信
|
||
//3.7~3.8位:充电桩主动终止 00:正常 01:充电桩终止(收到CST帧) 10:不可信
|
||
|
||
//达到SOC设定值
|
||
if(BMSDefaultParameters.uBatCurSOC == 100)
|
||
BMSDefaultParameters.BST.BST_DATA_FAULT.bits.SOC_Target = 0x1;
|
||
else
|
||
BMSDefaultParameters.BST.BST_DATA_FAULT.bits.SOC_Target = 0x0;
|
||
// //达到单体电压设定值
|
||
// if(stopChargeReason == 30)
|
||
// Bms_AbortReason |= 0x10;
|
||
// else
|
||
// Bms_AbortReason |= 0x00;
|
||
//充电桩主动终止
|
||
if(Err_Read(47) == true)
|
||
BMSDefaultParameters.BST.BST_DATA_FAULT.bits.Charging_pile_stops_actively = 0x1;
|
||
else
|
||
BMSDefaultParameters.BST.BST_DATA_FAULT.bits.Charging_pile_stops_actively = 0x0;
|
||
|
||
/*********************************bms中止故障原因
|
||
//2.1~2.2位:绝缘故障 00:正常 01:故障 10:不可信 0x01
|
||
//2.3~2.4位:输出连接器过温 00:正常 01:故障 10:不可信 0x04
|
||
//2.5~2.6位:bms元件、输出连接过温 00:正常 01:故障 10:不可信 0x10
|
||
//2.7~2.8位:充电连接器故障 00:正常 01:故障 10:不可信 0x40
|
||
|
||
//3.1~3.2位:电池组温度过高故障 00:正常 01:故障 10:不可信 0x100
|
||
//3.3~3.4位:高压续电器故障 00:正常 01:故障 10:不可信 0x400
|
||
//3.5~3.6位:检测点2电压检测故障 00:正常 01:故障 10:不可信 0x1000
|
||
//3.7~3.8位:其他故障 00:正常 01:故障 10:不可信 0x4000
|
||
********************************************************************/
|
||
if(Err_Read(26) == true || Err_Read(14) == true)//绝缘故障
|
||
BMSDefaultParameters.BST.BST_DATA_FAULT.bits.Fault_insulation = 0x1;
|
||
else
|
||
BMSDefaultParameters.BST.BST_DATA_FAULT.bits.Fault_insulation = 0x0;
|
||
|
||
if(Err_Read(11) == true)//电池组温度过高故障
|
||
BMSDefaultParameters.BST.BST_DATA_FAULT.bits.High_temperature_fault_battery_pack = 0x1;
|
||
else
|
||
BMSDefaultParameters.BST.BST_DATA_FAULT.bits.High_temperature_fault_battery_pack = 0x0;
|
||
|
||
if(Err_Read(3) == true || Err_Read(4) == true)//高压继电器故障
|
||
BMSDefaultParameters.BST.BST_DATA_FAULT.bits.Fault_high_voltage_relay = 0x1;
|
||
else
|
||
BMSDefaultParameters.BST.BST_DATA_FAULT.bits.Fault_high_voltage_relay = 0x0;
|
||
|
||
//bms中止充电错误原因
|
||
//4.1~4.2:电流过大 00:正常 01:超过需求值 10:不可信 0x01
|
||
//4.3~4.4:电压异常 00:正常 01:电压异常 10:不可信 0x04
|
||
if(Err_Read(46) == true)
|
||
BMSDefaultParameters.BST.BST_DATA_FAULT.bits.Excessive_current = 0x1;
|
||
else
|
||
BMSDefaultParameters.BST.BST_DATA_FAULT.bits.Excessive_current = 0x0;
|
||
|
||
if(Err_Read(1) == true /*|| Err_Read(2) == true*/)
|
||
BMSDefaultParameters.BST.BST_DATA_FAULT.bits.Abnormal_voltage = 0x1;
|
||
else
|
||
BMSDefaultParameters.BST.BST_DATA_FAULT.bits.Abnormal_voltage = 0x0;
|
||
|
||
BMS_CanTxData.Data[0] = BMSDefaultParameters.BST.BST_DATA_FAULT.stats[0];
|
||
BMS_CanTxData.Data[1] = BMSDefaultParameters.BST.BST_DATA_FAULT.stats[1];
|
||
BMS_CanTxData.Data[2] = BMSDefaultParameters.BST.BST_DATA_FAULT.stats[2];
|
||
BMS_CanTxData.Data[3] = BMSDefaultParameters.BST.BST_DATA_FAULT.stats[3];
|
||
can_write(&BMS_CanTxData);
|
||
}
|
||
//bms 发送报文 BMS统计报文 BSD
|
||
void bms_SendBSD(uint16_t step)
|
||
{
|
||
static uint16_t BattCellMaxVolt,BattCellMinVolt; //蓄电池单体最高电压 蓄电池单体最低电压
|
||
static uint16_t BattCellMaxTemp, BattCellMinTemp; //蓄电池单体最高温度 蓄电池单体最低温度
|
||
|
||
BMS_CanTxData.StdId = 0;
|
||
BMS_CanTxData.ExtId = CanBSDID;
|
||
BMS_CanTxData.IDE = CAN_ID_EXT;
|
||
BMS_CanTxData.RTR = CAN_RTR_DATA;
|
||
BMS_CanTxData.DLC = 7;
|
||
|
||
memset(BMS_CanTxData.Data, 0xff, 8);
|
||
|
||
BMS_CanTxData.Data[0] = BMSDefaultParameters.uBatCurSOC; //中止soc
|
||
BMS_CanTxData.Data[1] = GetBSDmin_cell_voltage()&0xff;
|
||
BMS_CanTxData.Data[2] = (GetBSDmin_cell_voltage()>>8)&0xff; //动力蓄电池单体最低电压 精度0.01 0x044c = 1100*0.01 = 11v
|
||
BMS_CanTxData.Data[3] = GetBSDmax_cell_voltage()&0xff;
|
||
BMS_CanTxData.Data[4] = (GetBSDmax_cell_voltage()>>8)&0xff; //动力蓄电池单体最高电压 精度0.01 0x04b0 = 1200*0.01 = 12v
|
||
BMS_CanTxData.Data[5] = GetBSDmin_battery_temperature(); //动力蓄电池最低温度 偏移量-50 0x64 = 100-50 = 50°C
|
||
BMS_CanTxData.Data[6] = GetBSDmax_battery_temperature(); //动力蓄电池最高温度 偏移量-50 0x65 = 101-50 = 51°C
|
||
can_write(&BMS_CanTxData);
|
||
}
|
||
|
||
//bms 发送报文 BMS错误报文 BEM
|
||
void bms_SendBEM(uint16_t step)
|
||
{
|
||
|
||
BMS_CanTxData.StdId = 0;
|
||
BMS_CanTxData.ExtId = CanBEMID;
|
||
|
||
BMS_CanTxData.IDE = CAN_ID_EXT;
|
||
BMS_CanTxData.RTR = CAN_RTR_DATA;
|
||
BMS_CanTxData.DLC = 4;
|
||
memset(BMS_CanTxData.Data, 0xff, 8);
|
||
|
||
//1.1~1.2位:充电桩辨识报文超时(0x00) 0x00:正常 0x01:超时 0x10:不可信
|
||
//1.3~1.4位:充电桩辨识报文超时(0xaa) 0x00:正常 0x01:超时 0x10:不可信
|
||
|
||
//2.1~2.2位:接受充电桩时间同步和最多输出能力超时(CTS/CMN) 0x00:正常 0x01:超时 0x10:不可信
|
||
//2.3~2.4位:接收充电桩完成准备超时(CRO) 0x00:正常 0x01:超时 0x10:不可信
|
||
|
||
//3.1~3.2位:接收充电桩充电状态报文超时(CCS) 0x00:正常 0x01:超时 0x10:不可信
|
||
//3.3~3.4位:接收充电桩中止充电报文超时(CST) 0x00:正常 0x01:超时 0x10:不可信
|
||
|
||
//4.1~4.2位:接收充电桩统计报文超时(CSD) 0x00:正常 0x01:超时 0x10:不可信
|
||
|
||
BMS_CanTxData.Data[0] = 0x00;
|
||
BMS_CanTxData.Data[1] = 0x00;
|
||
BMS_CanTxData.Data[2] = 0x00;
|
||
BMS_CanTxData.Data[3] = 0x00;
|
||
can_write(&BMS_CanTxData);
|
||
|
||
}
|
||
|
||
//===========================OBD BMS 各个报文解析 ====================================
|
||
|
||
wulingbat_info_t WuLingBatteryInfo;
|
||
|
||
static int8_t ParseBMS100(CanRxMsg *pData)//解析老化ID0x100数据
|
||
{
|
||
if(pData->Data[0]==1)
|
||
{
|
||
WuLingBatteryInfo.Long_TEST = 1;//老化标志位
|
||
}
|
||
return TRUE;
|
||
}
|
||
|
||
CanRxMsg testBMSCAN2Msg;
|
||
CanTxMsg testBMSCAN2MsgTx;
|
||
|
||
|
||
extern uint8_t NetworkManageFrameFlag;
|
||
|
||
static uint32_t NetworkManageFrameFlagTimer = 0; /* 记录最后接收到网络管理帧 的tick */
|
||
static uint32_t NetworkLocalWakingTimer = 0; /* 记录本地唤醒条件维持的tick */
|
||
|
||
void CheckNetworkManageFrameFlagTimeout(void)
|
||
{
|
||
// if (ChkPwrManageAccoff()!=0)
|
||
// {
|
||
// TickOut(&NetworkLocalWakingTimer, 0); /* 当前本地唤醒有效,更新tick记录 */
|
||
// }
|
||
|
||
// if (NetworkManageFrameFlagTimer == 0) /* 如果NetworkManageFrameFlagTimer=0 表示刚初始化,或者唤醒后未接收到管理帧,但唤醒后本身会发送一包管理帧,所以从这里开始计时 */
|
||
// { /* 注意这里与实际发送的管理帧的tick可能有出入,好在10%的误差比较大,应该能满足,不能满足考虑这里 */
|
||
// TickOut(&NetworkManageFrameFlagTimer, 0);
|
||
// }
|
||
// else if (TickOut(&NetworkManageFrameFlagTimer, 1200))
|
||
// {
|
||
// NetworkManageFrameFlag = 0; /* 这里清NetworkManageFrameFlag 主要是为了,与之前的逻辑相一致 */
|
||
// }
|
||
// #if 0
|
||
// if(TickOut(&NetworkManageFrameFlagTimer, 1200) == TRUE) // 5s ?
|
||
// {
|
||
// NetworkManageFrameFlag = 0;
|
||
// TickOut(&NetworkManageFrameFlagTimer, 0);
|
||
// }
|
||
// #endif
|
||
}
|
||
|
||
|
||
/**
|
||
* @brief: 用来返回 当前是否可以发送网络数据帧
|
||
*
|
||
* @return TRUE: 可以发送,FALSE:不可以发送
|
||
*/
|
||
static __inline bool NetWorkAppDateSending(void)
|
||
{
|
||
//判断是否有A+ ACC 与can网络唤醒,没有3s停止
|
||
if (TickOut(&NetworkManageFrameFlagTimer, 3000) == TRUE && TickOut(&NetworkLocalWakingTimer, 3000) == TRUE)
|
||
{
|
||
return FALSE;
|
||
}
|
||
return TRUE;
|
||
}
|
||
|
||
/*********************************************************************************
|
||
函数名称:bms2_parseData
|
||
功能描述:判断是否需要的报文去解析
|
||
输 入:Ch CAN 通道 (0/1)
|
||
输 出:无
|
||
返 回 值:无
|
||
*********************************************************************************/
|
||
int bms_RcvCan2DataProc(CanRxMsg pCanRxData)
|
||
{
|
||
static CanRxMsg SingleCanRxData = {0};
|
||
uint32_t SingleId;
|
||
SingleCanRxData = pCanRxData;
|
||
SingleId = SingleCanRxData.StdId;
|
||
|
||
|
||
|
||
//网络管理帧的接收判断
|
||
// if(
|
||
// ( )||(SingleId == CANBMS600INFOID_WULING)||
|
||
// (SingleId == CANBMS605INFOID_WULING)||(SingleId == CANBMS614INFOID_WULING)||
|
||
// (SingleId == CANBMS62AINFOID_WULING)||(SingleId == CANBMS651INFOID_WULING)||
|
||
// (SingleId == CANBMS653INFOID_WULING)||(SingleId == CANBMS652INFOID_WULING)||
|
||
// (SingleId == CANBMS654INFOID_WULING)||(SingleId == CANBMS686INFOID_WULING))
|
||
// {
|
||
// NetworkManageFrameFlag = 1;
|
||
// TickOut(&NetworkManageFrameFlagTimer, 0);
|
||
// }
|
||
|
||
testBMSCAN2Msg = SingleCanRxData;
|
||
GPIO_SetBits(GPIOC,GPIO_Pin_7); //1043 ENable
|
||
REV_CanData.CarMessage(&SingleCanRxData); //解析can数据
|
||
memset( &SingleCanRxData,0,sizeof(CanRxMsg));
|
||
SingleCanRxData.StdId =0;
|
||
|
||
return 0;
|
||
}
|
||
|
||
|
||
/*******************************************************模拟VIN码********************************/
|
||
int VinCalc(char *Vin,char *reslt)
|
||
{
|
||
unsigned int i = 0;
|
||
unsigned int sum =0;
|
||
unsigned int check = 0;
|
||
char temp=0;
|
||
unsigned int j = 0;
|
||
|
||
const char jianquan[26][2] = {
|
||
{'A',1},{'B',2},{'C',3},{'D',4},{'E',5},{'F',6},
|
||
{'G',7},{'H',8},{'I',0},{'J',1},{'K',2},{'L',3},
|
||
{'M',4},{'N',5},{'O',0},{'P',7},{'Q',8},{'R',9},
|
||
{'S',2},{'T',3},{'U',4},{'V',5},{'W',6},{'X',7},
|
||
{'Y',8},{'Z',9}};
|
||
char pos[17]={8,7,6,5,4,3,2,10,0,9,8,7,6,5,4,3,2};
|
||
|
||
for(i=0;i<17;i++)
|
||
{
|
||
if(Vin[i]>='a'&&Vin[i]<='z')
|
||
{
|
||
temp = Vin[i]-0x20;
|
||
}
|
||
else if((Vin[i]>='A')&&(Vin[i]<='Z'))
|
||
{
|
||
temp = Vin[i];
|
||
}
|
||
else if((Vin[i]>='0')&&(Vin[i]<='9'))temp = Vin[i]-'0';
|
||
else return GD_ERR;
|
||
|
||
if((temp>='A')&&(temp<='Z'))
|
||
{
|
||
for(j=0;j<26;j++)
|
||
{
|
||
if(temp == jianquan[j][0])
|
||
temp = jianquan[j][1];
|
||
}
|
||
}
|
||
check += temp*pos[i];
|
||
}
|
||
*reslt = check%11;
|
||
return GD_OK;
|
||
}
|
||
extern u32 ChipUniqueID[3];
|
||
char VinTest(void)
|
||
{
|
||
|
||
char check = 0;
|
||
vin_byte_t vin_code;
|
||
char* Vin=SysParaPileD.VehichleInfo;//"LK6ADCE15LB408569";
|
||
vin_code.data = ChipUniqueID[2] >>16&0xff;
|
||
SysParaPileD.VehichleInfo[11] = vin_code.bits.vode_h >0x0A? vin_code.bits.vode_h-0x0A+0x30:vin_code.bits.vode_h +0x30;
|
||
SysParaPileD.VehichleInfo[12] = vin_code.bits.vode_l >0x0A? vin_code.bits.vode_l -0x0A+0x30:vin_code.bits.vode_l +0x30;;
|
||
vin_code.data = ChipUniqueID[2] >>8&0xff;
|
||
SysParaPileD.VehichleInfo[13] = vin_code.bits.vode_h >0x0A? vin_code.bits.vode_h-0x0A+0x30:vin_code.bits.vode_h +0x30;
|
||
SysParaPileD.VehichleInfo[14] = vin_code.bits.vode_l >0x0A? vin_code.bits.vode_l -0x0A+0x30:vin_code.bits.vode_l +0x30;;
|
||
|
||
vin_code.data = ChipUniqueID[2]&0xff;
|
||
SysParaPileD.VehichleInfo[15] = vin_code.bits.vode_h >0x0A? vin_code.bits.vode_h-0x0A+0x30:vin_code.bits.vode_h +0x30;
|
||
SysParaPileD.VehichleInfo[16] = vin_code.bits.vode_l >0x0A? vin_code.bits.vode_l -0x0A+0x30:vin_code.bits.vode_l +0x30;;
|
||
|
||
// VinCalc((char*)&SysParaPileD.VehichleInfo[0],&check);
|
||
// data = VinTest();
|
||
VinCalc(Vin,&check);
|
||
SysParaPileD.VehichleInfo[8] = check +0x30;
|
||
SysParaPileD.device_type = 0;
|
||
|
||
|
||
|
||
// char* Vin="LFV2A21K657355844";
|
||
|
||
return check;
|
||
}
|
||
|
||
char VinTest2(void)
|
||
{
|
||
|
||
char check = 0;
|
||
char VehichleInfo[17] = {"LK6ADCE19LB355844"};
|
||
vin_byte_t vin_code;
|
||
char* Vin= VehichleInfo;//"LK6ADCE15LB408569";
|
||
|
||
// data = VinTest();
|
||
VinCalc(Vin,&check);
|
||
VehichleInfo[8] = check +0x30;
|
||
SysParaPileD.device_type = 0;
|
||
|
||
return check;
|
||
}
|
||
|
||
/******************************************can2数据发送***************************************/
|
||
int8_t FDC_General_Status_5(void)
|
||
{
|
||
static u8 statsdata[8] = {0};
|
||
static u8 stats[8] = {0};
|
||
|
||
BMS_Can2TxData.StdId = 0x38A;
|
||
BMS_Can2TxData.ExtId = 0;
|
||
BMS_Can2TxData.IDE = CAN_ID_STD;
|
||
BMS_Can2TxData.RTR = CAN_RTR_DATA;
|
||
BMS_Can2TxData.DLC = 8; //长度
|
||
|
||
stats[0] = 1;
|
||
stats[1] = 1;
|
||
stats[2] = 1;
|
||
|
||
memcpy(statsdata, &stats[0], 8);
|
||
memcpy(BMS_Can2TxData.Data, statsdata, 8);
|
||
|
||
can_write2(&BMS_Can2TxData);
|
||
return TRUE;
|
||
}
|
||
|
||
|
||
|
||
|
||
extern bool can_sent_cycle_timeout(unsigned int frame_id);
|
||
|
||
static uint8_t DCDCSendBms2State = 1;
|
||
|
||
void WULING_DCDCSendBms2_force(void)
|
||
{
|
||
DCDCSendBms2State = 1;
|
||
}
|
||
|
||
|
||
int8_t WULING_DCDCSendBms2(void)
|
||
{
|
||
uint32_t tmp;
|
||
static uint16_t index = 0,index2,index3,index4 = 0;
|
||
static uint32_t timerout = 0;
|
||
static uint32_t timer = 0;
|
||
static uint32_t timer2 = 0;
|
||
static uint32_t timer3 = 0;
|
||
|
||
|
||
CheckNetworkManageFrameFlagTimeout();
|
||
|
||
if(DCDCSendBms2State ==1)
|
||
{
|
||
if(TickOutCycle(&timer, 10) == TRUE) // 100ms
|
||
{
|
||
index=0;
|
||
DCDCSendBms2State = 2;
|
||
}
|
||
}
|
||
else if(DCDCSendBms2State ==2)
|
||
{
|
||
// if(ChkPwrManageAccoff()!=0 || ChkNetworkManageoff() !=0)//满足物理唤醒条件
|
||
// {
|
||
// timerout =0;
|
||
// }
|
||
// else
|
||
// {
|
||
// if(timerout < 10000) //1s
|
||
// {
|
||
// if(TickOutCycle(&timer3, 10) == TRUE) // 100ms
|
||
// {
|
||
// timerout++;
|
||
// }
|
||
// }
|
||
// }
|
||
|
||
if(TickOutCycle(&timer,5)== TRUE) // 100ms/20= 5
|
||
{
|
||
//100ms 周期
|
||
if(index3++%4==0)
|
||
{
|
||
index++;
|
||
if(NetWorkAppDateSending() == TRUE)
|
||
{
|
||
FDC_General_Status_5();
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
return TRUE;
|
||
}
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|