提交 12f46dd1 作者: wysheng

1. TCU的CAN数据放入队列

2. 按照新协议修改AB抢地址
上级 11550d38
......@@ -7,9 +7,11 @@
#include "Drv_Adc.h"
osMessageQId TCUMsg = 0;
osMessageQId TCUMsg = 0;
extern osMessageQId TcuSendMsgId;
u8 TCUSendMsg(StructChargeSend * pMsg)
{
CanTxMsg TxMsg;
......@@ -64,7 +66,7 @@ void TCURxIrqHandle(void)
if (1 == Id1939.Disp.DP)
return;
if ((Id1939.Disp.DA_PS != ChargerCont1939Addr) || (Id1939.Disp.SA != TCU1939Addr))
if (((Id1939.Disp.DA_PS&0xF6) != ChargerCont1939Addr) || (Id1939.Disp.SA != TCU1939Addr))
return;
if (Id1939.Disp.PF < 240)
......@@ -150,7 +152,7 @@ void TCURxIrqHandle(void)
if (1 == Id1939.Disp.DP)
return;
if ((Id1939.Disp.DA_PS != ChargerCont1939Addr) || (Id1939.Disp.SA != TCU1939Addr))
if (((Id1939.Disp.DA_PS&0xF6) != ChargerCont1939Addr) || (Id1939.Disp.SA != TCU1939Addr))
return;
if (Id1939.Disp.PF < 240)
......@@ -412,7 +414,7 @@ StructTCUEM TCUChgContralTCUEM_B;
StructTCUCControl TCUControlInfo =
{
.ChargingServiceFlag = 1,
.version = 0x0100,
.version = 0x0230,
.ChargeNum =
{
0, 0, 0, 0
......@@ -461,7 +463,7 @@ StructTCUCControl TCUControlInfo =
};
void TCUSinglePackSendMsg(u8 * pframe, u16 len, EnumTCUCommPgn cmd, u8 Prio)
void TCUSinglePackSendMsg(u8 * pframe, u16 len, EnumTCUCommPgn cmd, u8 Prio, u8 addr)
{
StructChargeSend FrameSend;
......@@ -470,7 +472,7 @@ void TCUSinglePackSendMsg(u8 * pframe, u16 len, EnumTCUCommPgn cmd, u8 Prio)
FrameSend.Id.Disp.Prio = Prio;
FrameSend.Id.Disp.PF = cmd >> 8;
FrameSend.Id.Disp.DA_PS = TCU1939Addr;
FrameSend.Id.Disp.SA = ChargerCont1939Addr;
FrameSend.Id.Disp.SA = addr;
FrameSend.Len = len;
FrameSend.Data[0] = pframe[0];
FrameSend.Data[1] = pframe[1];
......@@ -481,11 +483,16 @@ void TCUSinglePackSendMsg(u8 * pframe, u16 len, EnumTCUCommPgn cmd, u8 Prio)
FrameSend.Data[6] = pframe[6];
FrameSend.Data[7] = pframe[7];
TCUSendMsg(&FrameSend);
//TCUSendMsg(&FrameSend);
//放入队列
if (pdTRUE != xQueueSend(TcuSendMsgId, &FrameSend, 0))
{
//osDelay(10);
}
}
void TCUMultiPackSendMsg(u8 * pfram, u16 len, EnumTCUCommPgn cmd, u8 Prio)
void TCUMultiPackSendMsg(u8 * pfram, u16 len, EnumTCUCommPgn cmd, u8 Prio, u8 addr)
{
u8 i;
StructChargeSend FrameSend;
......@@ -495,7 +502,7 @@ void TCUMultiPackSendMsg(u8 * pfram, u16 len, EnumTCUCommPgn cmd, u8 Prio)
FrameSend.Id.Disp.Prio = Prio;
FrameSend.Id.Disp.PF = cmd >> 8;
FrameSend.Id.Disp.DA_PS = TCU1939Addr;
FrameSend.Id.Disp.SA = ChargerCont1939Addr;
FrameSend.Id.Disp.SA = addr;
u16 checkSum = 0;
for (i = 0; i < len; i++)
......@@ -534,8 +541,13 @@ void TCUMultiPackSendMsg(u8 * pfram, u16 len, EnumTCUCommPgn cmd, u8 Prio)
}
FrameSend.Len = 8;
TCUSendMsg(&FrameSend);
osDelay(1);
//TCUSendMsg(&FrameSend);
//osDelay(1);
//放入队列
if (pdTRUE != xQueueSend(TcuSendMsgId, &FrameSend, 0))
{
//osDelay(10);
}
}
}
......@@ -543,7 +555,7 @@ void TCUMultiPackSendMsg(u8 * pfram, u16 len, EnumTCUCommPgn cmd, u8 Prio)
void StartMeg(StructTCUSend * pPgnRecv)
{
if (pPgnRecv->Data[0] == 0x01)
if (pPgnRecv->DA == ChargerCont1939Addr)
{
if ((TCUCurChgRecd.TCUChgStartNotetrl == 0) && (TCUCurChgRecd.TCUChargeEnable == 0) &&
((eLcdPro_TCUMainMenu == TCUCtrl.CurScreen) || (eLcdPro_TCUChargeSummary_B == TCUCtrl.CurScreen)))
......@@ -581,7 +593,7 @@ void StartMeg(StructTCUSend * pPgnRecv)
}
}
else if (pPgnRecv->Data[0] == 0x02)
else if (pPgnRecv->DA == ChargerCont1939Addr_B)
{
if ((TCUCurChgRecd_B.TCUChgStartNotetrl == 0) && (TCUCurChgRecd_B.TCUChargeEnable == 0) &&
((eLcdPro_TCUMainMenu == TCUCtrl.CurScreen) || (eLcdPro_TCUChargeSummary == TCUCtrl.CurScreen)))
......@@ -597,7 +609,7 @@ void StartMeg(StructTCUSend * pPgnRecv)
TCUCurChgRecd_B.StarChgType = pPgnRecv->Data[2];
TCUCtrl.CurScreen = eLcdPro_TCUPrstart_B;
TCUCtrl.Param = 0;
TCUCurChgRecd.TCUChgStartNotetrl = 1; //回复充电开始发送标志位
TCUCurChgRecd_B.TCUChgStartNotetrl = 1; //回复充电开始发送标志位
}
else
{
......@@ -627,7 +639,7 @@ u8 AllowDTUStartCharge(u8 * Reason)
{
if (TCUCurChgRecd.StarValid == 0)
*Reason = 0x01;
else if (TCUCommuStatus.ConnectFlag == 0)
else if (TCUCommuStatus.ConnectFlag == CONNECT_TIMEOUT)
*Reason = 0x02;
else if (TCUCommuStatus.VerChkVaild == 0)
*Reason = 0x03;
......@@ -684,7 +696,7 @@ u8 AllowDTUStartCharge_B(u8 * Reason)
{
if (TCUCurChgRecd_B.StarValid == 0)
*Reason = 0x01;
else if (TCUCommuStatus.ConnectFlag == 0)
else if (TCUCommuStatus.ConnectFlag == CONNECT_TIMEOUT)
*Reason = 0x02;
else if (TCUCommuStatus.VerChkVaild == 0)
*Reason = 0x03;
......@@ -743,7 +755,7 @@ void StartMegAck_A(void)
};
u8 Reason = 0x00;
Data[0] = 0x01;
Data[0] = 0x00;
Data[1] = StartMeg_A.LoadSswitch;
if (FALSE == AllowDTUStartCharge(&Reason))
......@@ -756,7 +768,7 @@ void StartMegAck_A(void)
Data[5] = 0x00;
Data[6] = 0x00;
Data[7] = 0x00;
TCUSinglePackSendMsg(Data, 8, eCmd_startAck, 6);
TCUSinglePackSendMsg(Data, 8, eCmd_startAck, 6,ChargerCont1939Addr);
}
......@@ -768,7 +780,7 @@ void StartMegAck_B(void)
};
u8 Reason = 0x00;
Data[0] = 0x02;
Data[0] = 0x00;
Data[1] = StartMeg_B.LoadSswitch;
if (FALSE == AllowDTUStartCharge_B(&Reason))
......@@ -778,7 +790,7 @@ void StartMegAck_B(void)
Data[3] = Reason;
Data[4] = StartMeg_B.LoadSswitch;
TCUSinglePackSendMsg(Data, 8, eCmd_startAck, 6);
TCUSinglePackSendMsg(Data, 8, eCmd_startAck, 6,ChargerCont1939Addr_B);
}
......@@ -789,7 +801,7 @@ u8 AllowDTUStartCompCharge(u8 * Reason)
*Reason = 0x0; //成功
return TRUE;
}
else if (TCUCommuStatus.ConnectFlag == 0)
else if (TCUCommuStatus.ConnectFlag == CONNECT_TIMEOUT)
*Reason = 0x02; //通讯超时
else if (PillarError.Value.Emergency == 1)
*Reason = 0x03;
......@@ -855,7 +867,7 @@ u8 AllowDTUStartCompCharge_B(u8 * Reason)
*Reason = 0x0; //成功
return TRUE;
}
else if (TCUCommuStatus.ConnectFlag == 0)
else if (TCUCommuStatus.ConnectFlag == CONNECT_TIMEOUT)
*Reason = 0x02; //通讯超时
else if (PillarError_B.Value.Emergency == 1)
*Reason = 0x03;
......@@ -987,7 +999,7 @@ void startCompSend_A(void)
memcpy(&Data[len], BrmMsg.Vin, 17); //车辆识别码 BIN码 17
len += 17;
TCUMultiPackSendMsg(Data, len, eCmd_startComp, 4);
TCUMultiPackSendMsg(Data, len, eCmd_startComp, 4,ChargerCont1939Addr);
}
......@@ -1064,13 +1076,13 @@ void startCompSend_B(void)
Data[len++] = 0x0F; //最小输出电流0A
memcpy(&Data[len], BrmMsg_B.Vin, 17); //车辆识别码 BIN码 17
len += 17;
TCUMultiPackSendMsg(Data, len, eCmd_startComp, 4); //多包传输
TCUMultiPackSendMsg(Data, len, eCmd_startComp, 4,ChargerCont1939Addr_B); //多包传输
}
void ACkStartCompMeg(StructTCUSend * pPgnRecv)
{
if (pPgnRecv->Data[0] == 0x01)
if (pPgnRecv->Data[0] == 0x00)
{
AckStartCompMeg_A.GunNum = pPgnRecv->Data[0];
AckStartCompMeg_A.LoadSswitch = pPgnRecv->Data[1];
......@@ -1083,7 +1095,7 @@ void ACkStartCompMeg(StructTCUSend * pPgnRecv)
TCUCurChgRecd.TCUChgStarCompNotetrl = 3;
}
else if (pPgnRecv->Data[0] == 0x02)
else if (pPgnRecv->Data[0] == 0x00)
{
AckStartCompMeg_B.GunNum = pPgnRecv->Data[0];
AckStartCompMeg_B.LoadSswitch = pPgnRecv->Data[1];
......@@ -1102,13 +1114,13 @@ void ACkStartCompMeg(StructTCUSend * pPgnRecv)
void StopMeg(StructTCUSend * pPgnRecv)
{
if (pPgnRecv->Data[0] == 0x01)
if (pPgnRecv->DA == ChargerCont1939Addr)
{
TCUCurChgRecd.TCUChgStopType = pPgnRecv->Data[1];
TCUCurChgRecd.TCUChgStopNotetrl = 1;
TCUCurChgRecd.TCUChargeEnable = 0;
}
else if (pPgnRecv->Data[0] == 0x02)
else if (pPgnRecv->DA == ChargerCont1939Addr_B)
{
TCUCurChgRecd_B.TCUChgStopType = pPgnRecv->Data[1];
TCUCurChgRecd_B.TCUChgStopNotetrl = 1;
......@@ -1125,7 +1137,7 @@ void StopMegAck_A(void)
0
};
Data[0] = 0x01;
Data[0] = 0x00;
if (TCUCurChgRecd.TCUChargeEnable == 1)
{
......@@ -1135,7 +1147,7 @@ void StopMegAck_A(void)
else
Data[1] = 01;
TCUSinglePackSendMsg(Data, 8, eCmd_stopAck, 4);
TCUSinglePackSendMsg(Data, 8, eCmd_stopAck, 4,ChargerCont1939Addr);
}
......@@ -1146,7 +1158,7 @@ void StopMegAck_B(void)
0
};
Data[0] = 0x01;
Data[0] = 0x00;
if (TCUCurChgRecd_B.TCUChargeEnable == 1)
{
......@@ -1156,7 +1168,7 @@ void StopMegAck_B(void)
else
Data[1] = 01;
TCUSinglePackSendMsg(Data, 8, eCmd_stopAck, 4);
TCUSinglePackSendMsg(Data, 8, eCmd_stopAck, 4,ChargerCont1939Addr_B);
}
......@@ -1172,7 +1184,7 @@ void GetStopReason_A(u8 * stopReason)
*stopReason = 0x04;
else if (ChargeStopType == eChgStop_Run_CcOpen)
*stopReason = 0x05; //控制导引超时//充电过程中充电导引枪连接
else if (TCUCommuStatus.ConnectFlag == 0)
else if (TCUCommuStatus.ConnectFlag == CONNECT_TIMEOUT)
*stopReason = 0x06; //充电控制器与计费单元通讯超时停止
else if (PillarError.Value.Emergency)
*stopReason = 0x08; //急停按钮动作故障
......@@ -1250,7 +1262,7 @@ void GetStopReason_B(u8 * stopReason)
*stopReason = 0x04;
else if (ChargeStopType_B == eChgStop_Run_CcOpen)
*stopReason = 0x05; //控制导引超时//充电过程中充电导引枪连接
else if (TCUCommuStatus.ConnectFlag == 0)
else if (TCUCommuStatus.ConnectFlag == CONNECT_TIMEOUT)
*stopReason = 0x06; //充电控制器与计费单元通讯超时停止
else if (PillarError_B.Value.Emergency)
*stopReason = 0x08; //急停按钮动作故障
......@@ -1321,7 +1333,7 @@ void stopCompSend_A(void)
u8 len = 0;
u8 reason;
Data[len++] = 0x01;
Data[len++] = 0x00;
GetStopReason_A(&reason);
Data[len++] = reason; //成功标识
Data[len++] = 00;
......@@ -1348,7 +1360,7 @@ void stopCompSend_A(void)
Data[len++] =
((CemMsg.Cem.Value.Bro) << 0) + ((CemMsg.Cem.Value.Bcs) << 2) + ((CemMsg.Cem.Value.Bcl) << 4) + ((CemMsg.Cem.Value.Bst) << 6);
Data[len++] = CemMsg.Cem.Value.Bsd + ((0x3F & CemMsg.Cem.Value.Other) << 2);
TCUMultiPackSendMsg(Data, len, eCmd_stopComp, 4); //多包传输
TCUMultiPackSendMsg(Data, len, eCmd_stopComp, 4,ChargerCont1939Addr); //多包传输
}
......@@ -1358,7 +1370,7 @@ void stopCompSend_B(void)
u8 len = 0;
u8 reason;
Data[len++] = 0x01;
Data[len++] = 0x00;
GetStopReason_B(&reason);
Data[len++] = reason;
Data[len++] = 00; //成功标识
......@@ -1387,21 +1399,21 @@ void stopCompSend_B(void)
((CemMsg_B.Cem.Value.Bro) << 0) + ((CemMsg_B.Cem.Value.Bcs) << 2) + ((CemMsg_B.Cem.Value.Bcl) << 4) + ((CemMsg_B.Cem.Value.Bst) << 6);
Data[len++] = CemMsg_B.Cem.Value.Bsd + ((0x3F & CemMsg_B.Cem.Value.Other) << 2);
TCUMultiPackSendMsg(Data, len, eCmd_stopComp, 4); //多包传输
TCUMultiPackSendMsg(Data, len, eCmd_stopComp, 4,ChargerCont1939Addr_B); //多包传输
}
void stopCompAck(StructTCUSend * pPgnRecv)
{
if (pPgnRecv->Data[0] == 0x01)
if (pPgnRecv->Data[0] == 0x00)
{
AckStopCompMeg_A.GunNum = pPgnRecv->Data[0];
AckStopCompMeg_A.StopReason = pPgnRecv->Data[1];
AckStopCompMeg_A.AckFlag = pPgnRecv->Data[2];
TCUCurChgRecd.TCUChgStopCompNotetrl = 3; //停止完成帧命令发送
}
else if (pPgnRecv->Data[0] == 0x02)
else if (pPgnRecv->Data[0] == 0x00)
{
AckStopCompMeg_B.GunNum = pPgnRecv->Data[0];
AckStopCompMeg_B.StopReason = pPgnRecv->Data[1];
......@@ -1423,7 +1435,7 @@ void TCUHeartBeat_A(void)
Data[1] = CountNum++;
Data[2] = TCUCommuStatus.ConnectFlag;
Data[3] = TCUControlInfo.ChargingServiceFlag;
TCUSinglePackSendMsg(Data, 8, eCmd_ContHeart, 6);
TCUSinglePackSendMsg(Data, 8, eCmd_ContHeart, 6,ChargerCont1939Addr);
}
......@@ -1435,11 +1447,11 @@ void TCUHeartBeat_B(void)
};
static u8 CountNum; //最大255
Data[0] = 0x02;
Data[0] = 0x00;
Data[1] = CountNum++;
Data[2] = TCUCommuStatus.ConnectFlag;
Data[3] = TCUControlInfo.ChargingServiceFlag;
TCUSinglePackSendMsg(Data, 8, eCmd_ContHeart, 6);
TCUSinglePackSendMsg(Data, 8, eCmd_ContHeart, 6,ChargerCont1939Addr_B);
}
......@@ -1454,7 +1466,7 @@ void AckTCUHeartBeat(StructTCUSend * pPgnRecv)
TCUCommuStatus.ConnectFlag = CONNECT_NORMAL; //tcu检测控制器心跳状态
TCUCommuStatus.HeartBeatVaild = CONNECT_NORMAL; //控制器检测tcu心跳状态
TCUCommuStatus.HeartBeatVaild = 1; //控制器检测tcu心跳状态
}
......@@ -1465,7 +1477,16 @@ void TCUtimeSet(StructTCUSend * pPgnRecv)
cp56time2a * time = NULL;
TCUCommuStatus.ChgNum = pPgnRecv->Data[0];
//TCUCommuStatus.ChgNum = pPgnRecv->Data[0];
if(pPgnRecv->DA == ChargerCont1939Addr)
{
TCUCommuStatus.ChgNum = 1;
}
else if(pPgnRecv->DA == ChargerCont1939Addr_B)
{
TCUCommuStatus.ChgNum = 2;
}
TCUCommuStatus.TimeRecvTime = GetSystemTick();
TCUCommuStatus.CommStage = TimeStage;
......@@ -1494,7 +1515,7 @@ void TCUtimeSetAck(void)
StructTime Time;
cp56time2a * time = NULL;
Data[0] = TCUCommuStatus.ChgNum;
Data[0] = 0;//TCUCommuStatus.ChgNum;
StampToTime(RtcGetTime(), &Time);
time->year = Time.Year - 2000;
time->month = Time.Mon;
......@@ -1503,7 +1524,14 @@ void TCUtimeSetAck(void)
time->min = Time.Min;
time->msec = (((u16) Time.Sec) * 1000);
memcpy(&Data[1], time, 7);
TCUSinglePackSendMsg(Data, 8, eCmd_timeAck, 6);
if(TCUCommuStatus.ChgNum == 1)
{
TCUSinglePackSendMsg(Data, 8, eCmd_timeAck, 6,ChargerCont1939Addr);
}
else if(TCUCommuStatus.ChgNum == 2)
{
TCUSinglePackSendMsg(Data, 8, eCmd_timeAck, 6,ChargerCont1939Addr_B);
}
}
......@@ -1511,10 +1539,18 @@ void TCUVersionCheck(StructTCUSend * pPgnRecv)
{
u16 version;
TCUCommuStatus.ChgNum = pPgnRecv->Data[0];
//TCUCommuStatus.ChgNum = pPgnRecv->Data[0];
if(pPgnRecv->DA == ChargerCont1939Addr)
{
TCUCommuStatus.ChgNum = 1;
}
else if(pPgnRecv->DA == ChargerCont1939Addr_B)
{
TCUCommuStatus.ChgNum = 2;
}
version = (((u16) pPgnRecv->Data[2]) << 8) +pPgnRecv->Data[1];
if (TCUControlInfo.version == version)
if (TCUControlInfo.version <= version)
{
TCUCommuStatus.VerChkVaild = 1; //版本校验成功
TCUCommuStatus.CommStage = VersionStage;
......@@ -1536,16 +1572,32 @@ void TCUVersionCheckSent(void)
0
};
Data[0] = TCUCommuStatus.ChgNum;
Data[0] = 0;//TCUCommuStatus.ChgNum;
Data[1] = TCUControlInfo.version;
Data[2] = (u8) (TCUControlInfo.version >> 8);
TCUSinglePackSendMsg(Data, 8, eCmd_versiAck, 6);
if(TCUCommuStatus.ChgNum == 1)
{
TCUSinglePackSendMsg(Data, 8, eCmd_versiAck, 6,ChargerCont1939Addr);
}
else if(TCUCommuStatus.ChgNum == 2)
{
TCUSinglePackSendMsg(Data, 8, eCmd_versiAck, 6,ChargerCont1939Addr_B);
}
}
void TCUParam(StructTCUSend * pPgnRecv)
{
TCUCommuStatus.ChgNum = pPgnRecv->Data[0];
//TCUCommuStatus.ChgNum = pPgnRecv->Data[0];
if(pPgnRecv->DA == ChargerCont1939Addr)
{
TCUCommuStatus.ChgNum = 1;
}
else if(pPgnRecv->DA == ChargerCont1939Addr_B)
{
TCUCommuStatus.ChgNum = 2;
}
TCUCommuStatus.CommStage = ChageParamStage;
memcpy(TCUControlInfo.ChargeNum, &pPgnRecv->Data[0], 8);
TCUCommuStatus.ParamRecvTime = GetSystemTick();
......@@ -1557,7 +1609,7 @@ void TCUParamAck(void)
{
u8 Data[8];
memset(Data,0,8);
Data[0] = TCUCommuStatus.ChgNum;
Data[0] = 0;//TCUCommuStatus.ChgNum;
if ((TCUCommuStatus.VerChkVaild == 0) || (TCUCommuStatus.ConnectFlag == CONNECT_TIMEOUT))
{
......@@ -1575,21 +1627,36 @@ void TCUParamAck(void)
Data[2] = 0;
TCUCommuStatus.ParamVaild = 1;
}
if(TCUCommuStatus.ChgNum == 1)
{
TCUSinglePackSendMsg(Data, 8, eCmd_paramAck, 6,ChargerCont1939Addr);
}
else if(TCUCommuStatus.ChgNum == 2)
{
TCUSinglePackSendMsg(Data, 8, eCmd_paramAck, 6,ChargerCont1939Addr_B);
}
TCUSinglePackSendMsg(Data, 8, eCmd_paramAck, 6);
}
void SerConAckAnalysis(StructTCUSend * pPgnRecv)
{
TCUCommuStatus.ChgNum = pPgnRecv->Data[0];
//TCUCommuStatus.ChgNum = pPgnRecv->Data[0];
if(pPgnRecv->DA == ChargerCont1939Addr)
{
TCUCommuStatus.ChgNum = 1;
}
else if(pPgnRecv->DA == ChargerCont1939Addr_B)
{
TCUCommuStatus.ChgNum = 2;
}
TCUCommuStatus.CommStage = ServiceContralStage;
TCUCommuStatus.ServiceContralRecvTime = GetSystemTick();
TCUCommuStatus.ServiceContralSentTime = 0;
if ((pPgnRecv->Data[1] != 0x01) && (pPgnRecv->Data[1] != 0x02))
TCUCommuStatus.ServiceContralVaildValue = 1; //数据合法性校验失败
else if ((TCUCommuStatus.ConnectFlag == 0) || (TCUCommuStatus.HeartBeatVaild))
else if ((TCUCommuStatus.ConnectFlag == CONNECT_TIMEOUT) || (TCUCommuStatus.HeartBeatVaild))
TCUCommuStatus.ServiceContralVaildValue = 2; //通讯超时
else if (TCUCommuStatus.VerChkVaild == 0)
TCUCommuStatus.ServiceContralVaildValue = 3; //版本校验未完成
......@@ -1614,7 +1681,7 @@ void SerConAck(void)
0
};
Data[0] = TCUCommuStatus.ChgNum;
Data[0] = 0;//TCUCommuStatus.ChgNum;
Data[1] = TCUCommuStatus.ChargingServiceSetValue;
if (TCUCommuStatus.ServiceContralVaildValue == 0)
......@@ -1627,14 +1694,29 @@ void SerConAck(void)
Data[2] = 01; //失败
Data[3] = TCUCommuStatus.ServiceContralVaildValue; //失败
}
if(TCUCommuStatus.ChgNum == 1)
{
TCUSinglePackSendMsg(Data, 8, eCmd_SerConAck, 4,ChargerCont1939Addr);
}
else if(TCUCommuStatus.ChgNum == 2)
{
TCUSinglePackSendMsg(Data, 8, eCmd_SerConAck, 4,ChargerCont1939Addr_B);
}
TCUSinglePackSendMsg(Data, 8, eCmd_SerConAck, 4);
}
void ElectControlAnalysis(StructTCUSend * pPgnRecv)
{
TCUCommuStatus.ChgNum = pPgnRecv->Data[0];
//TCUCommuStatus.ChgNum = pPgnRecv->Data[0];
if(pPgnRecv->DA == ChargerCont1939Addr)
{
TCUCommuStatus.ChgNum = 1;
}
else if(pPgnRecv->DA == ChargerCont1939Addr_B)
{
TCUCommuStatus.ChgNum = 2;
}
TCUCommuStatus.ElectLockRecvTime = GetSystemTick();
TCUCommuStatus.CommStage = ElectLockStage;
TCUCommuStatus.ElectLockSentTime = 0;
......@@ -1643,7 +1725,7 @@ void ElectControlAnalysis(StructTCUSend * pPgnRecv)
if (((pPgnRecv->Data[1] != 0x01) && (pPgnRecv->Data[1] != 0x02)) || ((pPgnRecv->Data[2] != 0x01) &&
(pPgnRecv->Data[2] != 0x02)))
TCUCommuStatus.ElectLockVaildValue = 1; //数据合法性校验失败
else if ((TCUCommuStatus.ConnectFlag == 0) || (TCUCommuStatus.HeartBeatVaild))
else if ((TCUCommuStatus.ConnectFlag == CONNECT_TIMEOUT) || (TCUCommuStatus.HeartBeatVaild))
TCUCommuStatus.ElectLockVaildValue = 2; //通讯超时
else if (TCUCommuStatus.VerChkVaild == 0)
TCUCommuStatus.ElectLockVaildValue = 3; //版本校验未完成
......@@ -1685,7 +1767,7 @@ void ElectControlAck(void)
0
};
Data[0] = TCUCommuStatus.ChgNum;
Data[0] = 0;//TCUCommuStatus.ChgNum;
Data[1] = TCUCommuStatus.ElectLockSetValue;
if (PillarError.Value.EleLock == 1)
......@@ -1702,15 +1784,28 @@ void ElectControlAck(void)
Data[2] = 01; //失败
Data[3] = TCUCommuStatus.ServiceContralVaildValue; //失败
}
TCUSinglePackSendMsg(Data, 8, eCmd_GunAck, 4);
if(TCUCommuStatus.ChgNum == 1)
{
TCUSinglePackSendMsg(Data, 8, eCmd_GunAck, 4, ChargerCont1939Addr);
}
else if(TCUCommuStatus.ChgNum == 2)
{
TCUSinglePackSendMsg(Data, 8, eCmd_GunAck, 4,ChargerCont1939Addr_B);
}
}
void PowerControlAnalysis(StructTCUSend * pPgnRecv)
{
TCUCommuStatus.ChgNum = pPgnRecv->Data[0];
//TCUCommuStatus.ChgNum = pPgnRecv->Data[0];
if(pPgnRecv->DA == ChargerCont1939Addr)
{
TCUCommuStatus.ChgNum = 1;
}
else if(pPgnRecv->DA == ChargerCont1939Addr_B)
{
TCUCommuStatus.ChgNum = 2;
}
TCUCommuStatus.CommStage = PowerControlStage;
TCUCommuStatus.PowerControlRecvTime = GetSystemTick();
TCUCommuStatus.PowerControlSentTime = 0;
......@@ -1725,7 +1820,7 @@ void PowerControlAnalysis(StructTCUSend * pPgnRecv)
{
TCUCommuStatus.PowerControlVaildValue = 0; //数据合法性校验成功
if (pPgnRecv->Data[0] == 01) //a枪
if (pPgnRecv->DA == ChargerCont1939Addr) //a枪
{
TCUControlInfo.PowerControl_A.ControlType = pPgnRecv->Data[1];
......@@ -1738,7 +1833,7 @@ void PowerControlAnalysis(StructTCUSend * pPgnRecv)
TCUControlInfo.PowerControl_A.Percentage = pPgnRecv->Data[3];
}
}
else if (pPgnRecv->Data[0] == 02) //b枪
else if (pPgnRecv->DA == ChargerCont1939Addr_B) //b枪
{
TCUControlInfo.PowerControl_B.ControlType = pPgnRecv->Data[1];
......@@ -1762,7 +1857,7 @@ void PowerControlAck(void)
{
0
};
Data[0] = TCUCommuStatus.ChgNum;
Data[0] = 0;//TCUCommuStatus.ChgNum;
Data[1] = TCUCommuStatus.PowerControltype;
Data[2] = (u8)
TCUCommuStatus.PowerControlParam;
......@@ -1778,8 +1873,14 @@ void PowerControlAck(void)
Data[4] = 01;
Data[5] = TCUCommuStatus.PowerControlVaildValue; //失败
}
TCUSinglePackSendMsg(Data, 8, eCmd_powerAck, 4);
if(TCUCommuStatus.ChgNum == 1)
{
TCUSinglePackSendMsg(Data, 8, eCmd_powerAck, 4, ChargerCont1939Addr);
}
else if(TCUCommuStatus.ChgNum == 2)
{
TCUSinglePackSendMsg(Data, 8, eCmd_powerAck, 4, ChargerCont1939Addr_B);
}
}
......@@ -1801,12 +1902,12 @@ u8 InsertGunStatu_B(void)
void InformationReporting_22_A(void)
{
u8 Data[128] =
u8 Data[8] =
{
0
};
Data[0] = 0x01;
Data[0] = 0x00;
if ((ChargeCtrl.CurProcess == eChgPro_ChgIdle) && (TCUCurChgRecd.TCUChargeEnable == 0))
{
......@@ -1910,19 +2011,19 @@ void InformationReporting_22_A(void)
memcpy(&Data[1], InformainReport_A.data, 5);
Data[6] = 0;
Data[7] = 0;
TCUSinglePackSendMsg(Data, 8, eCmd_DCConInfor1, 4);
TCUSinglePackSendMsg(Data, 8, eCmd_DCConInfor1, 4, ChargerCont1939Addr);
}
void InformationReporting_22_B(void)
{
u8 Data[128] =
u8 Data[8] =
{
0
};
Data[0] = 0x02;
Data[0] = 0x00;
if ((ChargeCtrl_B.CurProcess == eChgPro_B_ChgIdle) && (TCUCurChgRecd_B.TCUChargeEnable == 0))
{
......@@ -2026,15 +2127,15 @@ void InformationReporting_22_B(void)
memcpy(&Data[1], InformainReport_B.data, 5);
Data[6] = 0;
Data[7] = 0;
TCUSinglePackSendMsg(Data, 8, eCmd_DCConInfor1, 4);
TCUSinglePackSendMsg(Data, 8, eCmd_DCConInfor1, 4, ChargerCont1939Addr_B);
}
void InformationReporting_23_A(void)
{
u8 Data[64];
u8 Data[8] ={0};
Data[0] = 0x01;
Data[0] = 0x00;
InformainReport2_A.InfRe.Door = PillarError.Value.Door;
InformainReport2_A.InfRe.DCOutConOn = 0x01;
......@@ -2052,45 +2153,44 @@ void InformationReporting_23_A(void)
InformainReport2_A.InfRe.Power = 00;
InformainReport2_A.InfRe.UniContactorOff = PillarError.Value.UniContactor;
InformainReport2_A.InfRe.UniContactorOn = 0x00;
TCUSinglePackSendMsg(Data, 8, eCmd_DCConInfor2, 6);
memcpy(&Data[1], &InformainReport2_A.data, 2);
TCUSinglePackSendMsg(Data, 8, eCmd_DCConInfor2, 3, ChargerCont1939Addr);
}
void InformationReporting_23_B(void)
{
u8 Data[64];
u8 Data[8] = {0};
Data[0] = 0x02;
Data[0] = 0x01;
InformainReport2_A.InfRe.Door = PillarError.Value.Door;
InformainReport2_A.InfRe.DCOutConOn = 0x01;
Data[0] = 0x00;
InformainReport2_B.InfRe.Door = PillarError_B.Value.Door;
InformainReport2_B.InfRe.DCOutConOn = 0x01;
if (((ChargeError.Value.IsolateWarn == 1) || (ChargeError.Value.IsolateError == 1)) &&
if (((ChargeError_B.Value.IsolateWarn == 1) || (ChargeError_B.Value.IsolateError == 1)) &&
(TCUCurChgRecd_B.TCUChargeEnable == 1))
InformainReport2_A.InfRe.ImdWarm = 0x01;
InformainReport2_B.InfRe.ImdWarm = 0x01;
else
InformainReport2_A.InfRe.ImdWarm = 0x00;
InformainReport2_A.InfRe.DrainResist = 0x00;
InformainReport2_A.InfRe.tempOver = 0;
InformainReport2_A.InfRe.gunTemp = 0;
InformainReport2_A.InfRe.AccContacON = PillarError.Value.ACContactor;
InformainReport2_A.InfRe.AccContacOff = 00;
InformainReport2_A.InfRe.Power = 00;
InformainReport2_A.InfRe.UniContactorOff = PillarError.Value.UniContactor;
InformainReport2_A.InfRe.UniContactorOn = 0x00;
TCUSinglePackSendMsg(Data, 8, eCmd_DCConInfor2, 6);
InformainReport2_B.InfRe.ImdWarm = 0x00;
InformainReport2_B.InfRe.DrainResist = 0x00;
InformainReport2_B.InfRe.tempOver = 0;
InformainReport2_B.InfRe.gunTemp = 0;
InformainReport2_B.InfRe.AccContacON = PillarError_B.Value.ACContactor;
InformainReport2_B.InfRe.AccContacOff = 00;
InformainReport2_B.InfRe.Power = 00;
InformainReport2_B.InfRe.UniContactorOff = PillarError_B.Value.UniContactor;
InformainReport2_B.InfRe.UniContactorOn = 0x00;
memcpy(&Data[1], &InformainReport2_B.data, 2);
TCUSinglePackSendMsg(Data, 8, eCmd_DCConInfor2, 3, ChargerCont1939Addr_B);
}
void measuringReporting20_A(void)
{
u8 Data[64];
u8 Data[32]={0};
u8 len = 0;
Data[len++] = 0x01;
Data[len++] = 0x00;
Data[len++] = GetDcModuleVolt();
Data[len++] = GetDcModuleVolt() >> 8;
Data[len++] = GetDcModuleCurrt();
......@@ -2118,20 +2218,20 @@ void measuringReporting20_A(void)
Data[len++] = Adc_Get_a_NTemp() + 50;
Data[len++] = Adc_Get_B_PTemp() + 50;
Data[len++] = Adc_Get_B_NTemp() + 50;
TCUMultiPackSendMsg(Data, len, eCmd_DCConMeasu, 6);
TCUMultiPackSendMsg(Data, len, eCmd_DCConMeasu, 6,ChargerCont1939Addr);
}
void measuringReporting20_B(void)
{
u8 Data[64];
u8 Data[32]={0};
u8 len = 0;
Data[len++] = 0x01;
Data[len++] = GetDcModuleVolt();
Data[len++] = GetDcModuleVolt() >> 8;
Data[len++] = GetDcModuleCurrt();
Data[len++] = GetDcModuleCurrt() >> 8;
Data[len++] = 0x00;
Data[len++] = GetDcModuleVolt_B();
Data[len++] = GetDcModuleVolt_B() >> 8;
Data[len++] = GetDcModuleCurrt_B();
Data[len++] = GetDcModuleCurrt_B() >> 8;
Data[len++] = BcsMsg_B.CurSoc;
Data[len++] = BsmMsg_B.HighTemp;
Data[len++] = BsmMsg_B.LowTemp;
......@@ -2155,7 +2255,7 @@ void measuringReporting20_B(void)
Data[len++] = Adc_Get_a_NTemp() + 50;
Data[len++] = Adc_Get_B_PTemp() + 50;
Data[len++] = Adc_Get_B_NTemp() + 50;
TCUMultiPackSendMsg(Data, len, eCmd_DCConMeasu, 6);
TCUMultiPackSendMsg(Data, len, eCmd_DCConMeasu, 6, ChargerCont1939Addr_B);
}
......@@ -2164,7 +2264,7 @@ void ChgInfornQueryAck(void)
u8 data[128];
u8 len = 0;
data[len++] = TCUCommuStatus.ChgNum;
data[len++] = 0;//TCUCommuStatus.ChgNum;
memcpy(&data[len], TCUControlInfo.ManufacturerCode, 4);
len += 4;
memcpy(&data[len], TCUControlInfo.DeviceModel, 2);
......@@ -2188,16 +2288,25 @@ void ChgInfornQueryAck(void)
data[len++] = (u8) ((4000 - TCUControlInfo.DcMaxCurrt) >> 8);
data[len++] = (u8) (4000 - TCUControlInfo.DcMinCurrt);
data[len++] = (u8) ((4000 - TCUControlInfo.DcMinCurrt) >> 8);
TCUMultiPackSendMsg(data, len, eCmd_QueryAck, 6);
if(TCUCommuStatus.ChgNum == 1)
{
TCUMultiPackSendMsg(data, len, eCmd_QueryAck, 6, ChargerCont1939Addr);
}
else if(TCUCommuStatus.ChgNum == 2)
{
TCUMultiPackSendMsg(data, len, eCmd_QueryAck, 6, ChargerCont1939Addr_B);
}
}
void verification(void)
{
u8 data[128];
u8 data[32] = {0};
u8 len = 0;
data[len++] = 0x01;
data[len++] = 0x00;
memcpy(&data[len], BrmMsg.Vin, 17);
len += 17;
memcpy(&data[len], &BrmMsg.ChgCount, 3);
......@@ -2206,16 +2315,16 @@ void verification(void)
len += 3;
memcpy(&data[len], &BcpMsg.StartVolt, 2);
len += 2;
TCUMultiPackSendMsg(data, len, eCmd_verification, 6);
TCUMultiPackSendMsg(data, len, eCmd_verification, 6,ChargerCont1939Addr);
}
void verification_B(void)
{
u8 data[128];
u8 data[32] = {0};
u8 len = 0;
data[len++] = 0x02;
data[len++] = 0x00;
memcpy(&data[len], BrmMsg_B.Vin, 17);
len += 17;
memcpy(&data[len], &BrmMsg_B.ChgCount, 3);
......@@ -2224,19 +2333,19 @@ void verification_B(void)
len += 3;
memcpy(&data[len], &BcpMsg_B.StartVolt, 2);
len += 2;
TCUMultiPackSendMsg(data, len, eCmd_verification, 6);
TCUMultiPackSendMsg(data, len, eCmd_verification, 6,ChargerCont1939Addr_B);
}
void verificationAck(StructTCUSend * pPgnRecv)
{
if (pPgnRecv->Data[0] == 0x01)
if (pPgnRecv->DA == ChargerCont1939Addr)
{
VerificaInfo.result = pPgnRecv->Data[1];
VerificaInfo.FailReason = pPgnRecv->Data[2];
}
else if (pPgnRecv->Data[0] == 0x02)
else if (pPgnRecv->DA == ChargerCont1939Addr_B)
{
VerificaInfo_B.result = pPgnRecv->Data[1];
VerificaInfo_B.FailReason = pPgnRecv->Data[2];
......@@ -2248,9 +2357,9 @@ void TcuEMMsg(u8 data)
{
u8 Data[8];
Data[0] = 0x01;
Data[0] = 0x00;
Data[1] = data;
TCUSinglePackSendMsg(Data, 8, eCmd_ConErroComm, 4);
TCUSinglePackSendMsg(Data, 8, eCmd_ConErroComm, 4,ChargerCont1939Addr);
}
......@@ -2258,34 +2367,30 @@ void TcuEMMsg_B(u8 data)
{
u8 Data[8];
Data[0] = 0x02;
Data[0] = 0x00;
Data[1] = data;
TCUSinglePackSendMsg(Data, 8, eCmd_ConErroComm, 4);
TCUSinglePackSendMsg(Data, 8, eCmd_ConErroComm, 4,ChargerCont1939Addr_B);
}
void TCUErroCommAnalysis(StructTCUSend * pPgnRecv)
{
if (pPgnRecv->Data[0] == 1)
if (pPgnRecv->DA == ChargerCont1939Addr)
memcpy(&TCUChgContralTCUEM_A.tcuem, &pPgnRecv->Data[1], 2);
else if (pPgnRecv->Data[0] == 2)
else if (pPgnRecv->DA == ChargerCont1939Addr_B)
memcpy(&TCUChgContralTCUEM_B.tcuem, &pPgnRecv->Data[1], 2);
}
void TCUMeasuRecv(StructTCUSend * pPgnRecv)
{
if(pPgnRecv->Data[0] == 0)
if(pPgnRecv->DA == ChargerCont1939Addr)
{
TCUCommuStatus.DCMeasuRecvTime = GetSystemTick();
TCUCommuStatus.DCMeasuRecvTime_B = GetSystemTick();
}
else if(pPgnRecv->Data[0] == 1)
{
TCUCommuStatus.DCMeasuRecvTime = GetSystemTick();
}
else if(pPgnRecv->Data[0] == 2)
else if(pPgnRecv->DA == ChargerCont1939Addr_B)
{
TCUCommuStatus.DCMeasuRecvTime_B = GetSystemTick();
}
}
......@@ -219,6 +219,8 @@ typedef struct
#define TCU1939Addr (0x8A)
#define ChargerCont1939Addr (0xE0)
#define ChargerCont1939Addr_B (0xE1)
typedef enum
{
eCmd_start = 0x000100,// 充电启动帧
......
......@@ -77,7 +77,15 @@ void TCURecvProcess(void)
break;
case eCmd_Query: // 充电桩配置信息查询帧
TCUCommuStatus.ChgNum = pPgnRecv.Data[0];
//TCUCommuStatus.ChgNum = pPgnRecv.Data[0];
if(pPgnRecv.DA == ChargerCont1939Addr)
{
TCUCommuStatus.ChgNum = 1;
}
else if(pPgnRecv.DA == ChargerCont1939Addr_B)
{
TCUCommuStatus.ChgNum = 2;
}
TCUCommuStatus.CommStage = ChgInfornQueryStage;
TCUCommuStatus.ChgInfornQueryRecvTime = GetSystemTick();
TCUCommuStatus.ChgInfornQuerySentTime = 0;
......@@ -159,7 +167,7 @@ void DCMeasuring_A(void)
if (TCUCommuStatus.DCMeasuErrCnt > 5)
{
memset(&TCUCommuStatus, 0x00, sizeof(TCUCommuStatus)); //通讯初始化
TCUCommuStatus.ConnectFlag = 0;
TCUCommuStatus.ConnectFlag = CONNECT_TIMEOUT;
TCUCommuStatus.HeartBeatErrCnt = 0;
TCUCommuStatus.HeartBeatVaild = 0; //心跳失效
TCUCanInit(); //can通讯接口初始化
......@@ -195,7 +203,7 @@ void DCMeasuring_B(void)
if (TCUCommuStatus.DCMeasuErrCnt_B > 5)
{
memset(&TCUCommuStatus, 0x00, sizeof(TCUCommuStatus)); //通讯初始化
TCUCommuStatus.ConnectFlag = 0;
TCUCommuStatus.ConnectFlag = CONNECT_TIMEOUT;
TCUCommuStatus.HeartBeatErrCnt = 0;
TCUCommuStatus.HeartBeatVaild = 0; //心跳失效
TCUCanInit();
......@@ -340,8 +348,8 @@ void TCUPillarHeartBeat(void)
{
u32 SendTick;
if (TCUCommuStatus.HeartBeatVaild != CONNECT_NORMAL)
return;
//if (TCUCommuStatus.HeartBeatVaild != CONNECT_NORMAL)
// return;
if (0 == TCUCommuStatus.HeartBeatRecvTime) //初始12s一次
{
......@@ -352,7 +360,7 @@ void TCUPillarHeartBeat(void)
if (TCUCommuStatus.HeartBeatErrCnt > TCUCommuParam.HeartErrCntMax)
{
memset(&TCUCommuStatus, 0x00, sizeof(TCUCommuStatus)); //通讯初始化
TCUCommuStatus.ConnectFlag = 0;
TCUCommuStatus.ConnectFlag = CONNECT_TIMEOUT;
TCUCommuStatus.HeartBeatErrCnt = 0;
TCUCommuStatus.HeartBeatVaild = 0; //心跳失效
TCUCanInit();
......@@ -383,10 +391,10 @@ void TCUPillarHeartBeat_B(void)
{
u32 SendTick;
if (TCUCommuStatus.HeartBeatVaild != CONNECT_NORMAL)
return;
//if (TCUCommuStatus.HeartBeatVaild != CONNECT_NORMAL)
// return;
if (0 == TCUCommuStatus.HeartBeatRecvTime_B) //初始12s一次
/*if (0 == TCUCommuStatus.HeartBeatRecvTime_B) //初始12s一次
{
if ((GetSystemTick() -TCUCommuStatus.HeartBeatSendTime_B) > ((u32) TCUCommuParam.HeartTimeout * 1000))
{
......@@ -394,7 +402,7 @@ void TCUPillarHeartBeat_B(void)
if (TCUCommuStatus.HeartBeatErrCnt_B > TCUCommuParam.HeartErrCntMax)
{
TCUCommuStatus.ConnectFlag = 0;
TCUCommuStatus.ConnectFlag = CONNECT_TIMEOUT;
TCUCommuStatus.HeartBeatErrCnt_B = 0;
TCUCommuStatus.HeartBeatVaild = 0; //心跳失效
TCUCanInit();
......@@ -407,7 +415,7 @@ void TCUPillarHeartBeat_B(void)
}
}
}
else
else */
{ //心跳周期
SendTick = ((u32) TCUCommuParam.HeartPeriod * 1000);
......@@ -838,15 +846,25 @@ void TCULinkProcess(void) //心跳帧处理
}
osMessageQId TcuSendMsgId = 0;
void TCUComm(void const * argument)
{
osDelay(6000);
TCUCommInit();
TcuSendMsgId = NULL;
osMessageQDef(TcuSendMsgId, 128, StructChargeSend);
TcuSendMsgId = osMessageCreate(osMessageQ(TcuSendMsgId), NULL);
for (; ; )
{
StructChargeSend DataSend;
if (pdTRUE == xQueueReceive(TcuSendMsgId, &DataSend, 0))
{
TCUSendMsg(&DataSend);
}
TCURecvProcess(); //帧接收
TCUWorkProcess(); //遥测遥信息处理
......@@ -855,7 +873,7 @@ void TCUComm(void const * argument)
// TCUCodeDone();//告警故障处理
// TCUSaveEventDone();
osDelay(100);
osDelay(10);
}
}
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论