Files
CCU621M/app/plat_comm/ieszt/bs_ies_interface.c
T

1772 lines
70 KiB
C

#include <string.h>
#include "plat_comm/ieszt/bs_ies_ctrl.h"
#include "plat_comm/ieszt/bs_ies_interface.h"
#include "plat_comm/impl/bs_connect_impl.h"
#include "plat_comm/impl/bs_public_impl.h"
#if WH_GM5_EN
#include "plat_comm/4g_module/bs_wh_gm5.h"
#endif
#include "flowctrl/flowctrl_task.h"
#include "fault_cheak/fault_interface.h"
#include "meter_calculate/meter_calculate_impl.h"
#if(BS_IES_EN)
S_BS_IES_CTRL_DATA *private_ies_data1 = &s_bs_task_ctrl.s_ies_data;
#if 1 //公共使用函数
//23 u8_frm_type帧类型;u8_data_obj数据对象低6位;s16_serialNum序列号-1使用自增序号否则为应答帧使用询问帧序号
static IESZT_REASON_E e_get_ies_stop_res(S_LOG_DATA *t_chgRcd) //转换成积成平台的停止原因
{
IESZT_REASON_E ret ;
E_FAULT_INFO fault_info = t_chgRcd->e_stop_reason[0]; //订单停止原因
// if(fault_info == E_NORMAL_1000)
// ret = IESZT_NORMAL ;//0正常
if(fault_info == E_FAULT_17007 ||fault_info == E_FAULT_17009)
ret = IESZT_STARTING_FAULT ;//1启动中有报警
else if(fault_info == E_FAULT_13042)
ret = IESZT_INSU_FAIL ;//2绝缘检测失败
else if(fault_info == E_FAULT_13103)
ret = IESZT_DY_SWCH_FAIL ;//3控制辅源电压检测切换失败
else if(fault_info == E_FAULT_13007)
ret = IESZT_DY_FAIL ;//4投辅源失败
else if(fault_info == E_FAULT_13052)
ret =IESZT_STARTING_BATVOLT_FAIL ;//6启动中,检测电池电压失败
else if(fault_info == E_FAULT_13005)
ret = IESZT_KM_ON_FAIL ;//7合直流输出开关失败
else if(fault_info == E_FAULT_14020)
ret = IESZT_MDU_STAT_FAIL ;//8模块启动失败
else if(fault_info == E_FAULT_13015|| fault_info == E_FAULT_13016)
ret = IESZT_CHGING_GUN_UNCNCT ;//10充电中,检测到枪未连接到车上
// else if(fault_info == )
// ret =IESZT_CHGING_DY_OFF ;//11充电中未检测到辅源
else if(fault_info == E_FAULT_13050)
ret =IESZT_CHGING_BATVOLT_FAIL ;//12充电中未检测到电池电压
else if(fault_info == E_NORMAL_1001)
ret = IESZT_CARD ;//13刷卡停机
else if(fault_info == E_NORMAL_1012)
ret = IESZT_NO_BALANCE ;//14余额不足
// else if(fault_info == )
// ret = IESZT_BMS_ABNMAL ;//15充电中BMS异常停机
else if(fault_info == E_NORMAL_1000 || fault_info == E_NORMAL_1016 ||fault_info == E_FAULT_15042)
ret = IESZT_BMS_FULL ;//16充电中BMS充满停机
else if(fault_info == E_FAULT_14037)
ret = IESZT_BMS_DMD_VOLT_OVER ;//18充电中,BMS需求电压越限
else if(fault_info == E_FAULT_13049 || fault_info == E_FAULT_13054 || fault_info == E_FAULT_13104 || fault_info == E_FAULT_15044)
ret = IESZT_CURR_OVER ;//19充电中,过流
else if(fault_info == E_FAULT_13013 || fault_info == E_FAULT_13014)
ret = IESZT_GUN_TEMP_OVER ;//20充电中,枪温过温
else if(fault_info == E_FAULT_15000)
ret = IESZT_BMS_TO ;//21 BMS通信超时
else if(fault_info == E_FAULT_15001)
ret = IESZT_BMS_COMM_INTRPUT ;//24 BMS通信中断
else if(fault_info == E_NORMAL_1002)
ret = IESZT_APP_STOP ;//27 APP停止充电
// else if(fault_info == )
// ret = IESZT_K1K2_OFF ;//28 K1/K2闭合失败
else if(fault_info == E_FAULT_13010)
ret = IESZT_LOCK_GUN_FAIL ;//30 锁枪失败
else if(fault_info == E_FAULT_14021)
ret = IESZT_INSU_TO ;//34 绝缘检测超时
else if(fault_info == E_NORMAL_1011)
ret = IESZT_BSM_STOP ;//35 bsm终止
else if(fault_info == E_FAULT_13009 || fault_info == E_FAULT_13047 )
ret = IESZT_RELIEF_ON ;//42 启机过程中泄放继电器非法合
else if(fault_info == E_NORMAL_1005 || fault_info == E_NORMAL_1013)
ret = IESZT_MONEY_OK ;//43 达到设定金额
else if(fault_info == E_NORMAL_1003)
ret = IESZT_TIME_OK ;//44 达到设定时长
else if(fault_info == E_NORMAL_1004)
ret = IESZT_POWER_OK ;//45 达到设定电量
else if(fault_info == E_FAULT_13017 || fault_info == E_FAULT_17000)
ret = IESZT_URGENCY ;//50 急停
else if(fault_info == E_FAULT_13018 ||fault_info == E_FAULT_13019 || fault_info == E_FAULT_17001)
ret = IESZT_ACS ;//51 门禁
else if(fault_info == E_FAULT_13033 ||fault_info == E_FAULT_13034 || fault_info == E_FAULT_17002)
ret = IESZT_WATER ;//52 水浸
else if(fault_info == E_FAULT_13001 || fault_info == E_FAULT_17003)
ret = IESZT_FS ;//53 防雷
else if(fault_info == E_FAULT_13027 || fault_info == E_FAULT_13028)
ret = IESZT_OVER_TEMP ;//54 环温过温
else if(fault_info == E_FAULT_13070)
ret = IESZT_CARdREADER_COMM ;//56 读卡器通信故障
else if(fault_info == E_FAULT_13089)
ret = IESZT_LCD_COMM ;//57 LCD通信故障
else if(fault_info == E_FAULT_13071)
ret = IESZT_WHM_COMM ;//60 电表通信故障
else if(fault_info == E_FAULT_13006)
ret = IESZT_FUSE ;//61 直流熔断器故障
else if(fault_info == E_FAULT_13004)
ret = IESZT_GUN_KM_ADHESION ;//62 #号枪对应直流输出接触器黏连故障 - 空闲,应断开,但检测到为闭合
else if(fault_info == E_FAULT_14019)
ret = IESZT_MDU_COMM_DOWN ;//63 所有模块通信中断
else if(fault_info == E_FAULT_14037)
ret = IESZT_PRE_CHGOT ;//64 充电机预充超时
else if(fault_info == E_FAULT_15011 || fault_info == E_FAULT_15032)
ret = IESZT_BMS_BRM_OT ;//66 BRM报文接收超时
else if(fault_info == E_FAULT_15032)
ret = IESZT_BMS_BRM_ERR ;//67 BRM报文数据异常 - 报文数据长度错误,版本协议错误
else if(fault_info == E_FAULT_15003)
ret = IESZT_BMS_BCP_OT ;//68 BCP报文接收超时
else if(fault_info == E_FAULT_15033)
ret = IESZT_BMS_BCP_ERR ;//69 BCP报文数据异常 - 报文数据长度错误,电池当前电压越限
else if(fault_info == E_FAULT_15009)
ret = IESZT_BMS_BRO_00_OT ;//70 BRO报文(0x00)接收超时
else if(fault_info == E_FAULT_15004 ||fault_info == E_FAULT_15010 ||fault_info == E_FAULT_15020)
ret = IESZT_BMS_BRO_AA_OT ;//71 BRO报文(0xAA)接收超时
else if(fault_info == E_FAULT_15005)
ret = IESZT_BMS_BCS_OT ;//72 BCS报文接收超时
else if(fault_info == E_FAULT_14038 ||fault_info == E_FAULT_15036)
ret = IESZT_BMS_VOLTPARA_MISMTCH ;//73 电池最高允许充电电压小于充电机最小输出电压
else if(fault_info == E_FAULT_15034)
ret = IESZT_BATV_OVER10 ;//74 绝缘检测前直流输出接触器外侧电压>=10V
else if(fault_info == E_FAULT_15035)
ret = IESZT_BATV_BMSV_OVER5 ;//75 启动充电前直流输出接触器外侧电压与通信报文电池电压相差》=-5%
else if(fault_info == E_FAULT_13053)
ret = IESZT_OUTV_BATV_1TO10 ;//76 预充电时输出电压不在电池电压-(1V~10V)范围内
else if(fault_info == E_FAULT_13067)
ret = IESZT_VIN_ERR ;//77 vin清单使能,当前车vin不在清单内
else if(fault_info == E_FAULT_13022 || fault_info == E_FAULT_13096 || fault_info == E_FAULT_17005)
ret = IESZT_CHGCABINET_COMM_DOWN ;//78 充电柜通信中断
else if(fault_info == E_FAULT_15006)
ret = IESZT_BMS_BCL_OT ;//79 电池充电需求报文BCL接收超时
else if(fault_info == E_FAULT_15005)
ret = IESZT_BMS_BAT_BCS_OT ;//80 电池充电总状态报文BCS接收超时
else if(fault_info == E_FAULT_15008)
ret = IESZT_BMS_BSM_OT ;//81 动力蓄电池状态信息BSM接收超时
else if(fault_info == E_FAULT_15012)
ret = IESZT_BMS_BSM_OVERU ;//82 BSM - 单体动力蓄电池电压过高
else if(fault_info == E_FAULT_15013)
ret = IESZT_BMS_BSM_BELOWU ;//83 BSM - 单体动力蓄电池电压过低
else if(fault_info == E_FAULT_15014)
ret = IESZT_BMS_BSM_OVERSOC ;//84 BSM - 整车动力蓄电池荷电状态SOC过高
else if(fault_info == E_FAULT_15015)
ret = IESZT_BMS_BSM_BELOWSOC ;//85 BSM - 整车动力蓄电池荷电状态SOC过低
else if(fault_info == E_FAULT_15016)
ret = IESZT_BMS_BSM_OVERI ;//86 BSM - 动力蓄电池充电过电流
else if(fault_info == E_FAULT_15017)
ret = IESZT_BMS_BSM_OVERT ;//87 BSM - 动力蓄电池温度过高
else if(fault_info == E_FAULT_15018)
ret = IESZT_BMS_BSM_INSUERR ;//88 BSM - 动力蓄电池绝缘状态异常
else if(fault_info == E_FAULT_15019)
ret = IESZT_BMS_BSM_CONNERR ;//89 BSM - 动力蓄电池组输出连接器连接状态异常
else if(fault_info == E_FAULT_15007)
ret = IESZT_BMS_BST_OT ;//91 BST报文接收超时
else if(fault_info == E_FAULT_15021 )
ret = IESZT_BMS_BST_U_OK ;//92 BST - 达到总电压设定值
else if(fault_info == E_FAULT_15045)
ret = IESZT_BMS_BST_SNGUOK ;//93 BST - 达到单体电压设定值
else if(fault_info == E_FAULT_15022)
ret = IESZT_BMS_BST_INSUERR ;//94 BST - 绝缘故障
else if(fault_info == E_FAULT_15023)
ret = IESZT_BMS_BST_CONN_OVERT ;//95 BST - 输出连接器过温
else if(fault_info == E_FAULT_15024)
ret = IESZT_BMS_BST_CELL_OVERT ;//96 BST - BMS元件过温/输出连接器过温
else if(fault_info == E_FAULT_15025)
ret = IESZT_BMS_BST_CONN_ERR ;//97 BST - 充电连接器故障
else if(fault_info == E_FAULT_15026)
ret = IESZT_BMS_BST_BAT_OVERT ;//98 BST - 电池组温度过高
else if(fault_info == E_FAULT_15029)
ret = IESZT_BMS_BST_HVRELAY_ERR ;//99 BST - 高压继电器故障
else if(fault_info == E_FAULT_15028)
ret = IESZT_BMS_BST_2U_ERR ;//100 BST - 检测点2电压检测故障
else if(fault_info == E_FAULT_15027 || fault_info == E_FAULT_13055)
ret = IESZT_BMS_BST_ELSE ;//101 BST - 其他故障
else if(fault_info == E_FAULT_15030)
ret = IESZT_BMS_BST_OVERI ;//102 BST - 电流超过需求值
else if(fault_info == E_FAULT_15031)
ret = IESZT_BMS_BST_U_ABNORML ;//103 BST - 电压异常
else if(fault_info == E_FAULT_15002)
ret = IESZT_BMS_BEM ;//104 BEM - 错误报文
else if(fault_info == E_FAULT_15037 ||fault_info == E_FAULT_15039 || fault_info == E_FAULT_13048)
ret = IESZT_OUTPUT_VOLT_OVER ;//105 直流输出过压
else if(fault_info == E_FAULT_13011)
ret = IESZT_GUNLOCK_ERR ;//107 枪锁状态错误
else if(fault_info == E_FAULT_13032 ||fault_info == E_FAULT_17004 || fault_info == E_FAULT_17006)
ret = IESZT_SMOKE_ERR ;//108 烟感告警
else if(fault_info >= E_FAULT_14000 && fault_info <= E_FAULT_14006)
ret = IESZT_STARTING_UNDERPOWER ;//17启动中,辅助桩功率不足(用于开关模块异常)
else if(fault_info >=E_FAULT_14007 && fault_info <= E_FAULT_14036)
ret = IESZT_OUT_VOLT_LOW ;//33 启机时,输出电压不达标
else if(fault_info >= E_NORMAL_1000 && fault_info <= E_NORMAL_1016)
ret = IESZT_NORMAL ;//0正常
else
ret = IESZT_CHGING_FAULT ;//9充电中有报警
return ret;
}
/**
* ************************************************************************
* @brief - 积成平台发送 组帧头
*
* @param[in] u8_frm_type - 帧类型
* @param[in] u8_data_obj - 数据对象低6位 低6位枪号:0表示充电机本体
* @param[in] s16_serialNum - 序列号-1使用自增序号否则为应答帧使用询问帧序号
* @param[in] u8_pack_buf - 发送数据数组
*
* @return U8_T - 帧头长度
*
* @author jiankalka
* @date 2025-09-02
* ************************************************************************
*/
static U8_T u8_ies_pack_frm_head(U8_T u8_frm_type, U8_T u8_data_obj, S16_T s16_serialNum, U8_T *u8_pack_buf) //组帧头
{
U8_T u8_cnt = 0;
U8_T u8_str_data[BS_BUF_SIZE_32] = {0};
u8_pack_buf[u8_cnt++] = NT_HEADER; //帧起始域,固定0x68
u8_pack_buf[u8_cnt++] = 0; //帧长度域,暂时填0,后边填充
u8_pack_buf[u8_cnt++] = 0; //帧长度域
if(s16_serialNum > 0) //序列号域
u8_pack_buf[u8_cnt++] = (U8_T)s16_serialNum;
else
{
u8_pack_buf[u8_cnt++] = private_ies_data1->u16_msgSerialNumber;
private_ies_data1->u16_msgSerialNumber = (private_ies_data1->u16_msgSerialNumber+1)%255;
}
u8_get_str_data(GUN_NULL,E_STR_PILE_NO,0,u8_str_data,BS_BUF_SIZE_32); //获取桩编号
memcpy(&u8_pack_buf[u8_cnt], u8_str_data, 16); //设备地址
u8_cnt += 16;
u8_pack_buf[u8_cnt++] = 0; //加密方式,0不加密
u8_pack_buf[u8_cnt++] = ((NT_DC_PILE<<6) | u8_data_obj); //数据对象:高2位:0直流1交流2交直流;低6位枪号:0表示充电机本体
u8_pack_buf[u8_cnt++] = u8_frm_type; //帧类型码
return u8_cnt;
}
/****************************************************
*函数名称: v_set_fee_model()
*功能说明: 设置费率信息
*参数说明:
* 输入参数:
* 输出参数: u8 模式参数
****************************************************/
static void v_set_fee_model(U8_T *u8_recvBuf)
{
U8_T u8_rate_type; //费率类型
U8_T u8_feeCnt; //费率类型
U16_T u16_time_start; //起始时间,单位min
U16_T u16_time_end; //结束时间,单位min
U16_T u16_time_cnt; //判断当前有多少时段
U16_T u16_time_startNo; //判断当前从48时段的几号开始
U32_T u32_base_sevice,u32_base_rate;
F32_T K = 100000.0; //小数点后5位
U8_T u8_flag = 0;
S_FEE_MODEL s_fee_model; //费率存储结构体
memset(&s_fee_model , 0 ,sizeof(S_FEE_MODEL));
{
if((u8_recvBuf[31]<=30) && (u8_recvBuf[31]>=1)) //获取时段个数,最多30段,最小1段
{
U8_T i = 0 ,j = 0;
U32_T u32_data = 0;
U32_T u32_fee = 0 ,u32_service = 0;
//标志位置1
private_ies_data1->txFlag_askFeeMode= 1;
//时段个数
u8_feeCnt = u8_recvBuf[31];
//基本服务费
u32_data = ((u8_recvBuf[23]<<24) + (u8_recvBuf[24]<<16) + (u8_recvBuf[25]<<8) + u8_recvBuf[26]);
u32_base_sevice = u32_data;
//基本电费
u32_data = ((u8_recvBuf[27]<<24) + (u8_recvBuf[28]<<16) + (u8_recvBuf[29]<<8) + u8_recvBuf[30]);
u32_base_rate = u32_data;
u32_data = 32+u8_feeCnt*13;
s_fee_model.u8_model_no[0] = (u8_recvBuf[u32_data]) ;
s_fee_model.u8_model_no[1] = (u8_recvBuf[u32_data + 1]) ;
s_fee_model.u8_model_no[2] = (u8_recvBuf[u32_data + 2]) ;
s_fee_model.u8_model_no[3] = u8_recvBuf[u32_data + 3];
//各时段详细信息
if(u8_feeCnt == 0)
{
s_fee_model.s_fee_data[0].u32_rate = u32_base_rate;
s_fee_model.s_fee_data[0].u32_sevice = u32_base_sevice;
for(i=0; i<FEE_MODEL_CNT; i++)
{
s_fee_model.u8_fee_type[i] = 1;
}
}
else
{
for(i=0; i<u8_feeCnt; i++)
{
u16_time_start = (U16_T)((u8_recvBuf[32+i*13]<<8) + u8_recvBuf[33+i*13]);
u16_time_end = (U16_T)((u8_recvBuf[34+i*13]<<8) + u8_recvBuf[35+i*13]);
u16_time_cnt = (u16_time_end - u16_time_start) / 15 ; //新设计计费模型为半小时一段
u16_time_startNo = u16_time_start / 15; //当前循环设置的时段对应的48段的存储序号
if((u16_time_end - u16_time_start)%15 != 0)
u16_time_cnt += 1;
u8_rate_type = u8_recvBuf[36+i*13];
for(j=0 ; j<u16_time_cnt ; j++)
{
s_fee_model.u8_fee_type[u16_time_startNo + j] = u8_rate_type; //尖峰平谷 1234
}
u32_fee = ((u8_recvBuf[37+i*13]<<24) + (u8_recvBuf[38+i*13]<<16) + (u8_recvBuf[39+i*13]<<8) + u8_recvBuf[40+i*13]);
u32_service = ((u8_recvBuf[41+i*13]<<24) + (u8_recvBuf[42+i*13]<<16) + (u8_recvBuf[43+i*13]<<8) + u8_recvBuf[44+i*13]);
s_fee_model.s_fee_data[u8_rate_type-1].u32_rate = u32_fee;
s_fee_model.s_fee_data[u8_rate_type-1].u32_sevice = u32_service;
Plat_Comm_LOG("%d %d -- %d : electricity fee= %f , service fee= %f\n",i,u16_time_start,u16_time_end,u32_fee/K,u32_service/K);
}
}
u8_flag = 1;
}
}
s_fee_model.u8_feeCnt = u8_feeCnt; //费率条数
if(u8_flag == 1)
{
v_bs_save_fee_data(u8_flag,&s_fee_model);
}
}
static void v_genrt_chgSerialNum_ieszt(U8_T *u8_serianNum, U8_T gunNo) //ASCII,生成充电流水号:桩编号8位+枪号2位+开始时间
{
U8_T i;
U8_T u8_time_buf[6] = {0};
Comm_Time t_time;
U8_T u8_str_data[8];
u8_get_str_data(GUN_NULL,E_STR_PILE_NO,0,u8_str_data,BS_BUF_SIZE_16); //获取桩编号
// for(i=0;i<8;i++)
// {
// printf("%2x",u8_str_data[i]);
// }
// printf("\n");
memcpy(u8_serianNum, &u8_str_data[0],8);
sprintf((char *)(&u8_serianNum[8]), "%02d", gunNo+1);
GetCurrentTime(&t_time);
u8_time_buf[0] = t_time.iYear-2000;
u8_time_buf[1] = t_time.ucMonth;
u8_time_buf[2] = t_time.ucDay;
u8_time_buf[3] = t_time.ucHour;
u8_time_buf[4] = t_time.ucMin;
u8_time_buf[5] = t_time.ucSec;
for(i=0; i<6; i++)
sprintf((char *)(&u8_serianNum[10+2*i]), "%02d", u8_time_buf[i]);
}
#endif
#if 1 //外部数据获取
U8_T u8_ies_get_gunLink_state(U8_T u8_gunNo)
{
return u32_bs_get_sys_data(u8_gunNo,E_BS_GET_SYS_DATA_GUN_STATE,0); //枪连接状态
}
/**
* ************************************************************************
* @brief - 获取该枪故障数量
*
* @param[in] u8_gunNo - 枪号
*
* @return int - 故障数量
*
* @author YZG
* @date 2026-06-22
* ************************************************************************
*/
int bs_gun_fault_num(U8_T u8_gunNo) //获取该枪故障数量
{
REAL_FAULT_DATA_T rl_data;
U8_T j,u8_ret=0;
v_get_fault_data(&rl_data);
for(j=0;j<CURR_FAULT_MAX_CNT;j++)
{
if((rl_data.fault_data[j].e_mag != 0 &&
(rl_data.fault_data[j].e_ingun == E_GUN + u8_gunNo ||rl_data.fault_data[j].e_ingun == E_WHOLE_PILE)))
{
u8_ret ++;
}
}
return u8_ret;
}
/**
* ************************************************************************
* @brief - 获取枪状态
*
*
* @return U8_T -
* 0x00 表示空闲;
* 0x01 表示占用未充电, 已插抢;
* 0x02 表示启动中
* 0x03 表示充电中;
* 0x04 表示充电完成
* 0x05 表示预约锁定;
* 0x06 表示禁止充电
*
* @author YZG
* @date 2026-06-22
* ************************************************************************
*/
U8_T u8_ies_get_gun_state(U8_T u8_gunNo)
{
U8_T u8_gun_state;
//终端充电状态 0空闲 1充电启动 2绝缘启动 3绝缘计算完成 4绝缘检测模块停止 5开始预充 6预充完成 7充电中 8BMS通讯超时 9充电停止 10充电停止完成
U8_T u8_flow_state = u32_bs_get_sys_data(u8_gunNo,E_BS_GET_SYS_DATA_GUN_FLOW_STATE,0);
U8_T u8_fualt_num = bs_gun_fault_num(u8_gunNo);
U8_T u8_gunLink = u8_ies_get_gunLink_state(u8_gunNo); //枪连接状态
if(u8_fualt_num != 0)
{
u8_gun_state = 6;//故障
}
else if(u8_flow_state == E_FLOW_REAL_FREE && u8_gunLink == 0) //空闲中
{
u8_gun_state = 0;
}
else if(u8_flow_state == E_FLOW_REAL_FREE && u8_gunLink == 1) //空闲中,插枪
{
u8_gun_state = 1;
}
else if(u8_flow_state >= E_FLOW_REAL_CHARGE_START && u8_flow_state < E_FLOW_REAL_CHARGEING)
{
u8_gun_state = 2;
}
else if(u8_flow_state >= E_FLOW_REAL_CHARGEING && u8_flow_state <= E_FLOW_REAL_STOP)
{
u8_gun_state = 3;
}
else
{
u8_gun_state = 4;
}
return u8_gun_state;
}
#endif
#if 1 //发送
void v_ies_register_req(void) //请求登录帧 0x01
{
U8_T u8_cnt = 0, i; //cnt总发送长度
U8_T u8_str_data[BS_BUF_SIZE_32];
U8_T u8_sendBuf[BS_BUF_SIZE_128];
TYPE_DATA type_data;
memset(u8_sendBuf, 0, BS_BUF_SIZE_128);
//组帧头
u8_cnt = u8_ies_pack_frm_head(NT_LOGIN_REQ, NT_ID_PILE, -1, u8_sendBuf);
//组帧体
memset(u8_str_data,0,BS_BUF_SIZE_32);
u8_get_str_data(GUN_NULL,E_STR_PILE_NO,0,u8_str_data,BS_BUF_SIZE_32); //获取桩编号
memcpy(&u8_sendBuf[u8_cnt], u8_str_data, 16);
u8_cnt += 16;
u8_sendBuf[u8_cnt++] = NT_DC_PILE; //桩类型
type_data.u8_data = u32_bs_get_sys_data(GUN_NULL,E_BS_GET_SYS_DATA_GUN_NUM,0); //充电枪数量
u8_sendBuf[u8_cnt++] = type_data.u8_data;
u8_sendBuf[u8_cnt++] = NT_PTL_VERSION; //通信协议版本
memset(u8_str_data,0,BS_BUF_SIZE_32);
u8_get_str_data(GUN_NULL,E_STR_SOFTWARE_VERSION,0,u8_str_data,BS_BUF_SIZE_32);
memcpy(&u8_sendBuf[u8_cnt], u8_str_data, strlen((char *)u8_str_data)); //程序版本
u8_cnt += 16;
type_data.u32_data = (U32_T)(0 * 1000000); //充电桩位置经度,精确到小数点后6位
u8_sendBuf[u8_cnt++] = (U8_T)(type_data.u32_data>>24);
u8_sendBuf[u8_cnt++] = (U8_T)(type_data.u32_data>>16);
u8_sendBuf[u8_cnt++] = (U8_T)(type_data.u32_data>>8);
u8_sendBuf[u8_cnt++] = (U8_T)(type_data.u32_data);
type_data.u32_data = (U32_T)(0 * 1000000); //充电桩位置纬度,精确到小数点后6位
u8_sendBuf[u8_cnt++] = (U8_T)(type_data.u32_data>>24);
u8_sendBuf[u8_cnt++] = (U8_T)(type_data.u32_data>>16);
u8_sendBuf[u8_cnt++] = (U8_T)(type_data.u32_data>>8);
u8_sendBuf[u8_cnt++] = (U8_T)(type_data.u32_data);
for(i=0; i<32; i++) //设备指纹32位,ascii
u8_sendBuf[u8_cnt++] = 0;
v_ies_send(u8_sendBuf, u8_cnt);
Plat_Comm_LOG("Login send= %s\n",u8_str_data);
}
void v_ies_heart(void) //心跳帧 0x03
{
U8_T u8_cnt = 0; //cnt总发送长度
TYPE_DATA type_data;
U8_T u8_sendBuf[BS_BUF_SIZE_128];
memset(u8_sendBuf, 0, BS_BUF_SIZE_128);
//组帧头
u8_cnt = u8_ies_pack_frm_head(NT_TICK_REQ, NT_ID_PILE, -1, u8_sendBuf);
//组帧体
type_data.u8_data = u32_bs_get_sys_data(GUN_NULL,E_BS_GET_SYS_DATA_NOW_FAULT_ALARM_NUM,0);
if(type_data.u8_data == 0) //充电桩状态,0正常,1故障
u8_sendBuf[u8_cnt++] = 0;
else
u8_sendBuf[u8_cnt++] = 1;
type_data.u32_data = u32_bs_get_sys_data(GUN_NULL,E_BS_GET_SYS_DATA_PILE_TEMP,0); //环境温度
u8_sendBuf[u8_cnt++] = (U8_T)(type_data.f32_data+50); //充电桩环境温度,-50度偏移
v_ies_send(u8_sendBuf, u8_cnt);
private_ies_data1->u8_heart_outTime_cnt += 1; //心跳发送计数
Plat_Comm_LOG("Heartbeat send= %d\n",private_ies_data1->u8_heart_outTime_cnt);
}
void v_ies_fee_req(void) //请求计费模型帧 0x05
{
U8_T u8_cnt = 0; //cnt总发送长度
U8_T u8_sendBuf[BS_BUF_SIZE_128];
memset(u8_sendBuf, 0, BS_BUF_SIZE_128);
//组帧头
u8_cnt = u8_ies_pack_frm_head(NT_FEE_MODULE_REQ, NT_ID_PILE, -1, u8_sendBuf);
//组帧体
u8_sendBuf[u8_cnt++] = 1; //请求
u8_sendBuf[u8_cnt] = u16_crc_checksum(&u8_sendBuf[3], u8_cnt-3); //和校验
u8_cnt++;
//更新帧长度域
u8_sendBuf[1] = (u8_cnt-4)>>8;
u8_sendBuf[2] = u8_cnt-4;
v_ies_send(u8_sendBuf, u8_cnt);
}
void v_ies_rtd_free(U8_T u8_gunNo) //空闲实时数据 0x13, 变位上送,120s
{
U8_T u8_cnt = 0; //cnt总发送长度
U8_T u8_sendBuf[BS_BUF_SIZE_128];
Comm_Time ctTime;
memset(&ctTime,0,sizeof(Comm_Time));
GetCurrentTime(&ctTime);
memset(u8_sendBuf, 0, BS_BUF_SIZE_128);
//组帧头
u8_cnt = u8_ies_pack_frm_head(NT_GUN_DATA_FREE, u8_gunNo+1, -1, u8_sendBuf);
//组帧体
//终端状态
//printf("%d枪状态变位组帧上送,状态:%d\n",u8_gunNo,u8_bs_get_flow_state(u8_gunNo));
//u8_sendBuf[u8_cnt++] = u8_bs_get_flow_state(u8_gunNo);
U8_T u8_data = u8_ies_get_gun_state(u8_gunNo);
u8_sendBuf[u8_cnt++] = u8_data;
// printf("[%d-%d-%d %d:%d:%d]%d枪,枪状态为%d(0:空闲,1:插枪,2:启动中,3:充电中,4:充电完成,5:预约充电,6:禁止充电)\r\n",
// ctTime.iYear, ctTime.ucMonth, ctTime.ucDay, ctTime.ucHour, ctTime.ucMin, ctTime.ucSec,u8_gunNo,u8_data);
//车位占用
u8_sendBuf[u8_cnt++] = u32_bs_get_sys_data(u8_gunNo,E_BS_GET_SYS_DATA_GUN_STATE,2); //改为枪归位
//地锁状态
u8_sendBuf[u8_cnt++] = 0;
//充电接口电子锁状态
u8_sendBuf[u8_cnt++] = u32_bs_get_sys_data(u8_gunNo,E_BS_GET_SYS_DATA_GUN_STATE,1);
//直流输出接触器状态
u8_sendBuf[u8_cnt++] = u32_bs_get_sys_data(u8_gunNo,E_BS_GET_SYS_DATA_GUN_STATE,3);
//和校验
u8_sendBuf[u8_cnt] = u16_crc_checksum(&u8_sendBuf[3], u8_cnt-3);
u8_cnt++;
//更新帧长度域
u8_sendBuf[1] = (u8_cnt-4)>>8;
u8_sendBuf[2] = u8_cnt-4;
// if(u8_gunNo==0)
// {
// printf("%d枪 空闲状态上送\n",u8_gunNo);
// for(i=0;i<u8_cnt;i++)
// {
// printf("%02x ",u8_sendBuf[i]);
// }
// printf("\n");
// }
v_ies_send(u8_sendBuf, u8_cnt);
//Plat_Comm_LOG("%d枪 空闲状态上送\n",u8_gunNo);
}
void v_ies_rtd_chging(U8_T u8_gunNo) //充电中实时数据 0x11 变化加间隔上送,30s
{
U8_T u8_cnt = 0; //cnt总发送长度
U16_T u16_data;
U32_T u32_data;
U8_T u8_sendBuf[BS_BUF_SIZE_256];
S_LOG_DATA t_log ; //获取充电日志数据
v_bs_get_gun_log_data(u8_gunNo , &t_log);
memset(u8_sendBuf, 0, BS_BUF_SIZE_256);
//组帧头
u8_cnt = u8_ies_pack_frm_head(NT_GUN_DATA_CHGING, u8_gunNo+1, -1, u8_sendBuf);
//组帧体
//终端状态
u8_sendBuf[u8_cnt++] = u8_ies_get_gun_state(u8_gunNo);
//车位占用
u8_sendBuf[u8_cnt++] = u32_bs_get_sys_data(u8_gunNo,E_BS_GET_SYS_DATA_GUN_STATE,2); //改为枪归位
//地锁状态
u8_sendBuf[u8_cnt++] = 0;
//充电接口电子锁状态
u8_sendBuf[u8_cnt++] = u32_bs_get_sys_data(u8_gunNo,E_BS_GET_SYS_DATA_GUN_STATE,1);
//直流输出接触器状态
u8_sendBuf[u8_cnt++] = u32_bs_get_sys_data(u8_gunNo,E_BS_GET_SYS_DATA_GUN_STATE,3);
//充电机输出电压
u16_data = (U16_T)(u32_bs_get_sys_data(u8_gunNo,E_BS_GET_SYS_DATA_METER_VOL,0));
u8_sendBuf[u8_cnt++] = (U8_T)(u16_data>>8);
u8_sendBuf[u8_cnt++] = (U8_T)(u16_data);
//充电机输出电流
u32_data = (U32_T)(u32_bs_get_sys_data(u8_gunNo,E_BS_GET_SYS_DATA_METER_CUR,0) *10);
u8_sendBuf[u8_cnt++] = (U8_T)(u32_data>>24);
u8_sendBuf[u8_cnt++] = (U8_T)(u32_data>>16);
u8_sendBuf[u8_cnt++] = (U8_T)(u32_data>>8);
u8_sendBuf[u8_cnt++] = (U8_T)(u32_data);
//车辆充电需求电压
u16_data = (U16_T)(u32_bs_get_sys_data(u8_gunNo,E_BS_GET_SYS_DATA_BMS_NEED_VOL,0));
u8_sendBuf[u8_cnt++] = (U8_T)(u16_data>>8);
u8_sendBuf[u8_cnt++] = (U8_T)(u16_data);
//车辆充电需求电流
u32_data = (U32_T)(u32_bs_get_sys_data(u8_gunNo,E_BS_GET_SYS_DATA_BMS_NEED_CUR,0) *10);
u8_sendBuf[u8_cnt++] = (U8_T)(u32_data>>24);
u8_sendBuf[u8_cnt++] = (U8_T)(u32_data>>16);
u8_sendBuf[u8_cnt++] = (U8_T)(u32_data>>8);
u8_sendBuf[u8_cnt++] = (U8_T)(u32_data);
//充电模式
u8_sendBuf[u8_cnt++] = 1;//t_bcl_data.u8_charge_mode; 充电模式,0x01:恒压充电;0x02:恒流充电
//SOC
u8_sendBuf[u8_cnt++] = t_log.u8_endSoc;//(U8_T)(u32_bs_get_sys_data(u8_gunNo,E_BS_GET_SYS_DATA_SOC_DATA,0));
//电池组最低温度
u16_data = (U16_T)(u32_bs_get_sys_data(u8_gunNo,E_BS_GET_SYS_DATA_BMS_BATT_MIN_TEMP,0)+50);
u8_sendBuf[u8_cnt++] = (U8_T)(u16_data>>8);
u8_sendBuf[u8_cnt++] = (U8_T)(u16_data);
//电池组最高温度
u16_data = (U16_T)(u32_bs_get_sys_data(u8_gunNo,E_BS_GET_SYS_DATA_BMS_BATT_MAX_TEMP,0) +50);
u8_sendBuf[u8_cnt++] = (U8_T)(u16_data>>8);
u8_sendBuf[u8_cnt++] = (U8_T)(u16_data);
//累计充电时间
u16_data = (U16_T)(t_log.u16_ChargedTime);
u8_sendBuf[u8_cnt++] = (U8_T)(u16_data>>8);
u8_sendBuf[u8_cnt++] = (U8_T)(u16_data);
//估算充满剩余时间
u16_data = (U16_T)(u32_bs_get_sys_data(u8_gunNo,E_BS_GET_SYS_DATA_BMS_REMAIN_TIME,0));
u8_sendBuf[u8_cnt++] = (U8_T)(u16_data>>8);
u8_sendBuf[u8_cnt++] = (U8_T)(u16_data);
//BMS单体电池最高电压
u16_data = (U16_T)(u32_bs_get_sys_data(u8_gunNo,E_BS_GET_SYS_DATA_BMS_CELL_CHARGE_MAX_VOL,0) *10);
u8_sendBuf[u8_cnt++] = (U8_T)(u16_data>>8);
u8_sendBuf[u8_cnt++] = (U8_T)(u16_data);
//BMS单体电池最低电压
u16_data = 0;
u8_sendBuf[u8_cnt++] = (U8_T)(u16_data>>8);
u8_sendBuf[u8_cnt++] = (U8_T)(u16_data);
//BMS充电电压测量值
u16_data = (U16_T)(u32_bs_get_sys_data(u8_gunNo,E_BS_GET_SYS_DATA_BMS_CHARGE_VOL,0) *10);
u8_sendBuf[u8_cnt++] = (U8_T)(u16_data>>8);
u8_sendBuf[u8_cnt++] = (U8_T)(u16_data);
//BMS充电电流测量值
u16_data = (U16_T)((u32_bs_get_sys_data(u8_gunNo,E_BS_GET_SYS_DATA_BMS_CHARGE_CUR,0)+400) *10);
u8_sendBuf[u8_cnt++] = (U8_T)(u16_data>>8);
u8_sendBuf[u8_cnt++] = (U8_T)(u16_data);
//充电接口温度1
u16_data = (U16_T)(u32_bs_get_sys_data(u8_gunNo,E_BS_GET_SYS_DATA_GUN_TEMP_NEG,0) *10+500);
u8_sendBuf[u8_cnt++] = (U8_T)(u16_data>>8);
u8_sendBuf[u8_cnt++] = (U8_T)(u16_data);
//充电接口温度2
u16_data = (U16_T)(u32_bs_get_sys_data(u8_gunNo,E_BS_GET_SYS_DATA_GUN_TEMP_POS,0) *10+500);
u8_sendBuf[u8_cnt++] = (U8_T)(u16_data>>8);
u8_sendBuf[u8_cnt++] = (U8_T)(u16_data);
//充电接口温度3
u16_data = (U16_T)(0*10+500);//不传
u8_sendBuf[u8_cnt++] = (U8_T)(u16_data>>8);
u8_sendBuf[u8_cnt++] = (U8_T)(u16_data);
//充电接口温度4
u16_data = (U16_T)(0*10+500);//不传
u8_sendBuf[u8_cnt++] = (U8_T)(u16_data>>8);
u8_sendBuf[u8_cnt++] = (U8_T)(u16_data);
//BMS最高允许温度
u16_data = (U16_T)(u32_bs_get_sys_data(u8_gunNo,E_BS_GET_SYS_DATA_BMS_BATT_ALLOW_MAX_TEMP,0)*10+500);
u8_sendBuf[u8_cnt++] = (U8_T)(u16_data>>8);
u8_sendBuf[u8_cnt++] = (U8_T)(u16_data);
//BMS最高允许充电电压
u16_data = (U16_T)(u32_bs_get_sys_data(u8_gunNo,E_BS_GET_SYS_DATA_BMS_BATT_CHARGE_MAX_VOL,0) *10);
u8_sendBuf[u8_cnt++] = (U8_T)(u16_data>>8);
u8_sendBuf[u8_cnt++] = (U8_T)(u16_data);
//单体最高允许充电电压
u16_data = (U16_T)(u32_bs_get_sys_data(u8_gunNo,E_BS_GET_SYS_DATA_BMS_CELL_CHARGE_MAX_VOL,0) *10);
u8_sendBuf[u8_cnt++] = (U8_T)(u16_data>>8);
u8_sendBuf[u8_cnt++] = (U8_T)(u16_data);
//BMS最高允许充电电流
u32_data = (U32_T)(u32_bs_get_sys_data(u8_gunNo,E_BS_GET_SYS_DATA_BMS_BATT_CHARGE_MAX_CUR,0) *10+400);
u8_sendBuf[u8_cnt++] = (U8_T)(u32_data>>24);
u8_sendBuf[u8_cnt++] = (U8_T)(u32_data>>16);
u8_sendBuf[u8_cnt++] = (U8_T)(u32_data>>8);
u8_sendBuf[u8_cnt++] = (U8_T)(u32_data);
//整车动力蓄电池额定总电压
u16_data = (U16_T)(u32_bs_get_sys_data(u8_gunNo,E_BS_GET_SYS_DATA_BMS_BATT_RATED_VOL,0) *10);
u8_sendBuf[u8_cnt++] = (U8_T)(u16_data>>8);
u8_sendBuf[u8_cnt++] = (U8_T)(u16_data);
//整车动力蓄电池当前电压
u16_data = (U16_T)(u32_bs_get_sys_data(u8_gunNo,E_BS_GET_SYS_DATA_BMS_BATT_VOL,0) *10);
u8_sendBuf[u8_cnt++] = (U8_T)(u16_data>>8);
u8_sendBuf[u8_cnt++] = (U8_T)(u16_data);
//整车动力蓄电池额定容量
u16_data = (U16_T)(u32_bs_get_sys_data(u8_gunNo,E_BS_GET_SYS_DATA_BMS_BATT_RATED_C10,0) *10);
u8_sendBuf[u8_cnt++] = (U8_T)(u16_data>>8);
u8_sendBuf[u8_cnt++] = (U8_T)(u16_data);
//整车动力蓄电池标称能量
u16_data = (U16_T)(u32_bs_get_sys_data(u8_gunNo,E_BS_GET_SYS_DATA_BMS_BATT_RATED_ENERY,0) *10);
u8_sendBuf[u8_cnt++] = (U8_T)(u16_data>>8);
u8_sendBuf[u8_cnt++] = (U8_T)(u16_data);
#if BS_IES_TYPE == 1
//充电总电度
u32_data = (U32_T)(t_log.u32_used_energy);
u8_sendBuf[u8_cnt++] = (U8_T)(u32_data>>24);
u8_sendBuf[u8_cnt++] = (U8_T)(u32_data>>16);
u8_sendBuf[u8_cnt++] = (U8_T)(u32_data>>8);
u8_sendBuf[u8_cnt++] = (U8_T)(u32_data);
#else
//充电总电度
u32_data = (U32_T)(t_log.u32_used_energy/100);
u8_sendBuf[u8_cnt++] = (U8_T)(u32_data>>24);
u8_sendBuf[u8_cnt++] = (U8_T)(u32_data>>16);
u8_sendBuf[u8_cnt++] = (U8_T)(u32_data>>8);
u8_sendBuf[u8_cnt++] = (U8_T)(u32_data);
#endif
//充电功率
u32_data = (U32_T)(((u32_bs_get_sys_data(u8_gunNo,E_BS_GET_SYS_DATA_METER_VOL,0)*u32_bs_get_sys_data(u8_gunNo,E_BS_GET_SYS_DATA_METER_CUR,0))/1000.0));
u8_sendBuf[u8_cnt++] = (U8_T)(u32_data>>24);
u8_sendBuf[u8_cnt++] = (U8_T)(u32_data>>16);
u8_sendBuf[u8_cnt++] = (U8_T)(u32_data>>8);
u8_sendBuf[u8_cnt++] = (U8_T)(u32_data);
//直流表计有功总电度
u8_sendBuf[u8_cnt++] = 0;
u8_sendBuf[u8_cnt++] = 0;
u8_sendBuf[u8_cnt++] = 0;
u8_sendBuf[u8_cnt++] = 0;
//充电流水号
memcpy(&u8_sendBuf[u8_cnt], &t_log.u8_tradeNo, 32);
u8_cnt += 32;
//充电用户类型
u8_sendBuf[u8_cnt++] = t_log.e_user_type;
//充电用户标识
memcpy(&u8_sendBuf[u8_cnt], &t_log.u8_user_id, 32);
u8_cnt += 32;
//已充电费金额
u32_data = (U32_T)(t_log.u32_used_money*10);
u8_sendBuf[u8_cnt++] = (U8_T)(u32_data>>24);
u8_sendBuf[u8_cnt++] = (U8_T)(u32_data>>16);
u8_sendBuf[u8_cnt++] = (U8_T)(u32_data>>8);
u8_sendBuf[u8_cnt++] = (U8_T)(u32_data);
//已充服务费金额
u32_data = (U32_T)(t_log.u32_used_service*10);
u8_sendBuf[u8_cnt++] = (U8_T)(u32_data>>24);
u8_sendBuf[u8_cnt++] = (U8_T)(u32_data>>16);
u8_sendBuf[u8_cnt++] = (U8_T)(u32_data>>8);
u8_sendBuf[u8_cnt++] = (U8_T)(u32_data);
//车辆VIN - 20字节
memcpy(&u8_sendBuf[u8_cnt], t_log.u8_vinCode, 17);
u8_cnt += 17;
u8_sendBuf[u8_cnt++] = 0;
u8_sendBuf[u8_cnt++] = 0;
u8_sendBuf[u8_cnt++] = 0;
//和校验
u8_sendBuf[u8_cnt] = u16_crc_checksum(&u8_sendBuf[3], u8_cnt-3);
u8_cnt++;
//更新帧长度域
u8_sendBuf[1] = (u8_cnt-4)>>8;
u8_sendBuf[2] = u8_cnt-4;
// if(u32_bs_get_sys_data(u8_gunNo,E_BS_GET_SYS_DATA_SOC_DATA,0) == 0)
// return;
// printf("%d枪充电中数据:",u8_gunNo);
// for(i=0;i<u8_cnt;i++)
// {
// printf("%02x ",u8_sendBuf[i]);
// }
// printf("\n");
v_ies_send(u8_sendBuf, u8_cnt);
Plat_Comm_LOG("Gun %d charging status upload\n",u8_gunNo);
}
void v_ies_meter_data(U8_T u8_gunNo) //表底值 0x31,30分钟上送一次
{
U8_T u8_cnt = 0; //cnt总发送长度
U32_T u32_data = 0;
Comm_Time ct_time;
U8_T u8_sendBuf[BS_BUF_SIZE_128];
memset(u8_sendBuf, 0, BS_BUF_SIZE_128);
//组帧头
u8_cnt = u8_ies_pack_frm_head(NET_METER_DATA, u8_gunNo+1, -1, u8_sendBuf);
//组帧体
//采集时间
GetCurrentTime(&ct_time);
u32_data = xDate2Seconds(&ct_time);
u8_sendBuf[u8_cnt++] = (U8_T)(u32_data>>24);
u8_sendBuf[u8_cnt++] = (U8_T)(u32_data>>16);
u8_sendBuf[u8_cnt++] = (U8_T)(u32_data>>8);
u8_sendBuf[u8_cnt++] = (U8_T)(u32_data);
//表底值总
u32_data = (U32_T)(u64_bs_get_sys_data(u8_gunNo,E_BS_GET_SYS_DATA_MEMTER_ELECT)/10);
u8_sendBuf[u8_cnt++] = (U8_T)(u32_data>>24);
u8_sendBuf[u8_cnt++] = (U8_T)(u32_data>>16);
u8_sendBuf[u8_cnt++] = (U8_T)(u32_data>>8);
u8_sendBuf[u8_cnt++] = (U8_T)(u32_data);
//表底值尖
u32_data = 0;
u8_sendBuf[u8_cnt++] = (U8_T)(u32_data>>24);
u8_sendBuf[u8_cnt++] = (U8_T)(u32_data>>16);
u8_sendBuf[u8_cnt++] = (U8_T)(u32_data>>8);
u8_sendBuf[u8_cnt++] = (U8_T)(u32_data);
//表底值峰
u32_data = 0;
u8_sendBuf[u8_cnt++] = (U8_T)(u32_data>>24);
u8_sendBuf[u8_cnt++] = (U8_T)(u32_data>>16);
u8_sendBuf[u8_cnt++] = (U8_T)(u32_data>>8);
u8_sendBuf[u8_cnt++] = (U8_T)(u32_data);
//表底值平
u32_data = 0;
u8_sendBuf[u8_cnt++] = (U8_T)(u32_data>>24);
u8_sendBuf[u8_cnt++] = (U8_T)(u32_data>>16);
u8_sendBuf[u8_cnt++] = (U8_T)(u32_data>>8);
u8_sendBuf[u8_cnt++] = (U8_T)(u32_data);
//表底值谷
u32_data = 0;
u8_sendBuf[u8_cnt++] = (U8_T)(u32_data>>24);
u8_sendBuf[u8_cnt++] = (U8_T)(u32_data>>16);
u8_sendBuf[u8_cnt++] = (U8_T)(u32_data>>8);
u8_sendBuf[u8_cnt++] = (U8_T)(u32_data);
//电流表变比
u8_sendBuf[u8_cnt++] = 0;
u8_sendBuf[u8_cnt++] = 0;
u8_sendBuf[u8_cnt] = u16_crc_checksum(&u8_sendBuf[3], u8_cnt-3); //和校验
u8_cnt++;
//更新帧长度域
u8_sendBuf[1] = (u8_cnt-4)>>8;
u8_sendBuf[2] = u8_cnt-4;
// printf("%d枪表底值上送\n",u8_gunNo);
// for(i=0;i<u8_cnt;i++)
// {
// printf("%02x ",u8_sendBuf[i]);
// }
// printf("\n");
v_ies_send(u8_sendBuf, u8_cnt);
Plat_Comm_LOG("Gun %d meter value upload\n",u8_gunNo);
}
void v_ies_fault_V35(U8_T u8_gunNo) //故障告警数据 0x15, V3.5协议故障不分枪
{
U8_T u8_cnt = 0; //cnt总发送长度
U8_T u8_sendBuf[BS_BUF_SIZE_128];
memset(u8_sendBuf, 0, BS_BUF_SIZE_128);
//组帧头
u8_cnt = u8_ies_pack_frm_head(NT_FAULT_DATA, NT_DC_PILE, -1, u8_sendBuf);
//组帧体
if(u8_get_fault_sum(0,0) == 0) //故障总
u8_sendBuf[u8_cnt++] = 0;
else
u8_sendBuf[u8_cnt++] = 1;
if(u8_get_fault_sum(0,1) == 0) //告警总
u8_sendBuf[u8_cnt++] = 0;
else
u8_sendBuf[u8_cnt++] = 1;
u8_sendBuf[u8_cnt++] = 0; //ESAM故障
u8_sendBuf[u8_cnt++] = u8_cheak_fault_flag(E_FAULT_17000,E_WHOLE_HOST);//急停
u8_sendBuf[u8_cnt++] = 0;//u8_cheak_fault_flag(E_FAULT_13070,E_WHOLE_PILE); //读卡器通信故障
u8_sendBuf[u8_cnt++] = 0;//u8_cheak_fault_flag(E_FAULT_13071,E_WHOLE_PILE); //电表通信故障
u8_sendBuf[u8_cnt++] = u8_cheak_fault_flag(E_FAULT_17003,E_WHOLE_HOST); //避雷器故障
u8_sendBuf[u8_cnt++] = 0;//u8_cheak_fault_flag(E_FAULT_13030,E_WHOLE_PILE); //环温过温
u8_sendBuf[u8_cnt++] = u8_cheak_fault_flag(E_FAULT_17004,E_WHOLE_HOST); //烟雾报警
// if(u8_cheak_fault_flag(E_FAULT_13005,E_GUN))
// u8_sendBuf[u8_cnt++] = 1; //直流母线输出接触器拒动/误动}
// else
u8_sendBuf[u8_cnt++] = 0;
u8_sendBuf[u8_cnt++] = 0; //充电模块告警
u8_sendBuf[u8_cnt++] = 0; //交流断路器故障
// if(u8_cheak_fault_flag(E_FAULT_13006,E_GUN))
// u8_sendBuf[u8_cnt++] = 1; //直流母线输出熔断器故障
// else
u8_sendBuf[u8_cnt++] = 0;
u8_sendBuf[u8_cnt++] = 0; //输入电压过压
u8_sendBuf[u8_cnt++] = 0; //输入电压欠压
u8_sendBuf[u8_cnt++] = 0; //电子锁故障
u8_sendBuf[u8_cnt++] = 0; //风扇告警
// if(u8_cheak_fault_flag(E_FAULT_13013,E_GUN))
// u8_sendBuf[u8_cnt++] = 1;//充电接口过温
// else
u8_sendBuf[u8_cnt++] = 0;
u8_sendBuf[u8_cnt++] = u8_cheak_fault_flag(E_FAULT_17001,E_WHOLE_HOST); //门禁
// if(u8_cheak_fault_flag(E_FAULT_13002,E_GUN))
// u8_sendBuf[u8_cnt++] = 1; //直流输出接触器粘连
// else
u8_sendBuf[u8_cnt++] = 0;
// if(u8_cheak_fault_flag(E_FAULT_13042,E_GUN))
// u8_sendBuf[u8_cnt++] = 1; //绝缘检测故障
// else
u8_sendBuf[u8_cnt++] = 0;
// if(u8_cheak_fault_flag(E_FAULT_13047,E_GUN))
// u8_sendBuf[u8_cnt++] = 1; //泄放回路故障
// else
u8_sendBuf[u8_cnt++] = 0;
u8_sendBuf[u8_cnt] = u16_crc_checksum(&u8_sendBuf[3], u8_cnt-3); //和校验
u8_cnt++;
//更新帧长度域
u8_sendBuf[1] = (u8_cnt-4)>>8;
u8_sendBuf[2] = u8_cnt-4;
// for(i=0;i<u8_cnt;i++)
// {
// printf("%02x",u8_sendBuf[i]);
// }
// printf("\n");
v_ies_send(u8_sendBuf, u8_cnt);
Plat_Comm_LOG("Fault send frame\n");
}
void v_ies_bill_pack(U8_T u8_gunNo) //组上送账单
{
U8_T u8_cnt = 0,i; //cnt总发送长度
U32_T u32_data;
U8_T u8_sendBuf[BS_BUF_SIZE_256];
S_LOG_DATA t_log ; //获取充电日志数据
v_bs_get_gun_log_data(u8_gunNo , &t_log);
//组帧头
u8_cnt = u8_ies_pack_frm_head(NT_BILL_UPLOAD, u8_gunNo+1, -1, u8_sendBuf);
//组帧体
//流水号
memcpy(&u8_sendBuf[u8_cnt], t_log.u8_tradeNo, 32);
u8_cnt += 32;
//用户类型
u8_sendBuf[u8_cnt++] = t_log.e_user_type;
//用户标识
memcpy(&u8_sendBuf[u8_cnt], t_log.u8_user_id, 32);
u8_cnt += 32;
#if BS_IES_TYPE == 1
//本次充电电量 0.001,高字节在前
u32_data = (U32_T)(t_chgRcd.u32_used_energy);
u8_sendBuf[u8_cnt++] = (U8_T)(u32_data>>24);
u8_sendBuf[u8_cnt++] = (U8_T)(u32_data>>16);
u8_sendBuf[u8_cnt++] = (U8_T)(u32_data>>8);
u8_sendBuf[u8_cnt++] = (U8_T)(u32_data);
#else
//本次充电电量 0.01,高字节在前
u32_data = (U32_T)(t_log.u32_used_energy/100);
u8_sendBuf[u8_cnt++] = (U8_T)(u32_data>>24);
u8_sendBuf[u8_cnt++] = (U8_T)(u32_data>>16);
u8_sendBuf[u8_cnt++] = (U8_T)(u32_data>>8);
u8_sendBuf[u8_cnt++] = (U8_T)(u32_data);
#endif
//3.7协议新增4中类型电费
#if BS_IES_TYPE == 3
for(i=0; i<4; i++)
{
#if BS_IES_TYPE == 1
//时段电量
u32_data = (U32_T)(f32_get_log_time_info(i+1,0,&t_chgRcd)*1000);
u8_sendBuf[u8_cnt++] = (U8_T)(u32_data>>24);
u8_sendBuf[u8_cnt++] = (U8_T)(u32_data>>16);
u8_sendBuf[u8_cnt++] = (U8_T)(u32_data>>8);
u8_sendBuf[u8_cnt++] = (U8_T)(u32_data);
#else
//时段电量
u32_data = (U32_T)(f32_get_log_time_info(i+1,0,&t_chgRcd)*100);
u8_sendBuf[u8_cnt++] = (U8_T)(u32_data>>24);
u8_sendBuf[u8_cnt++] = (U8_T)(u32_data>>16);
u8_sendBuf[u8_cnt++] = (U8_T)(u32_data>>8);
u8_sendBuf[u8_cnt++] = (U8_T)(u32_data);
#endif
//时段电费
u32_data = (U32_T)(f32_get_log_time_info(i+1,1,&t_chgRcd)*100000);
u8_sendBuf[u8_cnt++] = (U8_T)(u32_data>>24);
u8_sendBuf[u8_cnt++] = (U8_T)(u32_data>>16);
u8_sendBuf[u8_cnt++] = (U8_T)(u32_data>>8);
u8_sendBuf[u8_cnt++] = (U8_T)(u32_data);
}
#else
for(i=0; i<8; i++)
{
U32_T u32_part_energy;
F32_T f32_rate,f32_sevice;
v_bs_get_fee_part_data(u8_gunNo,i,&t_log,&u32_part_energy,&f32_rate,&f32_sevice); //获取时段电量、电费,小数点后4位
#if BS_IES_TYPE == 1
//时段电量
u32_data = (U32_T)(f32_get_log_time_info(i+1,0,&t_chgRcd)*1000);
u8_sendBuf[u8_cnt++] = (U8_T)(u32_data>>24);
u8_sendBuf[u8_cnt++] = (U8_T)(u32_data>>16);
u8_sendBuf[u8_cnt++] = (U8_T)(u32_data>>8);
u8_sendBuf[u8_cnt++] = (U8_T)(u32_data);
#else
//时段电量
u32_data = (U32_T)(u32_part_energy/100);
u8_sendBuf[u8_cnt++] = (U8_T)(u32_data>>24);
u8_sendBuf[u8_cnt++] = (U8_T)(u32_data>>16);
u8_sendBuf[u8_cnt++] = (U8_T)(u32_data>>8);
u8_sendBuf[u8_cnt++] = (U8_T)(u32_data);
#endif
//时段电费
u32_data = (U32_T)(f32_rate*10);
u8_sendBuf[u8_cnt++] = (U8_T)(u32_data>>24);
u8_sendBuf[u8_cnt++] = (U8_T)(u32_data>>16);
u8_sendBuf[u8_cnt++] = (U8_T)(u32_data>>8);
u8_sendBuf[u8_cnt++] = (U8_T)(u32_data);
}
#endif
//电费总额
u32_data = (U32_T)(t_log.u32_used_money*10);
u8_sendBuf[u8_cnt++] = (U8_T)(u32_data>>24);
u8_sendBuf[u8_cnt++] = (U8_T)(u32_data>>16);
u8_sendBuf[u8_cnt++] = (U8_T)(u32_data>>8);
u8_sendBuf[u8_cnt++] = (U8_T)(u32_data);
//服务费总额
u32_data = (U32_T)(t_log.u32_used_service*10);
u8_sendBuf[u8_cnt++] = (U8_T)(u32_data>>24);
u8_sendBuf[u8_cnt++] = (U8_T)(u32_data>>16);
u8_sendBuf[u8_cnt++] = (U8_T)(u32_data>>8);
u8_sendBuf[u8_cnt++] = (U8_T)(u32_data);
Plat_Comm_LOG("Charged energy*1000= %d, amount= %d, service fee= %d\n",t_log.u32_used_energy,t_log.u32_used_money*10,t_log.u32_used_service*10);
//起始时间(时间戳)
u32_data = xDate2Seconds(&t_log.StartChargeTime);
u8_sendBuf[u8_cnt++] = (U8_T)(u32_data>>24);
u8_sendBuf[u8_cnt++] = (U8_T)(u32_data>>16);
u8_sendBuf[u8_cnt++] = (U8_T)(u32_data>>8);
u8_sendBuf[u8_cnt++] = (U8_T)(u32_data);
//结束时间(时间戳)
u32_data = xDate2Seconds(&t_log.EndChargeTime);
u8_sendBuf[u8_cnt++] = (U8_T)(u32_data>>24);
u8_sendBuf[u8_cnt++] = (U8_T)(u32_data>>16);
u8_sendBuf[u8_cnt++] = (U8_T)(u32_data>>8);
u8_sendBuf[u8_cnt++] = (U8_T)(u32_data);
//开始SOC
u8_sendBuf[u8_cnt++] = t_log.u8_startSoc;//(u8_gunNo,E_BS_GET_SYS_DATA_SOC_DATA,1);
//结束SOC
u8_sendBuf[u8_cnt++] = t_log.u8_endSoc;//(u8_gunNo,E_BS_GET_SYS_DATA_SOC_DATA,2);
//车辆VIN
memcpy(&u8_sendBuf[u8_cnt],t_log.u8_vinCode, 17);
u8_cnt += 17;
u8_sendBuf[u8_cnt++] = 0;
u8_sendBuf[u8_cnt++] = 0;
u8_sendBuf[u8_cnt++] = 0;
//停机原因
u8_sendBuf[u8_cnt++] = e_get_ies_stop_res(&t_log);
//停机原因
// U8_T u8_data = e_get_ies_stop_res(&t_log);
// u8_sendBuf[u8_cnt++] = u8_data;
// Plat_Comm_LOG("国网平台停机原因:%d,积成平台停机原因为:%d\n",t_log.e_stop_reason[0],u8_data);
//BST中止------------LQ未添加
//memcpy(&u8_sendBuf[u8_cnt], &t_bst_data, 4);
u8_cnt += 4;
//BSM中止------------LQ未添加
//memcpy(&u8_sendBuf[u8_cnt], &t_bsm_data.u16_batt_state,2);
u8_cnt += 2;
//启动前金额
u32_data = (U32_T)(t_log.u32_balance_begin / 100);
u8_sendBuf[u8_cnt++] = (U8_T)(u32_data>>24);
u8_sendBuf[u8_cnt++] = (U8_T)(u32_data>>16);
u8_sendBuf[u8_cnt++] = (U8_T)(u32_data>>8);
u8_sendBuf[u8_cnt++] = (U8_T)(u32_data);
//充电后金额
u32_data = (U32_T)(( t_log.u32_balance_begin - t_log.u32_used_money - t_log.u32_used_service) / 100);
u8_sendBuf[u8_cnt++] = (U8_T)(u32_data>>24);
u8_sendBuf[u8_cnt++] = (U8_T)(u32_data>>16);
u8_sendBuf[u8_cnt++] = (U8_T)(u32_data>>8);
u8_sendBuf[u8_cnt++] = (U8_T)(u32_data);
//支付标志
u8_sendBuf[u8_cnt++] = 1;
//支付时间
u32_data = 0;
u8_sendBuf[u8_cnt++] = (U8_T)(u32_data>>24);
u8_sendBuf[u8_cnt++] = (U8_T)(u32_data>>16);
u8_sendBuf[u8_cnt++] = (U8_T)(u32_data>>8);
u8_sendBuf[u8_cnt++] = (U8_T)(u32_data);
//和校验
u8_sendBuf[u8_cnt] = u16_crc_checksum(&u8_sendBuf[3], u8_cnt-3);
u8_cnt++;
//更新帧长度域
u8_sendBuf[1] = (u8_cnt-4)>>8;
u8_sendBuf[2] = u8_cnt-4;
// printf("订单数据:");
// for(i=0;i<u8_cnt;i++)
// {
// printf("%2x ",u8_sendBuf[i]);
// }
// printf("\n");
Plat_Comm_LOG("Gun %d order upload, serial number %s\n",u8_gunNo,&t_log.u8_preTradeNo[0]);
v_ies_send(u8_sendBuf, u8_cnt);
}
void v_ies_start_req(U8_T u8_gunNo) //主动启动充电请求 0x41
{
/*************头部************************/
U8_T u8_cnt = 0;
U8_T u8_sendBuf[BS_BUF_SIZE_128]= {0};
S_LOG_DATA t_log ; //获取充电日志数据
v_bs_get_gun_log_data(u8_gunNo , &t_log);
v_genrt_chgSerialNum_ieszt(t_log.u8_tradeNo, u8_gunNo); //生成流水号
memset(u8_sendBuf, 0, BS_BUF_SIZE_128);
//帧头
u8_cnt = u8_ies_pack_frm_head(NT_START_CHG_REQ, u8_gunNo+1, -1, u8_sendBuf);
//启动方式
u8_sendBuf[u8_cnt++] = 3; //VIN
//是否需要密码
u8_sendBuf[u8_cnt++] = 0;
//vin码
memcpy(&u8_sendBuf[u8_cnt] ,t_log.u8_vinCode, 17);//"LC0CD4C32H1022222",17);
u8_cnt += 32;
//用户输入密码
memset(&u8_sendBuf[u8_cnt],0,32);
u8_cnt += 32;
//启动模式
u8_sendBuf[u8_cnt++] = 0;
//模式参数
u8_sendBuf[u8_cnt++] = 0;
u8_sendBuf[u8_cnt++] = 0;
u8_sendBuf[u8_cnt] = u16_crc_checksum(&u8_sendBuf[3], u8_cnt-3); //和校验
u8_cnt++;
//更新帧长度域
u8_sendBuf[1] = (u8_cnt-4)>>8;
u8_sendBuf[2] = u8_cnt-4;
Plat_Comm_LOG("Send active request packet\n");
v_ies_send(u8_sendBuf, u8_cnt);
/******************************************/
}
void v_ies_set_clk_sync_ack(void) //对时应答 0x75
{
U8_T u8_cnt = 0; //cnt总发送长度
U32_T u32_curr_time = 0; //当前时间戳
Comm_Time ctTime;
U8_T u8_sendBuf[BS_BUF_SIZE_128];
memset(u8_sendBuf, 0, BS_BUF_SIZE_128);
//组帧头
u8_cnt = u8_ies_pack_frm_head(NT_CLK_SYNC_ACK, NT_ID_PILE, -1, u8_sendBuf);
//组帧体
GetCurrentTime(&ctTime);
u32_curr_time = xDate2Seconds(&ctTime);
u8_sendBuf[u8_cnt++] = (U8_T)(u32_curr_time>>24); //时间戳
u8_sendBuf[u8_cnt++] = (U8_T)(u32_curr_time>>16);
u8_sendBuf[u8_cnt++] = (U8_T)(u32_curr_time>>8);
u8_sendBuf[u8_cnt++] = (U8_T)(u32_curr_time);
u8_sendBuf[u8_cnt] = u16_crc_checksum(&u8_sendBuf[3], u8_cnt-3); //和校验
u8_cnt++;
//更新帧长度域
u8_sendBuf[1] = (u8_cnt-4)>>8;
u8_sendBuf[2] = u8_cnt-4;
v_ies_send(u8_sendBuf, u8_cnt);
Plat_Comm_LOG("Time sync ack");
}
void v_ies_set_fee_ack(void) //计费模型设置应答 0x7E
{
U8_T u8_cnt = 0; //cnt总发送长度
U8_T u8_sendBuf[BS_BUF_SIZE_128]= {0};
//组帧头
u8_cnt = u8_ies_pack_frm_head(NT_FEE_CFG_ACK, NT_ID_PILE, -1, u8_sendBuf);
//组帧体
u8_sendBuf[u8_cnt++] = 0; //命令应答,0成功,1失败
u8_sendBuf[u8_cnt] = u16_crc_checksum(&u8_sendBuf[3], u8_cnt-3); //和校验
u8_cnt++;
//更新帧长度域
u8_sendBuf[1] = (u8_cnt-4)>>8;
u8_sendBuf[2] = u8_cnt-4;
v_ies_send(u8_sendBuf, u8_cnt);
}
void v_ies_upgrade_data_auto_ack(void) //升级结果回复
{
U8_T u8_cnt = 0; //cnt总发送长度
U8_T u8_sendBuf[BS_BUF_SIZE_128]= {0};
//组帧头
u8_cnt = u8_ies_pack_frm_head(NT_UPDATE_AUTO_ACK, NT_ID_PILE, -1, u8_sendBuf);
//组帧体
u8_sendBuf[u8_cnt++] = 0;//t_ftp_update_info.u8_update_result;
u8_sendBuf[u8_cnt] = u16_crc_checksum(&u8_sendBuf[3], u8_cnt-3); //和校验
u8_cnt++;
//更新帧长度域
u8_sendBuf[1] = (u8_cnt-4)>>8;
u8_sendBuf[2] = u8_cnt-4;
//Plat_Comm_LOG("发送升级结果= %d\n",t_ftp_update_info.u8_update_result);
v_ies_send(u8_sendBuf, u8_cnt);
mSleep(NUM_1000);
/******************************************/
// if(t_ftp_update_info.u8_update_result == 0)
// {
// //跳回IAP程序lyn20180419,重启桩
// __set_FAULTMASK(1);
// NVIC_SystemReset();
// }
}
void v_ies_rmt_start_ack(U8_T u8_gunNo, U8_T serialNum ,U8_T flag) //远程启动应答 0x43, 应答帧序号跟询问帧需保持一致
{
U8_T u8_cnt = 0; //cnt总发送长度
U8_T u8_sendBuf[BS_BUF_SIZE_128]= {0};
S_LOG_DATA t_log ; //获取充电日志数据
v_bs_get_gun_log_data(u8_gunNo , &t_log);
//组帧头
u8_cnt = u8_ies_pack_frm_head(NT_REMOTE_START_ACK, u8_gunNo+1, serialNum, u8_sendBuf);
//组帧体
//命令应答,0无效,1表示已接收到命令,正在启动过程中,回复此信息,后面充电桩无论实际启动成功或失败,都会上送结算账单
//2枪未连接,3正在充电,4设备故障
//桩上送2~4结果时,平台认为创建充电过程不成功,但本次充电流水号及账单信息需保存在服务器,桩不上送结算账单
u8_sendBuf[u8_cnt++] = flag;
//流水号
memcpy(&u8_sendBuf[u8_cnt],&t_log.u8_tradeNo[0], 32);
u8_cnt += 32;
//和校验
u8_sendBuf[u8_cnt] = u16_crc_checksum(&u8_sendBuf[3], u8_cnt-3);
u8_cnt++;
//更新帧长度域
u8_sendBuf[1] = (u8_cnt-4)>>8;
u8_sendBuf[2] = u8_cnt-4;
//printf("远程启动应答:\n");
// for(i=0;i<u8_cnt;i++)
// {
// printf("%02x ",u8_sendBuf[i]);
// }
// printf("\n");
v_ies_send(u8_sendBuf, u8_cnt);
Plat_Comm_LOG("Gun %d, remote start ack upload\n",u8_gunNo);
}
void v_ies_rmt_stop_ack(U8_T u8_gunNo, U8_T serialNum) //远程停机应答 0x45
{
U8_T u8_cnt = 0; //cnt总发送长度
U8_T u8_sendBuf[BS_BUF_SIZE_128]= {0};
S_LOG_DATA t_log ; //获取充电日志数据
v_bs_get_gun_log_data(u8_gunNo , &t_log);
//组帧头
u8_cnt = u8_ies_pack_frm_head(NT_REMOTE_STOP_ACK, u8_gunNo+1, serialNum, u8_sendBuf);
//组帧体
u8_sendBuf[u8_cnt++] = 0; //0x00停机
memcpy(&u8_sendBuf[u8_cnt], t_log.u8_tradeNo,32);
u8_cnt += 32;
u8_sendBuf[u8_cnt] = u16_crc_checksum(&u8_sendBuf[3], u8_cnt-3); //和校验
u8_cnt++;
//更新帧长度域
u8_sendBuf[1] = (u8_cnt-4)>>8;
u8_sendBuf[2] = u8_cnt-4;
// printf("远程停止应答:");
// for(i=0;i<u8_cnt;i++)
// {
// printf("%02x ",u8_sendBuf[i]);
// }
// printf("\n");
v_ies_send(u8_sendBuf, u8_cnt);
}
void v_ies_rmt_oprt_ack(U8_T *u8_opr_cmd, U8_T opr_result) //远程操作应答 0x77
{
U8_T u8_cnt = 0; //cnt总发送长度
U8_T u8_result_succ[] = "ok";
U8_T u8_result_fail[] = "fail";
U8_T u8_sendBuf[BS_BUF_SIZE_128]= {0};
//组帧头
u8_cnt = u8_ies_pack_frm_head(NT_REMOTE_OPRT_ACK, NT_ID_PILE, -1, u8_sendBuf);
//组帧体
memcpy(&u8_sendBuf[u8_cnt], u8_opr_cmd, 32); //命令 32 ascii
u8_cnt += 32;
//执行结果 32 ascii
if(opr_result == 1)
memcpy(&u8_sendBuf[u8_cnt], u8_result_succ, sizeof(u8_result_succ));
else
memcpy(&u8_sendBuf[u8_cnt], u8_result_fail, sizeof(u8_result_fail));
u8_cnt += 32;
//和校验
u8_sendBuf[u8_cnt] = u16_crc_checksum(&u8_sendBuf[3], u8_cnt-3);
u8_cnt++;
//更新帧长度域
u8_sendBuf[1] = (u8_cnt-4)>>8;
u8_sendBuf[2] = u8_cnt-4;
v_ies_send(u8_sendBuf, u8_cnt);
}
#endif
#if 1//接收
void v_ies_heart_ack(void) //心跳应答帧 0x04
{
Plat_Comm_LOG("Heartbeat ack= %d\n",private_ies_data1->u8_heart_outTime_cnt);
private_ies_data1->u8_heart_outTime_cnt = 0; //计数清零
}
void v_ies_register_ack(U8_T *u8_recvBuf) //登陆帧应答 0x02
{
Plat_Comm_LOG("Login platform ack\n");
if((((u8_recvBuf[21]&NT_0B_MASK_H)>>6) == NT_DC_PILE) && //直流桩
(((u8_recvBuf[21]&NT_0B_MASK_L)) == NT_ID_PILE)) //充电桩本体
{
if(u8_recvBuf[23] == 0) //登录结果0成功
{
private_ies_data1->u8_register_flag = 1;
Plat_Comm_LOG("u8_register_flag= %d\n",private_ies_data1->u8_register_flag);
}
private_ies_data1->u8_time_flag = 1; //校时标志
Plat_Comm_LOG("Receive login platform ack, result= %d\n",u8_recvBuf[23]);
}
}
void v_ies_set_clk_sync(U8_T *u8_recvBuf) //对时 0x76
{
U32_T u32_curr_time = 0; //当前时间戳
Comm_Time ctTime;
if(((u8_recvBuf[21]&NT_0B_MASK_H)>>6) == NT_DC_PILE) //直流桩
{
u32_curr_time = (U32_T)((u8_recvBuf[23]<<24) + (u8_recvBuf[24]<<16) + (u8_recvBuf[25]<<8) + (u8_recvBuf[26]));
//时间戳转为标准时间
xSeconds2Date(u32_curr_time, &ctTime);
Plat_Comm_LOG("Platform time sync timestamp = %d, converted to Beijing time=%d-%d-%d %d:%d:%d \r\n",
u32_curr_time, ctTime.iYear, ctTime.ucMonth, ctTime.ucDay, ctTime.ucHour, ctTime.ucMin, ctTime.ucSec);
//校时
v_bs_set_time(&ctTime); //CPU时间设定
ctTime.iYear -= 2000;
private_ies_data1->u8_time_flag = 1; //校时标志 //校时标志
v_ies_set_clk_sync_ack(); //对时应答
}
}
void v_ies_fee_ack(U8_T *u8_recvBuf) //计费模型应答帧 0x06 *
{
Plat_Comm_LOG("Fee model, platform ack\n");
if((((u8_recvBuf[21]&NT_0B_MASK_H)>>6) == NT_DC_PILE) && //直流桩
(((u8_recvBuf[21]&NT_0B_MASK_L)) == NT_ID_PILE)) //充电桩本体
{
v_set_fee_model(u8_recvBuf);
}
}
void v_ies_set_fee(U8_T *u8_recvBuf) //计费模型设置 0x7D
{
{
Plat_Comm_LOG("Platform issue fee model\n");
v_set_fee_model(u8_recvBuf);
//应答
v_ies_set_fee_ack();
}
}
void v_ies_bill_upload_ack(U8_T *u8_recvBuf) //结算账单应答 0x48
{
U8_T u8_gunNo = 0;
U8_T u8_preTradeNo[32] = {0};
S_LOG_DATA t_log;
if(((u8_recvBuf[21]&NT_0B_MASK_H)>>6) == NT_DC_PILE) //直流桩
{
//枪号
u8_gunNo = (u8_recvBuf[21]&NT_0B_MASK_L)-1; //枪号不正确 自己判断订单
//充电流水号
memcpy(u8_preTradeNo, &u8_recvBuf[24], 32);
//TODO 根据流水号
v_bs_get_gun_log_data(u8_gunNo , &t_log);
if(memcmp(u8_preTradeNo, t_log.u8_preTradeNo, strlen((char*)t_log.u8_preTradeNo)) == 0)
{
s_bs_task_ctrl.s_bs_ctrl[private_ies_data1->id].s_gundata[u8_gunNo].txFlag_tradUpload = 0;
Plat_Comm_LOG("Gun %d order upload success\n", u8_gunNo);
}
else
{
Plat_Comm_LOG("Gun %d--serial number mismatch= %s %s\n", u8_gunNo,u8_preTradeNo,t_log.u8_preTradeNo);
}
//v_logUploadOk_updateInfo(bs_ctrl_data[s_bs_ctrl_data.u8_bs_flag].u16_cmplte_bill_index[u8_gunNo]); //上送成功,更新管理文件及上送标记
}
}
void v_ies_rmt_start(U8_T *u8_recvBuf) //远程启动 0x44
{
U8_T u8_gunNo = 0;
U8_T u8_tradeNo[32],u8_useId[32];
U16_T u16_data;
U32_T u32_data;
U8_T gun_state,ret,u8_guanlink;
S_BS_CHAR_CTRL s_bs_char_ctrl;
//v_bs_get_gun_log_data(u8_gunNo , &t_log);
//命令应答,0无效,1表示已接收到命令,正在启动过程中,回复此信息,后面充电桩无论实际启动成功或失败,都会上送结算账单
//2枪未连接,3正在充电,4设备故障
// printf("平台下发启动:");
// for(i=0;i<100;i++)
// {
// printf("%2x ",u8_recvBuf[i]);
// }
// printf("\n");
if(((u8_recvBuf[21]&NT_0B_MASK_H)>>6) == NT_DC_PILE) //直流桩
{
//枪号
u8_gunNo = (u8_recvBuf[21]&NT_0B_MASK_L)-1;
gun_state = u8_ies_get_gun_state(u8_gunNo);
if(gun_state == 0) ret = 2; //枪未连接
else if(gun_state == 1) ret = 1; //表示已接收到命令,启动
else if(gun_state == 2 || gun_state == 3) ret = 3; //表示已接收到命令,正在启动过程中
else if(gun_state == 4 || gun_state == 5) ret = 3; //
else ret = 4; //设备故障
Plat_Comm_LOG("%d枪,后台启动充电,结果= %d\n",u8_gunNo,ret);
if(ret == 1)
{
memset(&s_bs_char_ctrl , 0 ,sizeof(S_BS_CHAR_CTRL));
//控制充电启动 -- 内置订单数据清空
s_bs_char_ctrl.u16_ctrl_res = CTR_CMD_BS_START; //后台启动
//充电方式
if((u8_recvBuf[60] & 0x0F) == 1) //按金额充电
{
s_bs_char_ctrl.e_start_mode = E_SDK_CHGMOD_MONEY; //按金额充电
s_bs_char_ctrl.u16_limit = (F32_T)(((u8_recvBuf[61] << 8) + u8_recvBuf[62]) *100);
}
else if((u8_recvBuf[60] & 0x0F) == 2) //按电量充电
{
s_bs_char_ctrl.e_start_mode = E_SDK_CHGMOD_ELE; //按电量充电
s_bs_char_ctrl.u16_limit = (F32_T)(((u8_recvBuf[61] << 8) + u8_recvBuf[62]) *10);
}
else if((u8_recvBuf[60] & 0x0F) == 3) //按时间充电
{
s_bs_char_ctrl.e_start_mode = E_SDK_CHGMOD_TIME; //按时间充电
s_bs_char_ctrl.u16_limit = (F32_T)((u8_recvBuf[61] << 8) + u8_recvBuf[62]);
}
//printf("平台下发限制充电金额为:%d",s_char_ctrl.u16_limit);
v_genrt_chgSerialNum_ieszt(&u8_tradeNo[0], u8_gunNo); //生成流水号
strncpy((char *)s_bs_char_ctrl.u8_tradeNo , (char *)u8_tradeNo , sizeof(s_bs_char_ctrl.u8_tradeNo));
u16_data = (USER_TYPE_E)u8_recvBuf[23];
s_bs_char_ctrl.e_user_type = u16_data;
//用户标识
memcpy(u8_useId, &u8_recvBuf[24], 32);
strncpy((char *)s_bs_char_ctrl.u8_user_id , (char *)u8_useId , sizeof(s_bs_char_ctrl.u8_user_id));
//卡内或账户余额
u32_data = ((u8_recvBuf[56]<<24) + (u8_recvBuf[57]<<16) + (u8_recvBuf[58]<<8) + u8_recvBuf[59])*100;
//printf("平台下发启动充电金额为:%d",u32_data);
s_bs_char_ctrl.u32_balance_begin = u32_data;
v_bs_charge_action_ctrl(u8_gunNo,0, &s_bs_char_ctrl);
s_bs_task_ctrl.s_bs_ctrl[private_ies_data1->id].s_gundata[u8_gunNo].txFlag_tradUpload = 0;
}
//向平台应答
v_ies_rmt_start_ack(u8_gunNo, u8_recvBuf[3],ret);
}
}
void v_ies_rx_start(U8_T *u8_recvBuf) //运营确认启动 0x42
{
U8_T u8_gunNo = 0;
U32_T u32_data;
//命令应答,0无效,1表示已接收到命令,正在启动过程中,回复此信息,后面充电桩无论实际启动成功或失败,都会上送结算账单
//2枪未连接,3正在充电,4设备故障
if(((u8_recvBuf[21]&NT_0B_MASK_H)>>6) == NT_DC_PILE) //直流桩
{
//枪号
u8_gunNo = (u8_recvBuf[21]&NT_0B_MASK_L)-1;
if(u8_recvBuf[23] == 0)
s_bs_task_ctrl.s_bs_ctrl[0].s_gundata[u8_gunNo].txFlag_autoRwsult = 10; //鉴权通过
//账户余额
u32_data = (U16_T)(((u8_recvBuf[24]<<24) + (u8_recvBuf[25]<<16) + (u8_recvBuf[26]<<8) + u8_recvBuf[27])* 10000.0);
v_meterlog_set_char_log_info(u8_gunNo,E_METERLOG_SET_LOG_INFO_u32_balance_begin,&u32_data ,0);
u32_data = 3;
v_meterlog_set_char_log_info(u8_gunNo,E_METERLOG_SET_LOG_INFO_u32_user_type, NULL,(U8_T *)&u32_data);
s_bs_task_ctrl.s_bs_ctrl[private_ies_data1->id].s_gundata[u8_gunNo].txFlag_tradUpload = 0; //订单上送标识置0
}
}
void v_ies_rmt_stop(U8_T *u8_recvBuf) //远程停机 0x46
{
U8_T u8_gunNo = 0;
U16_T u16_data = E_NORMAL_1002;
//S_HOST_CHAR_CTRL s_char_ctrl;
S_BS_CHAR_CTRL s_bs_char_ctrl;
//memset(&s_char_ctrl , 0 ,sizeof(S_HOST_CHAR_CTRL));
memset(&s_bs_char_ctrl , 0 ,sizeof(S_BS_CHAR_CTRL));
if(((u8_recvBuf[21]&NT_0B_MASK_H)>>6) == NT_DC_PILE) //直流桩
{
//枪号
u8_gunNo = (u8_recvBuf[21]&NT_0B_MASK_L)-1;
Plat_Comm_LOG("%d枪,远程停止充电\n",u8_gunNo);
//[23] = 01表示停止充电
s_bs_char_ctrl.u16_ctrl_res = u16_data;
v_bs_charge_action_ctrl(u8_gunNo,2, &s_bs_char_ctrl);
//向平台应答
v_ies_rmt_stop_ack(u8_gunNo,u8_recvBuf[3]);
}
}
void v_ies_qr_dis(U8_T *u8_recvBuf) //二维码下发
{
U8_T flag = 0;
U8_T u8_cnt = 0,u8_gunNo = 0; //cnt总发送长度
U8_T u8_sendBuf[BS_BUF_SIZE_128]= {0};
U8_T u8_qr_len;
char *qr_buf;
u8_gunNo = u8_recvBuf[23]; //充电枪号,从1开始
if (u8_gunNo > GUN_MAX_CNT) {
return;
}
qr_buf = g_t_share_data.t_sys_var_cfg.QRDisplay[u8_gunNo-1];
v_ccu_set_qrcode_flag(u8_gunNo, 0U);
u8_qr_len = u8_recvBuf[24];
if (u8_qr_len >= sizeof(g_t_share_data.t_sys_var_cfg.QRDisplay[0])) {
u8_qr_len = (U8_T)(sizeof(g_t_share_data.t_sys_var_cfg.QRDisplay[0]) - 1U);
}
memset(qr_buf, 0, sizeof(g_t_share_data.t_sys_var_cfg.QRDisplay[0]));
memcpy(qr_buf, &u8_recvBuf[25], u8_qr_len);
Plat_Comm_LOG("Platform issue gun %d QR code=%d ,%s\n", u8_gunNo, u8_qr_len, qr_buf);
v_flash_save_cfg_data();
flag = 1;
//二维码下发应答
//组帧头
u8_cnt = u8_ies_pack_frm_head(NT_QR_REQ_DIS_ACK, NT_ID_PILE, -1, u8_sendBuf);
//组帧体
u8_sendBuf[u8_cnt++] = u8_gunNo; //枪号
u8_sendBuf[u8_cnt++] = flag; //应答结果
u8_sendBuf[u8_cnt] = u16_crc_checksum(&u8_sendBuf[3], u8_cnt-3); //和校验
u8_cnt++;
//更新帧长度域
u8_sendBuf[1] = (u8_cnt-4)>>8;
u8_sendBuf[2] = u8_cnt-4;
v_ies_send(u8_sendBuf, u8_cnt);
}
void v_ies_qr_call(U8_T *u8_recvBuf) //二维码召唤
{
U8_T u8_cnt = 0,len,u8_gunNo; //cnt总发送长度
U8_T u8_sendBuf[BS_BUF_SIZE_128]= {0};
const char *qr_buf;
u8_gunNo = u8_recvBuf[23]; //充电枪号,从1开始
if (u8_gunNo > GUN_MAX_CNT) {
return;
}
qr_buf = g_t_share_data.t_sys_var_cfg.QRDisplay[u8_gunNo-1];
{
if(u8_recvBuf[24] == 0x00)
{
//二维码召唤应答
//组帧头
u8_cnt = u8_ies_pack_frm_head(NT_QR_REQ_CALL_ACK, NT_ID_PILE, -1, u8_sendBuf);
//组帧体
u8_sendBuf[u8_cnt++] = u8_gunNo; //枪号
len = (U8_T)strlen(qr_buf);
u8_sendBuf[u8_cnt++] = len;
memcpy(&u8_sendBuf[u8_cnt], qr_buf, len); //二维码
u8_cnt += len;
u8_sendBuf[u8_cnt] = u16_crc_checksum(&u8_sendBuf[3], u8_cnt-3); //和校验
u8_cnt++;
//logMsg("平台召测,二维码 %d,%s\n",len,g_t_share_data.t_sys_var_cfg.QRDisplay);
Plat_Comm_LOG("Gun %d QR code call\n",u8_gunNo-1);
//更新帧长度域
u8_sendBuf[1] = (u8_cnt-4)>>8;
u8_sendBuf[2] = u8_cnt-4;
v_ies_send(u8_sendBuf, u8_cnt);
}
}
}
#endif
#if 0
void v_ies_upgrade_data_auto(U8_T *u8_recvBuf) //平台应答文件内容请求 0x90
{
memset((void*)&t_ftp_update_info,0,sizeof(T_FTP_UPDATE_INFO));
memcpy(t_ftp_update_info.u8_user,u8_recvBuf+23,20); //用户名
memcpy(t_ftp_update_info.u8_pwd,u8_recvBuf+43,20); //密码
memcpy(t_ftp_update_info.u8_update_server_addr,u8_recvBuf+63,15); //域名
t_ftp_update_info.u16_update_server_port = 21;
//memcpy(t_ftp_update_info.u8_path,u8_recvBuf+78,20); //文件路径
memcpy(t_ftp_update_info.u8_file_name,u8_recvBuf+98,20);//文件名
Plat_Comm_LOG("User name=%s\n",t_ftp_update_info.u8_user);
Plat_Comm_LOG("Password=%s\n",t_ftp_update_info.u8_pwd);
Plat_Comm_LOG("Domain=%s\n",t_ftp_update_info.u8_update_server_addr);
Plat_Comm_LOG("File path=%s\n",t_ftp_update_info.u8_path);
Plat_Comm_LOG("File name=%s\n",t_ftp_update_info.u8_file_name);
bs_ctrl_data[s_bs_ctrl_data.u8_bs_flag].u8_updata_flag = 1; //开始升级
}
void v_ies_rmt_oprt(U8_T *u8_recvBuf) //远程操作 0x78
{
U8_T u8_restart[] = "rb"; //重启
U8_T u8_restart2[] = "rbp"; //主机柜重启
U8_T u8_emegcy[] = "qs"; //急停
U8_T u8_gun_lock[] = "lc"; //锁枪
U8_T u8_gun_unlock[] = "ulc"; //解枪
U8_T u8_log[] = "ulf"; //日志上传
U8_T u8_set_pow[] = "sp"; //设置功率,单位w, 设置值前4个字节
U8_T u8_cmd[32] = {0}; //接收到的命令
U8_T u8_set_type; //设置值,1执行,2取消,other值
U32_T u32_datas = 0;
U8_T u8_pow[4] = {0}; //接收到的命令
//命令
memcpy(u8_cmd, &u8_recvBuf[23], 32);
//设定值,1执行,2取消
u8_set_type = u8_recvBuf[55];
//功率设定值,前4位表示功率
memcpy(u8_pow, &u8_recvBuf[56], 4); //(设置值第1个字节为枪号(0表示1枪,1表示2枪),设置值第2~5个字节为功率限制置,单位:w)
u32_datas = ((u8_pow[0]<<24) + (u8_pow[1]<<16) + (u8_pow[2]<<8) + u8_pow[3]);
Plat_Comm_LOG("Remote operation =%s\n",u8_cmd);
if(strstr((const char*)u8_cmd, (const char*)u8_restart) != NULL) //重启 即if(u8_recvBuf[23] == 0x72 && u8_recvBuf[24] == 0x62)
{
//Plat_Comm_LOG("收到重启命令\n");
if(u8_set_type == 1)
{
//跳回IAP程序lyn20180419
Plat_Comm_LOG("Ack execute restart command\n");
v_ies_rmt_oprt_ack(u8_cmd, 1);
mSleep(NUM_1000);
v_oprt_yk(YK_RESTART_ON); //硬重启
mSleep(NUM_1000);
__set_FAULTMASK(1); //跳回IAP程序lyn20180419
NVIC_SystemReset();
return;
}
else if(u8_set_type == 2)
{
//Plat_Comm_LOG("收到取消重启的命令\n");
v_ies_rmt_oprt_ack(u8_cmd, 2);
return;
}
else
{
//Plat_Comm_LOG("设置值为其他值得重启命令\n");
v_ies_rmt_oprt_ack(u8_cmd, u8_set_type);
}
}
else if(strstr((const char*)u8_cmd, (const char*)u8_restart2) != NULL) //重启 即if(u8_recvBuf[23] == 0x72 && u8_recvBuf[24] == 0x62)
{
if(u8_set_type == 1)
{
//跳回IAP程序lyn20180419
Plat_Comm_LOG("Ack execute main cabinet restart command\n");
v_ies_rmt_oprt_ack(u8_cmd, 1);
v_set_pcm_restartFlag(1); //设置重启主机柜
return;
}
else if(u8_set_type == 2)
{
//Plat_Comm_LOG("收到取消重启的命令\n");
v_ies_rmt_oprt_ack(u8_cmd, 2);
return;
}
else
{
//Plat_Comm_LOG("设置值为其他值得重启命令\n");
v_ies_rmt_oprt_ack(u8_cmd, u8_set_type);
}
}
else if(strstr((const char*)u8_cmd, (const char*)u8_set_pow) != NULL) //有序调节
{
Plat_Comm_LOG("u32_datas=%d\n",u32_datas);
if(u32_datas > 0 && u32_datas < 400*1000) //小于400kW
{
v_ies_rmt_oprt_ack(u8_cmd, 1);
mSleep(NUM_5);
f32_set_max_power(1,u32_datas); //限制功率
}
else
{
//Plat_Comm_LOG("设置值为其他值得重启命令\n");
v_ies_rmt_oprt_ack(u8_cmd, u8_set_type);
}
}
else
{
v_ies_rmt_oprt_ack(u8_cmd, 0);
return;
}
}
#endif
#endif