提交 2c72f8cf 作者: wysheng

车辆验证

上级 1767d463
......@@ -631,6 +631,11 @@ void StartMeg(StructTCUSend * pPgnRecv)
//24V
BMS_24V_Set(eSwSta_On);
}
if(StartMeg_A.PlugToChgFlag == 1)
{
TCUCurChgRecd.VehicleVerification = 0;
}
}
else
{
......@@ -678,6 +683,11 @@ void StartMeg(StructTCUSend * pPgnRecv)
//24V
BMS_24V_Set_B(eSwSta_On);
}
if(StartMeg_B.PlugToChgFlag == 1)
{
TCUCurChgRecd_B.VehicleVerification = 0;
}
}
else
{
......@@ -992,20 +1002,20 @@ u8 AllowDTUStartCompCharge(u8 * Reason)
*Reason = 0x24; //24H:BCP 报文接收超时
else if (CemMsg.Cem.Value.Bro == 1)
*Reason = 0x27; //27H:BRO 报文(0xAA)接收超时
else if ((CemMsg.Cem.Value.Bro != 0) || (ChargeStopType != 0))
*Reason = 0x28;
//else if ((CemMsg.Cem.Value.Bro != 0) || (ChargeStopType != 0))
// *Reason = 0x28;
else if (CemMsg.Cem.Value.Bcl == 1)
*Reason = 0x29; //29H:BCL报文接收超时
else if (CemMsg.Cem.Value.Bcs == 1)
*Reason = 0x2A; //2AH:BCS报文接收超时
else if ((VerificaInfo.result == 1) && (StartMeg_A.PlugToChgFlag == 1))
*Reason = 0x3D; //3DH: 车辆验证确认帧超时
*Reason = 0x3F; //3DH: 车辆验证确认帧超时
else if (TCUCommuStatus.ErrData.Value.verificationAck == 1)
*Reason = 0x3F; //3FH:车辆鉴权不通过
*Reason = 0x3D; //3FH:车辆鉴权不通过
else if (TCUCurChgRecd.TCUStartCompresult == 2)
*Reason = 0x01; //控制导引故障
else
* Reason = 0x28; //其他故障
* Reason = 0xFF; //其他故障
return FALSE;
}
......@@ -1062,20 +1072,20 @@ u8 AllowDTUStartCompCharge_B(u8 * Reason)
*Reason = 0x24;
else if (CemMsg_B.Cem.Value.Bro == 1)
*Reason = 0x27;
else if ((CemMsg_B.Cem.Value.Bro != 0) || (ChargeStopType_B != 0))
*Reason = 0x28;
//else if ((CemMsg_B.Cem.Value.Bro != 0) || (ChargeStopType_B != 0))
// *Reason = 0x28;
else if (CemMsg_B.Cem.Value.Bcl == 1)
*Reason = 0x29; //29H:BCL报文接收超时
else if (CemMsg_B.Cem.Value.Bcs == 1)
*Reason = 0x2A; //2AH:BCS报文接收超时
else if ((VerificaInfo_B.result == 1) && (StartMeg_B.PlugToChgFlag == 1))
*Reason = 0x3D;
else if (TCUCommuStatus_B.ErrData.Value.verificationAck == 1)
*Reason = 0x3F;
else if (TCUCommuStatus_B.ErrData.Value.verificationAck == 1)
*Reason = 0x3D;
else if (TCUCurChgRecd_B.TCUStartCompresult == 2)
*Reason = 0x01; //控制导引故障
else
* Reason = 0x28; //其他故障
* Reason = 0xFF; //其他故障
return FALSE;
}
......@@ -2849,7 +2859,7 @@ void verification(void)
memcpy(&data[len], &BrmMsg.ChgCount, 3);
len += 3;
memcpy(&data[len], &BcpMsg.StartSoc, 2);
len += 3;
len += 2;
memcpy(&data[len], &BcpMsg.StartVolt, 2);
len += 2;
TCUMultiPackSendMsg(data, len, eCmd_verification, 6, ChargerCont1939Addr);
......@@ -2870,7 +2880,7 @@ void verification_B(void)
memcpy(&data[len], &BrmMsg_B.ChgCount, 3);
len += 3;
memcpy(&data[len], &BcpMsg_B.StartSoc, 2);
len += 3;
len += 2;
memcpy(&data[len], &BcpMsg_B.StartVolt, 2);
len += 2;
TCUMultiPackSendMsg(data, len, eCmd_verification, 6, ChargerCont1939Addr_B);
......@@ -2884,11 +2894,15 @@ void verificationAck(StructTCUSend * pPgnRecv)
{
VerificaInfo.result = pPgnRecv->Data[1];
VerificaInfo.FailReason = pPgnRecv->Data[2];
TCUCurChgRecd.VehicleVerification = 2;
}
else if (pPgnRecv->DA == ChargerCont1939Addr_B)
{
VerificaInfo_B.result = pPgnRecv->Data[1];
VerificaInfo_B.FailReason = pPgnRecv->Data[2];
TCUCurChgRecd_B.VehicleVerification = 2;
}
}
......@@ -2925,7 +2939,7 @@ void TCUErroCommAnalysis(StructTCUSend * pPgnRecv)
{
if (pPgnRecv->DA == ChargerCont1939Addr)
{
memcpy(&TCUChgContralTCUEM_A.tcuem, &pPgnRecv->Data[1], 2);
memcpy(&TCUChgContralTCUEM_A.tcuem, &pPgnRecv->Data[1], 3);
memset(&TCUCommuStatus, 0x00, sizeof(TCUCommuStatus)); //通讯初始化
TCUCommuStatus.ConnectFlag = CONNECT_TIMEOUT;
......@@ -2935,7 +2949,7 @@ void TCUErroCommAnalysis(StructTCUSend * pPgnRecv)
}
else if (pPgnRecv->DA == ChargerCont1939Addr_B)
{
memcpy(&TCUChgContralTCUEM_B.tcuem, &pPgnRecv->Data[1], 2);
memcpy(&TCUChgContralTCUEM_B.tcuem, &pPgnRecv->Data[1], 3);
memset(&TCUCommuStatus_B, 0x00, sizeof(TCUCommuStatus)); //通讯初始化
TCUCommuStatus_B.ConnectFlag = CONNECT_TIMEOUT;
......@@ -3063,4 +3077,48 @@ void StartDownloadAck(u8 ChgNum)
}
}
void VehicleVerificationHandle(void)
{
static u32 VehicleVerificationTick = 0;
static u8 VehicleVerificationCount = 0;
if(1 == TCUCurChgRecd.VehicleVerification)
{
if(GetSystemTick() - VehicleVerificationTick >= 1000)
{
VehicleVerificationTick = GetSystemTick();
VehicleVerificationCount++;
if(VehicleVerificationCount <= 30)
{
verification();
}
else
{
TCUCurChgRecd.VehicleVerification = 0;
TCUCurChgRecd.TCUChargeEnable = 0;
TCUCommuStatus.ErrData.Value.verificationAck = 1;
TCUCommuStatus.ConEMSendFlag = 1; //错误帧发送
}
}
}
else if(2 == TCUCurChgRecd.VehicleVerification)
{
if(VerificaInfo.result)
{
TCUCurChgRecd.TCUChargeEnable = 0;
}
else
{
TCUCurChgRecd.TCUChargeEnable = 1;
}
TCUCurChgRecd.VehicleVerification = 0;
}
else
{
VehicleVerificationTick = GetSystemTick();
VehicleVerificationCount = 0;
}
}
......@@ -57,8 +57,16 @@ void ChgProChgRecognize(StructChargeCtrl *pChargeCtrl)
if(0 != BrmMsg.Valid)
{//接收到Brm
pChargeCtrl->CurProcess = eChgPro_ChgConfigure;
pChargeCtrl->Param = 0;
if(1 == TCUCurChgRecd.TCUChargeEnable)
{
pChargeCtrl->CurProcess = eChgPro_ChgConfigure;
pChargeCtrl->Param = 0;
}
else if(2 == TCUCurChgRecd.TCUChargeEnable)
{
if(TCUCurChgRecd.VehicleVerification == 0)
TCUCurChgRecd.VehicleVerification = 1;
}
}
else if((GetSystemTick() - BrmMsg.RecvTick) > (MsgTimeout_5S))
{
......
......@@ -57,8 +57,17 @@ void ChgProChgRecognizeEx(StructChargeCtrl *pChargeCtrl)
if(0 != BrmMsg.Valid)
{//接收到Brm
pChargeCtrl->CurProcess = eChgPro_ChgConfigure;
pChargeCtrl->Param = 0;
if(1 == TCUCurChgRecd.TCUChargeEnable)
{
pChargeCtrl->CurProcess = eChgPro_ChgConfigure;
pChargeCtrl->Param = 0;
}
else if(2 == TCUCurChgRecd.TCUChargeEnable)
{
if(TCUCurChgRecd.VehicleVerification == 0)
TCUCurChgRecd.VehicleVerification = 1;
}
}
else if((GetSystemTick() - BrmMsg.RecvTick) < (MsgTimeout_5S/2))
{
......
......@@ -678,14 +678,9 @@ void TCUCurChgRecordInterface_A(void)
if (TCUCurChgRecd.TCUChgStartNotetrl == 1) //启动帧逻辑
{
StartMegAck_A(); //启动帧发送
ChgStartSendTick = GetSystemTick();
TCUCurChgRecd.TCUChgStartNotetrl = 2;
}
else if (TCUCurChgRecd.TCUChgStartNotetrl == 2)
{
if (GetSystemTick() -ChgStartSendTick >= 250UL)
{
ChgStartSendTick = GetSystemTick();
if (ChgStartSendEcount < 8) //2S
{
ChgStartSendEcount++;
......@@ -693,28 +688,25 @@ void TCUCurChgRecordInterface_A(void)
}
else
{
ChgStartSendTick = 0;
TCUCurChgRecd.TCUChgStartNotetrl = 0; //停止发送
ChgStartSendEcount = 0;
}
}
}
else if (TCUCurChgRecd.TCUChgStarCompNotetrl == 1)
else
{
startCompSend_A();
ChgStartCompSendTick = GetSystemTick();
TCUCurChgRecd.TCUChgStarCompNotetrl = 2;
ChgStartSendTick = GetSystemTick();
ChgStartSendEcount = 0;
}
else if (TCUCurChgRecd.TCUChgStarCompNotetrl == 2)
if (TCUCurChgRecd.TCUChgStarCompNotetrl == 1)
{
if ((GetSystemTick() -ChgStartCompSendTick) > (250UL))
{
ChgRecordSendTick = GetSystemTick();
ChgStartCompSendEcount++;
if (ChgRecordSendErr < 20) //超时5S
{ //超时小于20次
startCompSend_A();
ChgRecordSendTick = GetSystemTick();
}
else
{ //超时大于,保存
......@@ -732,9 +724,14 @@ void TCUCurChgRecordInterface_A(void)
TCUCurChgRecd.TCUStartCompresult = 0; //
TCUCurChgRecd.TCUChargeEnable = 0; //归零
TCUCurChgRecd.StarChgType = 0;
}
else
{
ChgStartCompSendEcount = 0;
ChgRecordSendTick = GetSystemTick();
}
else if (TCUCurChgRecd.TCUChgStopNotetrl == 1) //停止帧逻辑
if (TCUCurChgRecd.TCUChgStopNotetrl == 1) //停止帧逻辑
{
StopMegAck_A(); //停止帧发送
ChgStopSendTick = GetSystemTick();
......
#ifndef __THD_TCU_H__
#define __THD_TCU_H__
#include "Global.h"
#include "Drv_TCUComm.h"
#include "Thd_TcuControl.h"
#define CONNECT_NORMAL 0
#define CONNECT_TIMEOUT 1
typedef enum
{
HeartStage =0,//心跳阶段默认
VersionStage = 1,
ChageParamStage = 2,
TimeStage = 3,
ServiceContralStage = 4,
ElectLockStage = 5,
PowerControlStage = 6,
ChgInfornQueryStage = 7,
StartDownloadStage = 8,
}EnumTCUCommStage;
typedef union
{
u16 Mult;
struct
{
u32 startCompAck :1;//充电启动完成状态确认超时
u32 stopCompAck: 1;//充电停止完成状态确认超时
u32 DCTCUInfor : 1;//遥信报文接收超时
u32 DCTCUMeasu : 1;//遥测报文接收超时
u32 Param : 1;//下发充电参数报文接收超时
//接收请求发送数据帧超时
//接收数据发送帧超时
//接收程序校验命令帧超时
//接收立即复位命令帧超时
//车辆验证确认帧接收超时
u32 verificationAck : 1;//
}Value;
}UnionConEM;
typedef struct
{
EnumTCUCommStage CommStage;
u8 VerChkVaild;
u8 ParamVaild;
u8 ChargingServiceSetValue;//保留下发设置值
u8 ServiceContralVaildValue;//服务控制下发失败原因 0成功
u8 ElectLockSetValue;//保留下发设置值
u8 ElectLockVaildValue;//电子锁控制下发失败原因 0成功
u8 PowerControltype;
u16 PowerControlParam;
u8 PowerControlVaildValue;//功率调节失败原因
u8 ConnectFlag;//0 未连接 其他已连接
u8 HeartBeatVaild;//接收心跳有效标志位
u8 HeartBeatErrCnt;
u16 HeartBeatNumCnt;
u16 HeartBeatLoseCnt;
u32 DCMeasuErrCnt;
UnionConEM ErrData;
u8 ConEMSendFlag;
}StructTCUCommuStatus;
typedef struct
{
u8 HeartPeriod;//秒
u8 HeartErrCntMax;//次
u8 HeartTimeout;//秒
u16 SignInPeriod;//分钟
}StructTCUCommuParam;
#define CONNECT_NORMAL 0
#define CONNECT_TIMEOUT 1
typedef enum {
HeartStage = 0, //心跳阶段默认
VersionStage = 1,
ChageParamStage = 2,
TimeStage = 3,
ServiceContralStage = 4,
ElectLockStage = 5,
PowerControlStage = 6,
ChgInfornQueryStage = 7,
StartDownloadStage = 8,
} EnumTCUCommStage;
typedef union {
u16 Mult;
struct {
u32 startCompAck : 1; //充电启动完成状态确认超时
u32 stopCompAck : 1; //充电停止完成状态确认超时
u32 DCTCUInfor : 1; //遥信报文接收超时
u32 DCTCUMeasu : 1; //遥测报文接收超时
u32 Param : 1; //下发充电参数报文接收超时
u32 DataRequestSend : 1; //接收请求发送数据帧超时
u32 DataSend : 1; //接收数据发送帧超时
u32 ProgramVerification: 1; //接收程序校验命令帧超时
u32 reset : 1; //接收立即复位命令帧超时
u32 verificationAck : 1; // 车辆验证确认帧接收超时
} Value;
} UnionConEM;
typedef struct {
EnumTCUCommStage CommStage;
u8 VerChkVaild;
u8 ParamVaild;
u8 ChargingServiceSetValue; //保留下发设置值
u8 ServiceContralVaildValue; //服务控制下发失败原因 0成功
u8 ElectLockSetValue; //保留下发设置值
u8 ElectLockVaildValue; //电子锁控制下发失败原因 0成功
u8 PowerControltype;
u16 PowerControlParam;
u8 PowerControlVaildValue; //功率调节失败原因
u8 ConnectFlag; //0 未连接 其他已连接
u8 HeartBeatVaild; //接收心跳有效标志位
u8 HeartBeatErrCnt;
u16 HeartBeatNumCnt;
u16 HeartBeatLoseCnt;
u32 DCMeasuErrCnt;
UnionConEM ErrData;
u8 ConEMSendFlag;
} StructTCUCommuStatus;
typedef struct {
u8 HeartPeriod; //秒
u8 HeartErrCntMax; //次
u8 HeartTimeout; //秒
u16 SignInPeriod; //分钟
} StructTCUCommuParam;
extern StructTCUCommuStatus TCUCommuStatus;
extern StructTCUCommuStatus TCUCommuStatus_B;
extern void TCUComm(void const *argument);
extern void TCUComm(void const * argument);
#endif
......@@ -4,7 +4,8 @@
#include "Thd_TcuControl.h"
StructTCUCtrl TCUCtrl;
u32 PlugToChgTick = 0;
u32 PlugToChgTick_B = 0;
StructTCUChgRecd TCUCurChgRecd = {0};
StructTCUChgRecd TCUCurChgRecd_B = {0};
......@@ -83,6 +84,11 @@ void TCUProPrstart(StructTCUCtrl *pLcdCtrl)
if(TCUCurChgRecd.StarChgResult== 1)//允许启动
{
TCUCurChgRecd.TCUChargeEnable = 1;
if(StartMeg_A.PlugToChgFlag)
{
TCUCurChgRecd.TCUChargeEnable = 2;
PlugToChgTick = GetSystemTick();
}
pLcdCtrl->CurScreen =eLcdPro_TCUBuildComm;
TCUCurChgRecd.StarChgResult= 0;
}
......@@ -103,6 +109,11 @@ void TCUProPrstart_B(StructTCUCtrl *pLcdCtrl)
if(TCUCurChgRecd_B.StarChgResult== 1)//允许启动
{
TCUCurChgRecd_B.TCUChargeEnable = 1;
if(StartMeg_B.PlugToChgFlag)
{
TCUCurChgRecd_B.TCUChargeEnable = 2;
PlugToChgTick_B = GetSystemTick();
}
pLcdCtrl->CurScreen = eLcdPro_TCUBuildComm_B;
TCUCurChgRecd_B.StarChgResult= 0;
}
......@@ -138,7 +149,21 @@ void TCUBuildComm(StructTCUCtrl *pLcdCtrl)
TCUCurChgRecd.TCUChgStarCompNotetrl =1;//开始完成帧发送标志
pLcdCtrl->CurScreen = GetTCUProcess(eLcdPro_TCUMainMenu);
pLcdCtrl->Param = 0;
break;
break;
/*case eChgPro_ChgRecognize:
case eChgPro_ChgRecognizeEx:
if(GetSystemTick()- PlugToChgTick >= 30 *1000)
{
TCUCurChgRecd.TCUStartCompresult = 2;//失败
TCUCurChgRecd.TCUChgStarCompNotetrl =1;//开始完成帧发送标志
pLcdCtrl->CurScreen = GetTCUProcess(eLcdPro_TCUMainMenu);
pLcdCtrl->Param = 0;
TCUCurChgRecd.TCUChargeEnable = 0;
TCUCommuStatus.ErrData.Value.verificationAck = 1;
TCUCurChgRecd.VehicleVerification = 0;
TCUCommuStatus.ConEMSendFlag = 1; //错误帧发送
}
break;*/
default:
break;
}
......@@ -168,6 +193,17 @@ void TCUBuildComm_B(StructTCUCtrl *pLcdCtrl)
pLcdCtrl->CurScreen = GetTCUProcess(eLcdPro_TCUMainMenu);
pLcdCtrl->Param = 0;
break;
/*case eChgPro_ChgRecognize:
case eChgPro_ChgRecognizeEx:
if(GetSystemTick()- PlugToChgTick_B >= 30 *1000)
{
TCUCurChgRecd_B.TCUStartCompresult = 2;//失败
TCUCurChgRecd_B.TCUChgStarCompNotetrl =1;//开始完成帧发送标志
pLcdCtrl->CurScreen = GetTCUProcess(eLcdPro_TCUMainMenu);
pLcdCtrl->Param = 0;
TCUCommuStatus_B.ErrData.Value.verificationAck = 1;
}
break;*/
default:
break;
}
......
......@@ -63,6 +63,8 @@ typedef struct{
u8 TCUChgStopNotetrl;//停机标识
u8 TCUChgStopCompNotetrl; //充电开始状态上传 0不需要发送 1等待发送 2已发送 3已回复
u8 VehicleVerification; //车辆验证
}StructTCUChgRecd;
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论