#include #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= 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>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>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>8; u8_sendBuf[2] = u8_cnt-4; // for(i=0;i>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>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>8; u8_sendBuf[2] = u8_cnt-4; // printf("远程停止应答:"); // for(i=0;i>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