提交 17e9ce90 作者: wysheng

完善TCU定值设置与查询

上级 72b47ca6
......@@ -101,6 +101,10 @@ void TCURxIrqHandle(void)
case eCmd_Gun: // 电子锁可控制帧
case eCmd_power: // 功率调节控制帧
case eCmd_Query: // 充电桩配置信息查询帧
case eCmd_reset: //立即复位命令帧
case eCmd_valueSet: //定值设置命令帧
case eCmd_valueQuery: //定值查询命令帧
case eCmd_debugInfo: //调试信息
case eCmd_verificationAck: //车辆验证应答帧
////////////状态帧/////////////////
case eCmd_startCompAck: // 充电启动完成应答帧
......@@ -195,6 +199,10 @@ void TCURxIrqHandle(void)
case eCmd_Gun: // 电子锁可控制帧
case eCmd_power: // 功率调节控制帧
case eCmd_Query: // 充电桩配置信息查询帧
case eCmd_reset: //立即复位命令帧
case eCmd_valueSet: //定值设置命令帧
case eCmd_valueQuery: //定值查询命令帧
case eCmd_debugInfo: //调试信息
case eCmd_verificationAck: //车辆验证应答帧
////////////状态帧/////////////////
case eCmd_startCompAck: // 充电启动完成应答帧
......@@ -2239,7 +2247,7 @@ void PowerControlAnalysis(StructTCUSend * pPgnRecv)
TCUCommuStatus.PowerControlVaildValue = 0; //数据合法性校验成功
TCUControlInfo.PowerControl_A.ControlType = pPgnRecv->Data[1];
memset(&TCUControlInfo.PowerControl_A, 0 sizeof(StructPowerControl));
memset(&TCUControlInfo.PowerControl_A, 0 ,sizeof(StructPowerControl));
if (pPgnRecv->Data[1] == 01)
{
TCUControlInfo.PowerControl_A.Kwh = ((u16) pPgnRecv->Data[3] << 8) +pPgnRecv->Data[2] -1000;
......@@ -2264,7 +2272,7 @@ void PowerControlAnalysis(StructTCUSend * pPgnRecv)
else
{
TCUCommuStatus_B.PowerControlVaildValue = 0; //数据合法性校验成功
memset(&TCUControlInfo.PowerControl_B, 0 sizeof(StructPowerControl));
memset(&TCUControlInfo.PowerControl_B, 0 ,sizeof(StructPowerControl));
TCUControlInfo.PowerControl_B.ControlType = pPgnRecv->Data[1];
if (pPgnRecv->Data[1] == 01)
......@@ -2293,8 +2301,7 @@ void PowerControlAck(u8 ChgNum)
{
Data[0] = 0;
Data[1] = TCUCommuStatus.PowerControltype;
Data[2] = (u8)
TCUCommuStatus.PowerControlParam;
Data[2] = (u8) (TCUCommuStatus.PowerControlParam);
Data[3] = (u8) (TCUCommuStatus.PowerControlParam >> 8);
if (TCUCommuStatus.PowerControlVaildValue == 0)
......@@ -2821,11 +2828,9 @@ void ChgInfornQueryAck(u8 ChgNum)
len += 4;
data[len++] = TCUControlInfo.BmsVersion;
data[len++] = (u8)
TCUControlInfo.DcMaxVolt;
data[len++] = (u8) (TCUControlInfo.DcMaxVolt);
data[len++] = (u8) (TCUControlInfo.DcMaxVolt >> 8);
data[len++] = (u8)
TCUControlInfo.DcMinVolt;
data[len++] = (u8) (TCUControlInfo.DcMinVolt);
data[len++] = (u8) (TCUControlInfo.DcMinVolt >> 8);
data[len++] = (u8) (4000 - TCUControlInfo.DcMaxCurrt);
......@@ -3122,3 +3127,294 @@ void VehicleVerificationHandle(void)
}
u8 TCUValueSetAddr = 0;
void TCUValueSetHandle(StructTCUSend * pPgnRecv)
{
static u8 index = 0;
static u8 step = 0;
static u16 len = 0;
static u8 count = 0;
static u8 date[64] = {0};
TCUValueSetAddr = pPgnRecv->DA;
if(pPgnRecv->Data[0] != 0)
{
if(step == 0)
{
if(pPgnRecv->Data[0] == 1)
{
//报文总帧数
count = pPgnRecv->Data[1];
//报文有效数据长度
len = pPgnRecv->Data[3];
len = len<<8 + pPgnRecv->Data[2];
memcpy(date,&(pPgnRecv->Data[4]),4);
index = 4;
}
}
else if(step == count)
{
memcpy(date,&(pPgnRecv->Data[1]),len+2-index);
index = len+2;
TCUValueSetMsg(date,index);
step = 0;
index = 0;
}
else
{
memcpy(date,&(pPgnRecv->Data[1]),7);
index += 7;
}
}
else
{
index = 0;
step = 0;
memcpy(date,&(pPgnRecv->Data[0]),8);
TCUValueSetMsg(date,8);
}
}
u8 setValue(u16 index, u8 *pdate)
{
/*
0x00 --- 成功
0x01 --- 无该定值
0x02 --- 禁止写入
0x03 --- 写入失败
0x04 --- 给定越限
*/
u8 reason = 0;
return reason;
}
u8 getValue(u16 index, u8 *pdate)
{
/*
0x00 --- 成功
0x01 --- 无该定值
0x02 --- 禁止读出
0x03 --- 读出失败
*/
u8 reason = 0;
return reason;
}
u8 getValueLen(u16 index)
{
u8 len = 0;
return len;
}
typedef union
{
u8 data;
struct {
/*Bit7: 成功标识
0x00 --- 失败 0x01 --- 成功
Bit6 ~ Bit4:预留
Bit3 ~ Bit0:失败原因
0x00 --- 成功
0x01 --- 无该定值
0x02 --- 禁止写入
0x03 --- 写入失败
0x04 --- 给定越限*/
u8 reason : 4;
u8 reserve : 3;
u8 flag : 1;
}resultInfo;
} UnionTCUValueSetResult;
typedef struct
{
u8 device_type;//2 设备类型
u8 device_addr;//3 设备通信地址
u16 value_index;//4 定值序号 2byte
u8 data[32];//7 定值信息
UnionTCUValueSetResult result;
} StructTCUValueSet;
StructTCUValueSet TCUValueSetDate;
void TCUValueSetMsg(u8 * date, u8 len)
{
u8 ret = 0;
if(len > 8)
{
u16 checksum = 0;
u16 checksumCount = 0;
for(u8 i=0;i<len-2;i++)
{
checksumCount += date[i];
}
checksum = date[len-1];
checksum = (checksum<<8) + date[len-2];
if(checksum != checksumCount)
{
//校验失败
return;
}
}
memset(&TCUValueSetDate,0,sizeof(StructTCUValueSet));
//1 充电接口标识
//2 设备类型
TCUValueSetDate.device_type = date[1];
//3 设备通信地址
TCUValueSetDate.device_addr = date[2];
//4 定值序号 2byte
TCUValueSetDate.value_index = date[4];
TCUValueSetDate.value_index = (TCUValueSetDate.value_index<<8) + date[3];
//6 预留
//7 定值信息
memcpy(TCUValueSetDate.data,&date[6],len-6);
ret = setValue(TCUValueSetDate.value_index,TCUValueSetDate.data);
if(ret == 0)
{
TCUValueSetDate.result.resultInfo.flag = 1;
}
else
{
TCUValueSetDate.result.resultInfo.reason = ret;
}
}
void TCUValueSetAck(void)
{
u8 date[40];
u8 len = 0;
u8 value_len = 0;
//1 充电接口标识
date[len++] = 0;
//2 设备类型
date[len++] = TCUValueSetDate.device_type;
//3 设备通信地址
date[len++] = TCUValueSetDate.device_addr;
//4 定值序号
date[len++] = (u8)(TCUValueSetDate.value_index);
date[len++] = (u8)(TCUValueSetDate.value_index>>8);
//6 操作返回
date[len++] = TCUValueSetDate.result.data;
//7 定值信息
value_len = getValueLen(TCUValueSetDate.value_index);
memcpy(&date[len],TCUValueSetDate.data,value_len);
len += value_len;
if(len > 8)
{
TCUMultiPackSendMsg(date, len, eCmd_valueSetAck, 6, TCUValueSetAddr);
}
else
{
TCUSinglePackSendMsg(date,8,eCmd_valueSetAck,6,TCUValueSetAddr);
}
}
typedef union
{
u8 data;
struct {
/*
Bit7: 成功标识
0x00 --- 失败 0x01 --- 成功
Bit6 ~ Bit4:预留
Bit3 ~ Bit0:失败原因
0x00 --- 成功
0x01 --- 无该定值
0x02 --- 禁止读出
0x03 --- 读出失败
*/
u8 reason : 4;
u8 reserve : 3;
u8 flag : 1;
}resultInfo;
} UnionTCUValueQueryResult;
typedef struct
{
u8 device_type;//2 设备类型
u8 device_addr;//3 设备通信地址
u16 value_index;//4 定值序号 2byte
UnionTCUValueQueryResult result;
} StructTCUValueQuery;
StructTCUValueQuery TCUValueQueryMsg = {0};
u8 TCUValueQueryAddr = 0;
void TCUValueQueryHandle(StructTCUSend * pPgnRecv)
{
memset(&TCUValueSetDate,0,sizeof(StructTCUValueSet));
TCUValueQueryAddr = pPgnRecv->DA;
//1 充电接口标识
//2 设备类型
TCUValueQueryMsg.device_type = pPgnRecv->Data[1];
//3 设备通信地址
TCUValueQueryMsg.device_addr = pPgnRecv->Data[2];
//4 定值序号 2byte
TCUValueQueryMsg.value_index = pPgnRecv->Data[4];
TCUValueQueryMsg.value_index = (TCUValueQueryMsg.value_index<<8) + pPgnRecv->Data[3];
}
void TCUValueQueryAck(void)
{
u8 date[40] = {0};
u8 len = 0;
u8 ret = 0;
//1 充电接口标识
date[len++] = 0;
//2 设备类型
date[len++] = TCUValueQueryMsg.device_type;
//3 设备通信地址
date[len++] = TCUValueQueryMsg.device_addr;
//4 定值序号
date[len++] = (u8)(TCUValueQueryMsg.value_index);
date[len++] = (u8)(TCUValueQueryMsg.value_index>>8);
//6 操作返回
//7 定值信息
ret = getValue(TCUValueQueryMsg.value_index, &date[6]);
if(ret == 0)
{
TCUValueQueryMsg.result.resultInfo.flag = 1;
}
else
{
TCUValueQueryMsg.result.resultInfo.reason = ret;
}
date[len++] = TCUValueQueryMsg.result.data;
len += getValueLen(TCUValueQueryMsg.value_index);
if(len > 8)
{
TCUMultiPackSendMsg(date, len, eCmd_valueQueryAck, 6, TCUValueQueryAddr);
}
else
{
TCUSinglePackSendMsg(date,8,eCmd_valueQueryAck,6,TCUValueQueryAddr);
}
}
void TCUDebugInfoHandle(StructTCUSend * pPgnRecv)
{
//1 充电接口标识
//2 设备类型
//3 设备通信地址
//4 厂商自定义内容
}
void TCUDebugInfoAck(void)
{
}
......@@ -351,8 +351,8 @@ typedef enum
//完成组包应答帧 007B00H
//程序校验数据帧 007C00H
//程序校验应答帧 007D00H
//eCmd_reset = 0x007E00,//立即复位命令帧 007E00H
//eCmd_resetAck = 0x007F00,//立即复位应答帧 007F00H
eCmd_reset = 0x007E00,//立即复位命令帧 007E00H
eCmd_resetAck = 0x007F00,//立即复位应答帧 007F00H
/*****************在线升级命令 end*******************/
eCmd_valueSet = 0x008000,//定值设置命令帧 008000H
......@@ -360,34 +360,37 @@ typedef enum
eCmd_valueQuery = 0x008200,//定值查询命令帧 008200H
eCmd_valueQueryAck = 0x008300,//定值查询命令应答帧 008300H
eCmd_debugInfo = 0x008E00,//调试信息下行命令帧 0x8E
eCmd_debugInfoAck = 0x008F00,//调试信息上行帧 0x8F
eCmd_verification = 0x002D00,//车辆验证数据帧
eCmd_verificationAck = 0x002E00,//车辆验证应答帧
////////////状态帧/////////////////
eCmd_startComp =0x001100,// 充电启动完成帧
eCmd_startCompAck =0x001200,// 充电启动完成应答帧
eCmd_startComp = 0x001100,// 充电启动完成帧
eCmd_startCompAck = 0x001200,// 充电启动完成应答帧
eCmd_stopComp =0x001300,// 充电停止完成帧
eCmd_stopCompAck =0x001400,// 充电停止完成应答帧
eCmd_stopComp = 0x001300,// 充电停止完成帧
eCmd_stopCompAck = 0x001400,// 充电停止完成应答帧
eCmd_status =0x001500,//充电桩状态帧
eCmd_status = 0x001500,//充电桩状态帧
///////////数据帧/直流////////////
eCmd_DCConMeasu =0x002000,// 充电控制器遥测帧
eCmd_DCTCUMeasu =0x002100,// 计费单元遥测帧
eCmd_DCConInfor1 =0x002200,// 充电控制器遥信帧
eCmd_DCConInfor2 =0x002300,// 充电控制器遥信帧
eCmd_DCConMeasu = 0x002000,// 充电控制器遥测帧
eCmd_DCTCUMeasu = 0x002100,// 计费单元遥测帧
eCmd_DCConInfor1 = 0x002200,// 充电控制器遥信帧
eCmd_DCConInfor2 = 0x002300,// 充电控制器遥信帧
///////////数据帧/交流////////////
eCmd_ACConMeasu =0x003000,// 充电控制器遥测帧
eCmd_ACTCUMeasu =0x003100,// 计费单元遥测 帧
eCmd_ACConInfor =0x003200,// 充电控制器遥信帧
eCmd_ACTCUInfor =0x003300,// 计费单元遥信帧
eCmd_ACConMeasu = 0x003000,// 充电控制器遥测帧
eCmd_ACTCUMeasu = 0x003100,// 计费单元遥测 帧
eCmd_ACConInfor = 0x003200,// 充电控制器遥信帧
eCmd_ACTCUInfor = 0x003300,// 计费单元遥信帧
///////////心跳帧///////////
eCmd_TcuHeart =0x004000, // 计费单元心跳
eCmd_ContHeart =0x004100, // 充电控制器心跳帧
eCmd_TcuHeart = 0x004000, // 计费单元心跳
eCmd_ContHeart = 0x004100, // 充电控制器心跳帧
eCmd_TCUErroComm =0x005100, // 计费单元错误帧
eCmd_ConErroComm =0x005200, //充电控制器错误帧
eCmd_TCUErroComm = 0x005100, // 计费单元错误帧
eCmd_ConErroComm = 0x005200, //充电控制器错误帧
}EnumTCUCommPgn;
extern u8 TCUCommInit(void);
......@@ -457,6 +460,10 @@ extern StructTCUEM TCUChgContralTCUEM_B;
void TCUStartDownloadHandle(StructTCUSend * pPgnRecv);
void StartDownloadAck(u8 ChgNum);
void TCUValueSetHandle(StructTCUSend * pPgnRecv);
void TCUValueSetMsg(u8 * date, u8 len);
void TCUValueQueryHandle(StructTCUSend * pPgnRecv);
void TCUDebugInfoHandle(StructTCUSend * pPgnRecv);
#endif
......
......@@ -124,6 +124,15 @@ void TCURecvProcess(void)
case eCmd_startDownload:
TCUStartDownloadHandle(&pPgnRecv);
break;
case eCmd_valueSet:
TCUValueSetHandle(&pPgnRecv);
break;
case eCmd_valueQuery:
TCUValueQueryHandle(&pPgnRecv);
break;
case eCmd_debugInfo:
TCUDebugInfoHandle(&pPgnRecv);
break;
default:
break;
}
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论