Files

1062 lines
44 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#include "plat_comm/gwsdk/bs_gwsdk_ctrl.h"
#include "plat_comm/gwsdk/bs_gwsdk_interface.h"
#include "plat_comm/impl/bs_public_impl.h"
#include "plat_comm/plat_comm_task.h"
#include "bsp_include.h"
#include "meter_calculate/meter_calculate_impl.h"
#include "plat_comm/impl/bs_public_impl.h"
#if (BS_GWSDK_EN)
const char SDK_VER[] = "V1.1.10"; //使用SDK版本
#if 1 //公共函数使用
/**
* ************************************************************************
* @brief - sdk 停机原因美化
*
* @param[in] e_info - 故障信息
*
* @return U16_T - 美化后的停止原因
*
* @author jiankalka
* @date 2025-09-20
* ************************************************************************
*/
static E_FAULT_INFO e_gwsdk_get_log_res(E_FAULT_INFO e_info)
{
E_FAULT_INFO e_ret = e_info;
if(e_info == E_FAULT_13016) //充电中控制导引故障 按 BSM 报文中动力蓄电池温度过高
e_ret = E_FAULT_15017;
else if(e_info == E_FAULT_13042) //绝缘监测故障 按 BMS 通信协议版本不匹配
e_ret= E_FAULT_15043;
else if(e_info == E_FAULT_15034) //绝缘监测前直流输出接触器外侧电压越限(60V) BRM 车辆辨识报文超时
e_ret = E_FAULT_15011;
else if(e_info == E_FAULT_14020) //模块启动失败 按 BRO准备后取消
e_ret = E_FAULT_15020;
else if(e_info == E_FAULT_13015) //控制导引电压异常 按 BRO 充电准备就绪报文超时
e_ret = E_FAULT_15004;
else if(e_info == E_FAULT_13013) //充电接口过温故障 按 后台停止充电
e_ret = E_NORMAL_1002;
else if(e_info == E_FAULT_13010) //上锁故障 按 BCS通讯超时
e_ret = E_FAULT_15005;
else if(e_info == E_FAULT_13048) //直流输出电压过压故障 按 BST 电压异常
e_ret = E_FAULT_15031;
else if(e_info == E_FAULT_13054) //输出电流大于车辆需求电流 按 BSM 报文中连接器连接状态异
e_ret = E_FAULT_15019;
else if(e_info == E_FAULT_13049) //直流输出电流过流故障 按 BST 元件、 输出连接器过温
e_ret = E_FAULT_15024;
else if(e_info == E_FAULT_13005) //直流输出接触器拒动/误动故障 按 BSM 报文中 SOC 过低
e_ret = E_FAULT_15015;
else if(e_info == E_FAULT_13004) //直流输出接触器粘连故障 按 BCP 报文数据项异常
e_ret = E_FAULT_15033;
else if(e_info == E_FAULT_13050) //直流输出电压欠压故障 按 需求电流超过车辆最高允许充电电流
e_ret = E_FAULT_15038;
else if(e_info == E_FAULT_13047) //泄放回路故障 按 BST 电池组过温
e_ret = E_FAULT_15026;
return e_ret;
}
static void v_genrt_chgSerialNum_sdk(U8_T *u8_serianNum, U8_T gunNo) //生成设备充电流水号
{
U8_T i, hundreds,unit;
U16_T ChargeCnt, OperateCnt;
U8_T u8_time_buf[6] = {0};
Comm_Time t_time;
U8_T device_name[NUM_64] = {0};
u8_get_str_data(0, E_STR_SDK_PARA_device_name,0,device_name,NUM_64); //获取系统资产吗
memset(u8_serianNum , 0 , EVS_MAX_TRADE_LEN);
memcpy(u8_serianNum, &device_name[0],24);//资产码
sprintf((char *)(&u8_serianNum[24]), "%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;
for(i=0; i<3; i++)
sprintf((char *)(&u8_serianNum[26+2*i]), "%02d", u8_time_buf[i]);
s_bs_task_ctrl.s_gwsdk_ctrl.ChargeCnt ++;
s_bs_task_ctrl.s_gwsdk_ctrl.OperateCnt ++;
if(s_bs_task_ctrl.s_gwsdk_ctrl.ChargeCnt>=9999)
s_bs_task_ctrl.s_gwsdk_ctrl.ChargeCnt = 1;
if(s_bs_task_ctrl.s_gwsdk_ctrl.OperateCnt>=99)
s_bs_task_ctrl.s_gwsdk_ctrl.OperateCnt = 1;
sprintf((char *)(&u8_serianNum[32]), "%04d", s_bs_task_ctrl.s_gwsdk_ctrl.ChargeCnt);
sprintf((char *)(&u8_serianNum[36]), "%02d", s_bs_task_ctrl.s_gwsdk_ctrl.OperateCnt);
}
static int iCharToInt(char *pData)//将字符型时间转换为整数型秒
{
int iHour=0;
int iMin=0;
int iSecond=0;
iHour = (pData[0]-'0')*10+(pData[1]-'0');
iMin = (pData[2]-'0')*10+(pData[3]-'0');
iSecond =iHour*60+iMin;
if(iSecond > 1440)
iSecond = iSecond % 1440;
return iSecond; //2400变成0000
}
static int gw_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))) //后续还需要添加整桩故障信息上传
{
u8_ret ++;
}
}
return u8_ret;
}
#endif
#if 1 //发送组帧数据获取
void gw_get_firmware_data(evs_event_firmware_info *fireware_info ) //获取固件信息
{
U8_T u8_str_data[NUM_64];
U32_T u32_data;
memset(fireware_info, 0, sizeof(evs_event_firmware_info));
//1 SIM卡号,最长24
u8_get_str_data(0,E_STR_SDK_SIM_ID,0,u8_str_data,NUM_64);
memcpy(fireware_info->simNo, u8_str_data, strlen((char*)u8_str_data));
//2 电费计费模型编号,没有填" ",最长16
//计费模型ID
u8_get_str_data(0,E_STR_FEE_ID,0,u8_str_data,NUM_64);
memcpy(fireware_info->feeModelId, u8_str_data, strlen((char *)u8_str_data));
//4 充电桩型号,由厂商提供,最长20字符
memcpy(fireware_info->stakeModel, "iES-ICS22032GW", strlen("iES-ICS22032GW"));
//5 生产厂商编码,积成1049
fireware_info->vendorCode = 1049;
//6 出厂编号
u8_get_str_data(0,E_STR_SDK_PARA_device_uid,0,u8_str_data,NUM_64);
memcpy(fireware_info->devSn, u8_str_data, EVS_MAX_DEV_SN_LEN);
fireware_info->devType = 12; //7 桩类型10单相交流,11三相交流,12直流
//8 充电接口数量
u32_data = u32_bs_get_sys_data(0,E_BS_GET_SYS_DATA_GUN_NUM,0);
fireware_info->portNum = u32_data;
memcpy(fireware_info->simMac, "00:0E:EA:03:A5:88", strlen("00:0E:EA:03:A5:88")); //9 网络MAC地址
fireware_info->longitude = 0; //10 经度
fireware_info->latitude = 0; //11 纬度
fireware_info->height = 0; //12 高度
fireware_info->gridType = 10; //13 坐标类型10无经纬度坐标数值,11GPS12北斗,13GLONASS,14伽利略
//14 蓝牙MAC地址,无值填“”,最长24
memcpy(fireware_info->btMac, "aa:bb:cc:dd:ee:ff", strlen("aa:bb:cc:dd:ee:ff"));//
fireware_info->meaType = 10; //15 计量方式,10直流电能表,11交流电能表,12直流计量模块,13交流计量模块
//16 额定功率 0.1kW
u32_data = u32_bs_get_sys_data(0,E_BS_GET_SYS_DATA_RATED_POWER,0); //单位w
fireware_info->otRate = u32_data/1000*10;
//16 输出最小电压
u32_data = u32_bs_get_sys_data(0,E_BS_GET_SYS_DATA_PILE_PUT_PARA,1);
fireware_info->otMinVol = (unsigned int)(u32_data); //500;
//18 输出最大电压
u32_data = u32_bs_get_sys_data(0,E_BS_GET_SYS_DATA_PILE_PUT_PARA,0);
fireware_info->otMaxVol = (unsigned int)(u32_data); //7500;
//19 输出最大电流
u32_data = u32_bs_get_sys_data(0,E_BS_GET_SYS_DATA_PILE_PUT_PARA,2);
fireware_info->otMaxCur = (unsigned int)(u32_data);
//17 输出最小电流
u32_data = u32_bs_get_sys_data(0,E_BS_GET_SYS_DATA_PILE_PUT_PARA,3);
fireware_info->otMinCur = (unsigned int)(u32_data);
//20 交流输入电表地址,交流桩无
u8_get_str_data(0,E_STR_METER_ADDR,1,u8_str_data,NUM_64);
memcpy(fireware_info->inMeter, u8_str_data, 6);
//21 计量用电能表地址
u8_get_str_data(0,E_STR_METER_ADDR,0,u8_str_data,NUM_64);
memcpy(fireware_info->outMeter, u8_str_data, 6);
fireware_info->CT = 30; //22 电流互感器系数
fireware_info->isGateLock = 10; //23 是否有只能门锁,10无,11有
fireware_info->isGroundLock = 10; //24 是否有地锁,10无,11有
fireware_info->mutliChargingMode = 10; //是否支持多时段类型计费模型 10:支持多时段类型计费模型 11:不支持多时段类型计费模型
}
void gw_get_ver_data(evs_event_ver_info *ver_info) //获取版本信息
{
U8_T u8_str_data[NUM_64];
//填充版本信息
memset(ver_info, 0, sizeof(evs_event_ver_info));
ver_info->devRegMethod = 10; //1 设备注册方式10屏幕,11蓝牙,12串口,13NFC14USB15固件,16其他
u8_get_str_data(0,E_STR_SOFTWARE_VERSION,0,u8_str_data,NUM_64);
memcpy(ver_info->pileSoftwareVer, u8_str_data, strlen((char *)u8_str_data)); //2 充电桩软件版本号,最长256字节
u8_get_str_data(0,E_STR_HARDWARE_VERSION,0,u8_str_data,NUM_64);
memcpy(ver_info->pileHardwareVer, u8_str_data, strlen((char *)u8_str_data)); //3 充电桩硬件版本号,最长256字节
memcpy(ver_info->sdkVer, SDK_VER, sizeof(SDK_VER)); //4 SDK版本号,最长256
}
void gw_get_devInfo_data(evs_event_devmdu_info* devInfo_data) //获取设备组件信息
{
char string[] = "WH_GM5";
char string2[] = "20231112";
memset(devInfo_data , 0 ,sizeof(evs_event_devmdu_info));
memcpy(devInfo_data->netMduInfo ,string,sizeof(string)); // 1 网络模块型号
memcpy(devInfo_data->netMduSoftVer ,string2,sizeof(string2)); // 2 网络模块软件版本号
// memcpy(devInfo_data->netMduImei ,string,sizeof(string)); // 3 网络模块IMEI
devInfo_data->smartGun = 11; // 4 智能充电枪功能 10支持,11不支持
devInfo_data->mduInfoInt[0] = 11; //蓝牙即插即充功能
devInfo_data->mduInfoInt[1] = 10; //VIN 即插即充功能支持
devInfo_data->mduInfoInt[2] = 11; //白名单 VIN 离线即插即充
devInfo_data->mduInfoInt[3] = 10; //扫码功能
// memcpy(devInfo_data->mduInfoString[0],string,sizeof(string));
// memcpy(devInfo_data->mduInfoString[1],string,sizeof(string));
// memcpy(devInfo_data->mduInfoString[2],string,sizeof(string));
// memcpy(devInfo_data->mduInfoString[3],string,sizeof(string));
// memcpy(devInfo_data->mduInfoString[4],string,sizeof(string));
// char mduInfoString[EVS_MAX_MDUSTRING_NUM][EVS_MAX_MDUSTRING_LEN]; // 6 string型数组
}
void gw_get_alarm_data(evs_event_alarm *event_alarm ,U8_T u8_gunNo) //获取故障告警信息
{
REAL_FAULT_DATA_T rl_data;
U8_T j;
v_get_fault_data(&rl_data);
memset(event_alarm , 0 ,sizeof(evs_event_alarm));
event_alarm->gunNo = u8_gunNo+1;
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))) //后续还需要添加整桩故障信息上传
{
event_alarm->faultValue[event_alarm->faultSum] = rl_data.fault_data[j].e_mag;
event_alarm->faultSum ++;
}
}
for(j=0;j<CURR_ALARM_MAX_CNT;j++)
{
if((rl_data.warn_data[j].e_mag != 0 &&
(rl_data.warn_data[j].e_ingun == E_GUN + u8_gunNo ||rl_data.warn_data[j].e_ingun == E_WHOLE_PILE)))
{
event_alarm->warnValue[event_alarm->warnSum] = rl_data.warn_data[j].e_mag;
event_alarm->warnSum ++;
}
}
}
void gw_getPilePropertyData(evs_property_dcPile* dcProperty) //获取直流桩设备属性
{
static U32_T u32_start_time = 0; //系统启动时间
Comm_Time ct_time;
U8_T u8_str_data[NUM_64];
memset(dcProperty, 0, sizeof(evs_property_dcPile));
if(u32_start_time == 0) //记录系统启动时间
{
GetCurrentTime(&ct_time);
u32_start_time = xDate2Seconds(&ct_time);
}
dcProperty->netType = 13; // 1 网络类型,10获取不到,11-2G,12-3G,13-4G,15-NB_IOT,16-WIFI,17有线网络
dcProperty->sigVal = u32_bs_get_sys_data(0,E_BS_GET_SYS_DATA_4G_signal_quality,0); // 2 网络信号等级,整数0~31,数字越大标识信号越好
dcProperty->netId = 12; // 3 网络运营商,10未获取成功,11联通,12移动,13电信,14其他
dcProperty->acVolA = 3800; // 4 A相采集电压,精确到小数点后1位, 8209-0.01V
dcProperty->acCurA = 0; // 5 A相采集电流,精确到小数点后2位, 8209-0.001A
dcProperty->acVolB = 3800; // 6 B相采集电压,单相桩填0
dcProperty->acCurB = 0; // 7 B相采集电流
dcProperty->acVolC = 3800; // 8 C相采集电压
dcProperty->acCurC = 0; // 9 C相采集电流
dcProperty->caseHumidity = 0; //设???湿?? 协???新加
dcProperty->caseTemp = u32_bs_get_sys_data(0,E_BS_GET_SYS_DATA_PILE_TEMP,0); // 10 桩内温度,
dcProperty->inletTemp = 0;
dcProperty->outletTemp = 0;
//计费模型ID
u8_get_str_data(0,E_STR_FEE_ID,0,u8_str_data,NUM_64);
memcpy(dcProperty->feeModelId, u8_str_data, strlen((char *)u8_str_data));
dcProperty->totalRam = 0; // 15 总内??
dcProperty->ramUseRate = 0; // 16 内存使用??
dcProperty->totalRom = 0; // 17 总硬盘空??
dcProperty->romUseRate = 0; // 18 磁盘使用??
dcProperty->cpuUseRate = 0; // 19 cpu使用??
dcProperty->sysStartTime= u32_start_time; // 20 系统??动时?? 时间??
dcProperty->sysWorkTime = get_current_seconds()/60; // 21 系统??计运行时?? min
//logMsg_bs("直流设备属性上报\n");
}
void gw_get_gunlink_data(evs_event_pile_stutus_change *gunlink_state,U8_T u8_gunNo) //获取枪连接状态
{
Comm_Time c_time;
U8_T u8_gunLink = u32_bs_get_sys_data(u8_gunNo,E_BS_GET_SYS_DATA_GUN_STATE,0);
GetCurrentTime(&c_time);
memset(gunlink_state , 0, sizeof(evs_event_pile_stutus_change));
gunlink_state->gunNo = u8_gunNo+1;
gunlink_state->yxOccurTime = xDate2Seconds(&c_time); //当前时间转换为时间
if(u8_gunLink == 1)
{
gunlink_state->connCheckStatus = 10;
}
else
{
gunlink_state->connCheckStatus = 11;
}
Plat_Comm_LOG("动作时间= %.4d年%.2d月%.2d日 %.2d:%.2d:%.2d \n",
c_time.iYear,c_time.ucMonth,c_time.ucDay,c_time.ucHour,c_time.ucMin,c_time.ucSec);
Plat_Comm_LOG("yxOccurTime = %d -- %u\n",gunlink_state->yxOccurTime,gunlink_state->yxOccurTime);
}
void gw_get_stopResult_info(U8_T gunNo,evs_event_stopCharge* event_stopResult) //枪停止结果上送
{
U8_T u8_str_data[NUM_64];
U16_T u16_log_res = u32_bs_get_sys_data(gunNo,E_BS_GET_SYS_DATA_LOG_STOP_REASON,0);
memset(event_stopResult , 0 ,sizeof(evs_event_stopCharge));
//组启动结果上传帧
event_stopResult->gunNo = gunNo + 1;
u8_get_str_data(gunNo,E_STR_LOG_preTradeNo,0,u8_str_data,NUM_64);
memcpy(event_stopResult->preTradeNo, u8_str_data, EVS_MAX_TRADE_LEN);
u8_get_str_data(gunNo,E_STR_LOG_preTradeNo,1,u8_str_data,NUM_64);
memcpy(event_stopResult->tradeNo, u8_str_data, EVS_MAX_TRADE_LEN);
event_stopResult->stopResult = 10; //4 启动结果
event_stopResult->resultCode = u16_log_res;
event_stopResult->stopFailReson = 11;
}
void gw_get_startResult_info(U8_T gunNo,evs_event_startResult* event_startResult) //枪启动结果上送
{
U8_T u8_str_data[NUM_64];
U16_T u16_log_res = u32_bs_get_sys_data(gunNo,E_BS_GET_SYS_DATA_LOG_STOP_REASON,0);
U8_T u8_get_flow_state = u8_bs_get_flow_state(gunNo); //获取终端状态 0 空闲 1开始充电 2充电中
memset(event_startResult , 0 ,sizeof(evs_event_startResult));
//组启动结果上传帧
event_startResult->gunNo = gunNo + 1;
u16_log_res = e_gwsdk_get_log_res(u16_log_res); //故障优化
u8_get_str_data(gunNo,E_STR_LOG_preTradeNo,0,u8_str_data,NUM_64);
memcpy(event_startResult->preTradeNo, u8_str_data, EVS_MAX_TRADE_LEN);
u8_get_str_data(gunNo,E_STR_LOG_preTradeNo,1,u8_str_data,NUM_64);
memcpy(event_startResult->tradeNo, u8_str_data, EVS_MAX_TRADE_LEN);
// if(u8_get_flow_state == 2) //启动成功
// {
event_startResult->startResult = 10; //4 启动结果
event_startResult->faultCode = 0; //5 充电故障
// }
// else
// {
// event_startResult->startResult = 12; //4 启动结果:失败
// event_startResult->faultCode = u16_log_res; //5 充电故障
// }
u8_get_str_data(gunNo,E_STR_LOG_vin,0,u8_str_data,NUM_64);
memcpy(event_startResult->vinCode, u8_str_data,EVS_MAX_CAR_VIN_LEN);
event_startResult->vinCode[17] = '\0';
Plat_Comm_LOG("启动结果VIN=%s\n",event_startResult->vinCode);
printf("%d枪,启动结果帧:终端状态:%d,启动结果:%d\r\n",event_startResult->gunNo,u8_get_flow_state,event_startResult->startResult);
printf("%d枪,启动失败原因:%d\r\n",event_startResult->gunNo,event_startResult->faultCode);
}
void gw_get_DC_meter_data(evs_property_meter* meterData,U8_T u8_gunNo) //获取直流电表底值数据
{
Comm_Time ct_time;
U8_T u8_str_data[NUM_64];
U64_T u64_meter_data = u64_bs_get_sys_data(u8_gunNo,E_BS_GET_SYS_DATA_MEMTER_ELECT); //0.0001kW
U32_T u32_log_energe = u32_bs_get_sys_data(u8_gunNo,E_BS_GET_SYS_DATA_LOG_ENERGY,0); //0.001kW
GetCurrentTime(&ct_time);
memset(meterData,0,sizeof(evs_property_meter));
meterData->gunNo = u8_gunNo +1; // 1 充电枪编号
sprintf(meterData->acqTime,"%04d%02d%02d%02d%02d%02d\n", (ct_time.iYear), (ct_time.ucMonth), ct_time.ucDay,(ct_time.ucHour), ct_time.ucMin,ct_time.ucSec);
memcpy(meterData->mailAddr, "AAAAAA", strlen("AAAAAA"));
memcpy(meterData->meterNo, "BBBBBB", strlen("BBBBBB"));
memcpy(meterData->assetId, "CCCCCC", strlen("CCCCCC"));
meterData->sumMeter = (unsigned int)(u64_meter_data);
u8_get_str_data(u8_gunNo,E_STR_LOG_preTradeNo,0,u8_str_data,NUM_64);
memcpy(meterData->lastTrade,u8_str_data,EVS_MAX_TRADE_LEN);
meterData->elec = (unsigned int)(u32_log_energe*10);
}
void gw_get_dc_BMS_Data(evs_property_BMS* BMSData ,U8_T u8_gunNo) //获取直流桩BMS属性
{
#if 0
BMS_BRM_DATA_T t_brm_data;
BMS_BCP_DATA_T t_bcp_data;
CHARGE_LOG_T t_log ; //获取充电日志数据
v_get_log_data(u8_gunNo,&t_log);
u8_get_bmsdata_brm(u8_gunNo,&t_brm_data);
u8_get_bmsdata_bcp(u8_gunNo,&t_bcp_data);
BMSData->gunNo = u8_gunNo +1; //1 充电枪编号
memcpy(BMSData->preTradeNo, &t_log.u8_preTradeNo[0], EVS_MAX_TRADE_LEN); //2 平台交易流水号
memcpy(BMSData->tradeNo, &t_log.u8_tradeNo[0], EVS_MAX_TRADE_LEN); //3 设备交易流水号
BMSData->socVal = u8_get_bmsdata_soc(u8_gunNo); //4 SOC
if(e_get_bmsdata_standard(u8_gunNo) == BMS_2015)
BMSData->BMSVer = 11; // 5 BMS通信协议版本号
else
BMSData->BMSVer = 10; // 5 BMS通信协议版本号
BMSData->BMSMaxVol = (unsigned short)(t_bcp_data.f32_batt_charge_max_volt *10); //6 最高允许充电总电压
if(t_brm_data.u8_batt_type<10)
BMSData->batType = (unsigned char)(t_brm_data.u8_batt_type +10); // 7 电池类型
else
BMSData->batType = 99;
BMSData->batRatedCap = (unsigned short)(t_brm_data.f32_batt_rated_c10*10); // 8 整车动力蓄电池额定容量
BMSData->batRatedTotalVol = (unsigned short)(t_brm_data.f32_batt_rated_volt*10); // 9 整车动力蓄电池额定总电压
BMSData->singlBatMaxAllowVol = (unsigned short)(t_bcp_data.f32_cell_charge_max_volt *100); // 10 单体动力蓄电池最高允许充电电压
BMSData->maxAllowCur =(unsigned short)(400 - t_bcp_data.f32_batt_charge_max_curr)*10;//11 最高允许充电电流
BMSData->battotalEnergy =(unsigned short)(t_bcp_data.f32_batt_rated_enery*10); // 12 整车动力蓄电池标称总能量
BMSData->maxVol =(unsigned short)(t_bcp_data.f32_batt_charge_max_volt *10);//13 最高允许充电总电压
BMSData->maxTemp = (unsigned short)(t_bcp_data.s16_batt_allow_max_temp+50);// 14 最高允许温度
BMSData->batCurVol = (unsigned short)(t_bcp_data.f32_batt_volt*10); // 15 整车动力蓄电池当前电池电压
memcpy(BMSData->batManufacturer,t_brm_data.u8_batt_vender,4);// 16 电池组厂??
memcpy(BMSData->batSN,&t_brm_data.u32_batt_serial,4);// 17 电池组序??
memcpy(BMSData->batMadeDay,t_brm_data.u8_batt_make,3);// 18 电池组生产日??
BMSData->chargeTimes = t_brm_data.u32_batt_charge_times;
BMSData->batProperty = 11;
memcpy(BMSData->bmsSoftVer,t_brm_data.u8_bms_soft_version,8);// 21 BMS??件版????
//logMsg_bs("直流BMS属性上报\n");
#endif
}
void gw_get_dc_work(evs_property_dc_work* gunData,U8_T u8_gunNo) //获取直流充电中状态数据
{
unsigned char uWorkStatus; // 工作状态
unsigned char uGunStatus; // 充电枪连接状态
U16_T ctime;
Comm_Time st_CurTime; //当前时间
U8_T i;
S_LOG_DATA t_log ; //获取充电日志数据
S_FEE_MODEL s_fee_model;
v_bs_save_fee_data(0,&s_fee_model); //获取费率信息
U8_T u8_gunLink = u32_bs_get_sys_data(u8_gunNo,E_BS_GET_SYS_DATA_GUN_STATE,0); //枪连接状态
U8_T u8_gunLock = u32_bs_get_sys_data(u8_gunNo,E_BS_GET_SYS_DATA_GUN_STATE,1); //枪锁状态
U8_T u8_gun_temp1 = u32_bs_get_sys_data(u8_gunNo,E_BS_GET_SYS_DATA_GUN_TEMP_POS,0); //枪温正 单位0.1度 0-100最小为0
U8_T u8_gun_temp2 = u32_bs_get_sys_data(u8_gunNo,E_BS_GET_SYS_DATA_GUN_TEMP_NEG,0); //枪温负 单位0.1度 0-100最小为0
U16_T u16_put_vol = u32_bs_get_sys_data(u8_gunNo,E_BS_GET_SYS_DATA_METER_VOL,0); //电表电压 单位0.1V
U16_T u16_put_cur = u32_bs_get_sys_data(u8_gunNo,E_BS_GET_SYS_DATA_METER_CUR,0); //电表电流 单位0.1A
U16_T u16_need_vol = u32_bs_get_sys_data(u8_gunNo,E_BS_GET_SYS_DATA_BMS_NEED_VOL,0); //需求电压 单位0.1V
U16_T u16_need_cur = u32_bs_get_sys_data(u8_gunNo,E_BS_GET_SYS_DATA_BMS_NEED_CUR,0); //需求电流 单位0.1A
U16_T u16_bms_vol = u32_bs_get_sys_data(u8_gunNo,E_BS_GET_SYS_DATA_BMS_CHARGE_VOL,0); //BMS充电电压测量值 单位0.1V
U16_T u16_bms_cur = u32_bs_get_sys_data(u8_gunNo,E_BS_GET_SYS_DATA_BMS_CHARGE_CUR,0); //BMS充电电流测量值 单位0.1A
U16_T u16_cell_max_volt = u32_bs_get_sys_data(u8_gunNo, E_BS_GET_SYS_DATA_BMS_CELL_CHARGE_MAX_VOL, 0); //单体动力蓄电池最高允许充电电压 0.1V
U8_T u8_cell_max_volt_id = u32_bs_get_sys_data(u8_gunNo, E_BS_GET_SYS_DATA_BMS_BATT_ID, 0); //电池编号信息 0最高单体动力蓄电池电压所在编号 1最高动力蓄电池温度检测点编号 2最低动力蓄电池温度检测点编号
U8_T u8_max_temp_id = u32_bs_get_sys_data(u8_gunNo, E_BS_GET_SYS_DATA_BMS_BATT_ID, 1); //电池编号信息 0最高单体动力蓄电池电压所在编号 1最高动力蓄电池温度检测点编号 2最低动力蓄电池温度检测点编号
U8_T u8_min_temp_id = u32_bs_get_sys_data(u8_gunNo, E_BS_GET_SYS_DATA_BMS_BATT_ID,2); //电池编号信息 0最高单体动力蓄电池电压所在编号 1最高动力蓄电池温度检测点编号 2最低动力蓄电池温度检测点编号
U8_T u8_max_temp = u32_bs_get_sys_data(u8_gunNo, E_BS_GET_SYS_DATA_BMS_TEMP,0); //单位 0.1度0-100最小为0 0 电池最高温度 1最低温度
U8_T u8_min_temp = u32_bs_get_sys_data(u8_gunNo, E_BS_GET_SYS_DATA_BMS_TEMP,1); //单位 0.1度0-100最小为0 0 电池最高温度 1最低温度
U8_T u8_remain_time = u32_bs_get_sys_data(u8_gunNo, E_BS_GET_SYS_DATA_BMS_REMAIN_TIME,0); //剩余充电时间 min
v_bs_get_gun_log_data(u8_gunNo , &t_log);
memset(gunData,0,sizeof(evs_property_dc_work));
gunData->gunNo = u8_gunNo + 1; // 充电枪编号
gunData->workStatus=13;
if(u8_gunLink == 0)
{
gunData->gunStatus = 11;
gunData->guidanceVol = 120;
}
else
{
gunData->gunStatus = 10;
gunData->guidanceVol = 40;
}
if(u8_gunLock == 0)
{
gunData->eLockStatus = 10;//解锁
}
else
{
gunData->eLockStatus = 11;//上锁
}
gunData->DCK1Status = 11;
gunData->DCK2Status = 11;
gunData->DCPlusFuseStatus = 11;
gunData->DCMinusFuseStatus = 11;
gunData->conTemp1 = (unsigned short)(u8_gun_temp1 + 500) ; // 充电接口DC+温度
gunData->conTemp2 = (unsigned short)(u8_gun_temp2 + 500) ; // 充电接口DC-温度
gunData->dcVol = (unsigned int)(u16_put_vol); // 输出电压
gunData->dcCur = (unsigned int)(u16_put_cur*10); // 输出电流
memcpy(gunData->preTradeNo, &t_log.u8_preTradeNo[0], EVS_MAX_TRADE_LEN); //2 平台交易流水号
memcpy(gunData->tradeNo, &t_log.u8_tradeNo[0], EVS_MAX_TRADE_LEN); //3 设备交易流水号
gunData->chgType = 15; // 充电类型 15平台????
gunData->realPower = (unsigned int)(gunData->dcVol* gunData->dcCur) /1000; // 充电设备输出功率 0.1W
gunData->chgTime = (unsigned int)t_log.u16_ChargedTime; // 累计充电时间
gunData->remainT = (unsigned char)u8_remain_time; // 估算充满剩余充电时间
gunData->socVal = (unsigned char)t_log.u8_endSoc; // SOC
gunData->needVol = (unsigned int)(u16_need_vol); // 充电需求电压 0.1
gunData->needCur = (unsigned int)(u16_need_cur); // 充电需求电流 0.1
gunData->chargeMode = 11; // 充电模式
gunData->chargeMode = 12;//data.chargeMode;
gunData->bmsVol = (u16_bms_vol); // BMS充电电压测量值
gunData->bmsCur = ((4000 - u16_bms_cur) ); // BMS充电电流测量值
gunData->SingleMHV = (u16_cell_max_volt*10); // 最高单体动力蓄电池电压
gunData->SingleMLV = ((u16_cell_max_volt)*10); // 最低单体动力蓄电池电压
gunData->SingleMHVNo = (u8_cell_max_volt_id); // 最高单体动力蓄电池电压所在编??
gunData->MHTempNo = u8_max_temp_id;
gunData->MLTempNo = u8_min_temp_id;
if(gunData->SingleMHVNo == 0)
gunData->SingleMHVNo = 1;
if(gunData->MHTempNo == 0)
gunData->MHTempNo = 1;
if(gunData->MLTempNo == 0)
gunData->MLTempNo = 1;
gunData->MHTemp = (unsigned int)((u8_max_temp + 500)); // 最高动力蓄电池温度
gunData->MLTemp = (unsigned int)((u8_max_temp + 500)); // 最低动力蓄电池温度
gunData->acInputContactorState = 11; // 33 交流输入接触器状??
gunData->acInputContactorCtrlState = 11; // 34 交流输入接触器控制状??
gunData->k1CtrlState = 11; // 35 直流接触器K1控制状??
gunData->k2CtrlState = 11; // 36 直流接触器K2控制状??
gunData->apsSwtichCtrlState = 11; // 37 交流输入接触器控制状??
gunData->carbinFanCtrlState = 11; // 38 风机开关控制状??
gunData->elockCtrlState = 11; // 39 电子锁控制状??
gunData->meterStartVal = (unsigned int)(t_log.u64_startKWh); // 40 表底值起始值
if(t_log.u64_endKWh == 0)
gunData->meterRealVal = gunData->meterStartVal;
else
gunData->meterRealVal = (unsigned int)(t_log.u64_endKWh); // 41 表底值当前值
gunData->totalElect = (unsigned int)(t_log.u32_used_energy ); // 总电量
gunData->totalCost = (unsigned int)((t_log.u32_used_money + t_log.u32_used_service)); // 总金额
gunData->totalPowerCost = (unsigned int)(t_log.u32_used_money); // 总电费
gunData->totalServCost = (unsigned int)(t_log.u32_used_service); // 总服务费
//logMsg_bs("电量= %f ,电费= %f ,服务费= %f\n",t_log.f32_used_energy,t_log.f32_used_money,t_log.f32_used_service);
gunData->timeNum = s_fee_model.u8_feeCnt; // 46 时段数
for(i=0;i<gunData->timeNum;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); //获取时段电量、电费
gunData->partElect[i] = u32_part_energy; //时段电量
gunData->chargeFee[i] = (unsigned int)(gunData->partElect[i] * f32_rate);//时段电费
gunData->serviceFee[i] = (unsigned int)(gunData->partElect[i] * f32_sevice); //时段服务费
// if(gunData->partElect[i] !=0 )
// {
// logMsg_bs("%d - 电量= %f\n",i,f32_part_energy);
// logMsg_bs("电费= %f ,服务费= %f\n",gunData->chargeFee[i],gunData->serviceFee[i]);
// }
}
ctime = (t_log.StartChargeTime.ucHour*60) + t_log.StartChargeTime.ucMin;
gunData->startPoint = ctime / 15 + 1; // 50 起???点标识
GetCurrentTime(&st_CurTime);
ctime = st_CurTime.ucHour * 60 + st_CurTime.ucMin;
gunData->crossPoints = ((ctime/15) + 96 - gunData->startPoint+1)%96 +1; // 51 跨越点数
for(i=0;i<gunData->crossPoints;i++) //计算跨越点数电量 -
{
gunData->pointsElect[i] = t_log.u32_part_energy[(i+gunData->startPoint-1)%96];
}
//logMsg_bs("获取直流充电中状态数据\n");
}
void gw_get_dc_nonWork(evs_property_dc_nonWork* gunData,U8_T u8_gunNo) //获取直流非充电中状态数据
{
U8_T uWorkStatus; // 工作状态
U8_T u8_flow_state = u32_bs_get_sys_data(u8_gunNo,E_BS_GET_SYS_DATA_GUN_FLOW_STATE,0); //枪运行状态 0空闲 1插枪 2绝缘启机 3绝缘停止 4预充启动 5充电中 6充电停止 7停止完成
U8_T u8_fualt_num = gw_gun_fault_num(u8_gunNo);
U8_T u8_gunLink = u32_bs_get_sys_data(u8_gunNo,E_BS_GET_SYS_DATA_GUN_STATE,0); //枪连接状态
U8_T u8_gunLock = u32_bs_get_sys_data(u8_gunNo,E_BS_GET_SYS_DATA_GUN_STATE,1); //枪锁状态
U8_T u8_gun_temp1 = u32_bs_get_sys_data(u8_gunNo,E_BS_GET_SYS_DATA_GUN_TEMP_POS,0); //枪温正 单位0.1度 0-100最小为0
U8_T u8_gun_temp2 = u32_bs_get_sys_data(u8_gunNo,E_BS_GET_SYS_DATA_GUN_TEMP_NEG,0); //枪温负 单位0.1度 0-100最小为0
U32_T u32_meter_data = u32_bs_get_sys_data(u8_gunNo,E_BS_GET_SYS_DATA_MEMTER_ELECT,0); //电表电量 0.001kWh
gunData->gunNo = u8_gunNo + 1;
if(u8_fualt_num != 0)
{
uWorkStatus = 16;//故障
}
else if(u8_flow_state == E_FLOW_REAL_FREE && u8_gunLink == 0) //空闲中
{
uWorkStatus = 10;
}
else if(u8_flow_state == E_FLOW_REAL_FREE && u8_gunLink == 1) //空闲中,插枪
{
uWorkStatus = 11;
}
else if(u8_flow_state == E_FLOW_REAL_STOP_OK ) //充电完成后未拔枪枪
{
uWorkStatus = 14;
}
else
{
uWorkStatus = 12;
}
/*预约状态未加*/
gunData->workStatus=uWorkStatus;
//logMsg_bs("uWorkStatus=%d,u8_gunNo=%d\n",uWorkStatus,u8_gunNo);
if(u8_gunLink == 0)
{
gunData->gunStatus = 11;
gunData->guidanceVal = 120; //控制引导电压
gunData->acContactorState = 10; //交流接触器断
}
else
{
gunData->gunStatus = 10;
gunData->guidanceVal = 40; //控制引导电压
gunData->acContactorState = 11; //交流接触器合
}
if(u8_gunLock == 0)
{
gunData->eLockStatus = 10;//解锁
}
else
{
gunData->eLockStatus = 11;//上锁
}
gunData->DCK1Status = 10;
gunData->DCK2Status = 10;
gunData->DCPlusFuseStatus = 11;
gunData->DCMinusFuseStatus = 11;
gunData->conTemp1 = (U16_T)(u8_gun_temp1 +500);
gunData->conTemp2 = (U16_T)(u8_gun_temp2 +500);
gunData->dcVol = 0;
gunData->dcCur = 0;
gunData->chargeCnt = s_bs_task_ctrl.s_gwsdk_ctrl.s_gwsdk_gun[u8_gunNo].u16_charge_cnt;// 13 充电总次数
gunData->chargeTime = s_bs_task_ctrl.s_gwsdk_ctrl.s_gwsdk_gun[u8_gunNo].u32_charge_time;; // 14 充电总时长
gunData->k1Cnt = gunData->chargeCnt*2; // 15 K1总动作次数
gunData->k2Cnt = gunData->chargeCnt*2; // 16 K2总动作次数
gunData->auxiliaryPowerStatus = 10; // 19 辅助电源开关控制状??
gunData->elockCtrlState = 10; // 20 电子锁控制状??
gunData->fanSwitchCtrlStatus = 10; // 21 风机开关控制状??
gunData->sumMeter = (unsigned int)(u32_meter_data *10); // 22 电表底??
//logMsg_bs("获取直流非充电中状态数据\n");
//logMsg_bs("uWorkStatus=%d,u8_gunNo=%duGunStatus =%d\n",uWorkStatus,gunNo,uGunStatus);
}
void gw_get_Auth_Data(evs_event_startCharge* AuthData ,U8_T u8_gunNo) //获取即插即充所需数据
{
S_LOG_DATA t_log ; //获取充电日志数据
U8_T u8_tradeNo[NUM_64] = {0};
memset(AuthData,0,sizeof(evs_event_startCharge));
v_genrt_chgSerialNum_sdk(&u8_tradeNo[0], u8_gunNo); //生成设备流水号
v_bs_get_gun_log_data(u8_gunNo , &t_log);
AuthData ->gunNo = u8_gunNo + 1; //1 充电枪编号
memcpy(AuthData->preTradeNo, " ", EVS_MAX_TRADE_LEN); //2 平台交易流水号
memcpy(AuthData->tradeNo, u8_tradeNo, EVS_MAX_TRADE_LEN); //3 设备交易流水号
AuthData ->startType = 11; //4 充电方式
memcpy(AuthData->authCode,t_log.u8_vinCode,17); //5 鉴权码t_log.u8_vinCode
AuthData ->batterySOC = 0;// 6 电池SOC
AuthData ->batteryCap = 0;// 7 电池容量
AuthData ->chargeTimes = 0; // 8 已充电次数
AuthData ->batteryVol = 0;// 9 当前电池电压
}
static void v_charge_log_pack(U8_T gunNo, S_LOG_DATA *t_chgRcd,evs_event_tradeInfo* tradeInfo_data) //订单信息
{
U16_T ctime;
Comm_Time st_CurTime; //当前时间
U8_T i;
S_FEE_MODEL s_fee_model;
v_bs_save_fee_data(0,&s_fee_model); //获取费率信息
memset(tradeInfo_data , 0 ,sizeof(evs_event_tradeInfo));
if(strlen((char *)t_chgRcd->u8_vinCode) == 0)
memcpy(t_chgRcd->u8_vinCode , "00000000000000000",17);
tradeInfo_data->gunNo = gunNo + 1;
memcpy(tradeInfo_data->preTradeNo,&t_chgRcd->u8_preTradeNo[0],EVS_MAX_TRADE_LEN);
memcpy(tradeInfo_data->tradeNo,&t_chgRcd->u8_tradeNo[0],EVS_MAX_TRADE_LEN);
memcpy(tradeInfo_data->vinCode,t_chgRcd->u8_vinCode,17);
tradeInfo_data->vinCode[17] = '\0';
Plat_Comm_LOG("订单VIN=%s\n",tradeInfo_data->vinCode);
tradeInfo_data->timeDivType = 10; //计费
tradeInfo_data->startType = t_chgRcd->e_sdk_startType;
tradeInfo_data->chargeStartTime = xDate2Seconds(&t_chgRcd->StartChargeTime);
if(t_chgRcd->EndChargeTime.iYear == 0) //停止充电时间为0 获取当前时间
GetCurrentTime(&t_chgRcd->EndChargeTime);
tradeInfo_data->chargeEndTime = xDate2Seconds(&t_chgRcd->EndChargeTime);
tradeInfo_data->startSoc = t_chgRcd->u8_startSoc;
tradeInfo_data->endSoc = t_chgRcd->u8_endSoc;
//tradeInfo_data->reason = t_chgRcd->u32_stopReason;
if(tradeInfo_data->reason == 0) //若订单停止原因为0,将停止原因初始化为后台停止,防止向后台上传停机原因为0.
{
tradeInfo_data->reason = E_NORMAL_1002;
}
if(t_chgRcd->e_stop_reason[0] != 0) //判定终端上送停机原因,若为0,不将其赋值到订单停机原因中
{
tradeInfo_data->reason = t_chgRcd->e_stop_reason[0];
}
Plat_Comm_LOG("%d枪,停止原因=%d\n",tradeInfo_data->gunNo,tradeInfo_data->reason);
printf("%d枪,停机原因:%d\r\n",tradeInfo_data->gunNo,tradeInfo_data->reason);
tradeInfo_data->reason = e_gwsdk_get_log_res(tradeInfo_data->reason); //故障优化
memcpy(tradeInfo_data->feeModelId, &s_fee_model.u8_model_no[0],EVS_MAX_MODEL_ID_LEN);
tradeInfo_data->sumStart = (unsigned int)(t_chgRcd->u64_startKWh);
tradeInfo_data->sumEnd = (unsigned int)(t_chgRcd->u64_endKWh);
tradeInfo_data->totalElect = (unsigned int)(t_chgRcd->u32_used_energy);
tradeInfo_data->sumEnd = tradeInfo_data->sumStart + tradeInfo_data->totalElect; //电表终止值 = 电表起始值+充电电量
//电表问题处理
if(tradeInfo_data->sumStart == 0)
tradeInfo_data->sumStart = tradeInfo_data->sumEnd - tradeInfo_data->totalElect;
if((tradeInfo_data->sumEnd - tradeInfo_data->sumStart > 200 *10000) || (tradeInfo_data->sumStart > tradeInfo_data->sumEnd)) //电量差值大于200度 重新计算
tradeInfo_data->sumEnd = tradeInfo_data->sumStart + tradeInfo_data->totalElect;
//
Plat_Comm_LOG("订单起始电量 = %d, 终止电量 = %d \n", (U32_T)(tradeInfo_data->sumStart),(U32_T)(tradeInfo_data->sumEnd));
tradeInfo_data->totalPowerCost = (unsigned int)(t_chgRcd->u32_used_money );//总电费
tradeInfo_data->totalServCost = (unsigned int)(t_chgRcd->u32_used_service );//总服务费
tradeInfo_data->totalCost = tradeInfo_data->totalPowerCost + tradeInfo_data->totalServCost;//总消费金额
tradeInfo_data->timeNum = s_fee_model.u8_feeCnt; // 46 时段数
for(i=0;i<tradeInfo_data->timeNum;i++)
{
U32_T u32_part_energy;
F32_T f32_rate,f32_sevice;
v_bs_get_fee_part_data(gunNo,i,t_chgRcd,&u32_part_energy,&f32_rate,&f32_sevice); //获取时段电量、电费
tradeInfo_data->partElect[i] = u32_part_energy; //时段电量
tradeInfo_data->chargeFee[i] = (unsigned int)(tradeInfo_data->partElect[i] * f32_rate);//时段电费
tradeInfo_data->serviceFee[i] = (unsigned int)(tradeInfo_data->partElect[i] * f32_sevice); //时段服务费
}
ctime = (t_chgRcd->StartChargeTime.ucHour*60) + t_chgRcd->StartChargeTime.ucMin;
tradeInfo_data->startPoint = ctime / 15 + 1; // 50 起始点标识
//50 60
ctime = t_chgRcd->EndChargeTime.ucHour * 60 + t_chgRcd->EndChargeTime.ucMin;
tradeInfo_data->crossPoints = (96 + (ctime/15) - tradeInfo_data->startPoint+1)%96 +1; // 51 跨越点数
for(i=0;i<tradeInfo_data->crossPoints;i++) //计算跨越点数电量 -
{
tradeInfo_data->pointsElect[i] = t_chgRcd->u32_part_energy[(i+tradeInfo_data->startPoint-1)%96];
}
}
/**
* ************************************************************************
* @brief - 订单结算信息上送
*
* @param[in] flag - 订单来源 0充电实时订单信息 1 掉电订单上送-从铁电存储器读取临时存储订单信息 2flash未上送订单
* @param[in] gunNo - 抢号 0-N
* @param[in] tradeInfo_data - 组帧
*
*
* @author jiankalka
* @date 2025-09-22
* ************************************************************************
*/
void gw_get_log_info(U8_T flag ,U8_T gunNo,evs_event_tradeInfo* tradeInfo_data) //获取订单信息
{
S_LOG_DATA t_log ; //获取充电日志数据
v_bs_get_gun_log_data(gunNo , &t_log);
#if 0
CHARGE_LOG_T t_chgRcd;
CHARGE_LOG_T t_log ; //获取充电日志数据
U8_T result;
if(flag == 1) //掉电上传订单 获取flash内存储的订单数据
{
// memset(&t_chgRcd, 0, sizeof(CHARGE_LOG_T));
// //v_test_get_log_info(&t_chgRcd);
// result = v_gunTmpChgRcd_rd(gunNo,&t_chgRcd);
// t_chgRcd.e_stop_reason[0] = E_FAULT_15040;
// if(result == 0)
// {
// t_chgRcd.e_stop_reason[0] = E_FAULT_13067; //校验不合格的将停止原因赋值为即插即充鉴权失败,即插即充鉴权失败不上送订单
// }
}
else if(flag == 2) //flash订单上送
{
memset(&t_chgRcd, 0, sizeof(CHARGE_LOG_T));
v_log_read_log_record(&t_chgRcd, bs_ctrl_data[0].u16_cmplte_bill_index[0]); //从flash读指定记录到t_chgRcd
}
else
{
v_get_log_data(gunNo,&t_log);
memcpy(&t_chgRcd, &t_log, sizeof(CHARGE_LOG_T));
if(s_bs_task_ctrl.s_gwsdk_ctrl.rsvCharge[gunNo].flag == 1) //预约充电 上传订单 清空预约信息
{
memset(&s_bs_task_ctrl.s_gwsdk_ctrl.rsvCharge[gunNo] , 0, sizeof(S_SDK_RSV_CHARGE));
}
}
#endif
v_charge_log_pack(gunNo , &t_log ,tradeInfo_data);
}
#endif
#if 1 //接收控制
//费率存储
U8_T u8_feeModle_save(evs_service_issue_feeModel *param)
{
U8_T ret = 0;
U8_T i,u8_feeCnt;
U8_T u8_rate_type_cnt = 0,u8_rate_type; //费率类型计数
U16_T j;
U16_T u16_time_start; //起始时间,单位min
U16_T u16_time_end; //结束时间,单位min
U16_T u16_time_cnt; //判断当前有多少时段
U16_T u16_time_startNo; //判断当前从48时段的几号开始
S_FEE_MODEL s_fee_model;
memset(&s_fee_model,0,sizeof(S_FEE_MODEL)); //赋值前先清空
memcpy( s_fee_model.u8_model_no,param->feeModelId,EVS_MAX_MODEL_ID_LEN); //电费计费模型编号
u8_feeCnt = param->timeNum; //费率条数
if(u8_feeCnt > 96)
return ret;
s_fee_model.u8_feeCnt = u8_feeCnt;
/*配置桩费率*/
for(i=0;i<u8_feeCnt;i++)
{
u16_time_start = iCharToInt(param->timeSeg[i]);
if(i != u8_feeCnt-1)
u16_time_end = iCharToInt(param->timeSeg[i+1]);
else
u16_time_end = 24*60;
u16_time_cnt = (u16_time_end - u16_time_start) / 15; //新设计计费模型为15一段
u16_time_startNo = u16_time_start / 15; //当前循环设置的时段对应的96段的存储序号
//计算费率类型 12345 - 原则 金额一样的为一种费率,自费率条数开始 一种金额一种费率类型
u8_rate_type = 0;
for(j=0;j<=u8_rate_type_cnt;j++) //遍历已存储的费率 检查是否
{
if(param->chargeFee[i] == s_fee_model.s_fee_data[j].u32_rate &&
param->serviceFee[i] == s_fee_model.s_fee_data[j].u32_sevice) //电费服务费一致
{
u8_rate_type = j+1;
break;
}
}
if(u8_rate_type == 0) //金额未存储,费率类型加一
{
s_fee_model.s_fee_data[u8_rate_type_cnt].u32_rate = param->chargeFee[i];
s_fee_model.s_fee_data[u8_rate_type_cnt].u32_sevice = param->serviceFee[i];
u8_rate_type = u8_rate_type_cnt + 1; //费率类型 12345
u8_rate_type_cnt += 1; //费率数量 01233
}
for(j=0 ;j<u16_time_cnt ;j++)
{
s_fee_model.u8_fee_type[u16_time_startNo+j] = u8_rate_type;
}
}
v_bs_save_fee_data(1,&s_fee_model); //存储费率信息
Plat_Comm_LOG("费率模型编号=%s\n",param->feeModelId);
Plat_Comm_LOG("费率条数=%d\n",param->timeNum);
for(i=0;i<param->timeNum;i++)
{
Plat_Comm_LOG("%d 开始时间=%d\t电费= %d , 服务费= %d\n",i+1,iCharToInt(param->timeSeg[i]),param->chargeFee[i],param->serviceFee[i]);
}
return 1;
}
U8_T u8_gwsdk_start_charge_ctrl(evs_service_startCharge *param)
{
/*
unsigned char gunNo; // 1 充电枪编号
char preTradeNo[EVS_MAX_TRADE_LEN]; // 2 平台交易流水号
char tradeNo[EVS_MAX_TRADE_LEN]; // 3 设备交易流水号
unsigned char startType; // 4 启动方式
unsigned char chargeMode; // 5 充电模式
E_SDK_CHGMOD_NONE = 0, //不做限制的充电(默认)
E_SDK_CHGMOD_MONEY, //限制金额
E_SDK_CHGMOD_ELE, //限制电量 electricity
E_SDK_CHGMOD_SOC, //限制SOC
E_SDK_CHGMOD_TIME, //限制充电时长
E_SDK_CHGMOD_PWOER, //限制功率
unsigned int limitData; // 6 限制值
unsigned int stopCode; // 7 停机码
unsigned char startMode; // 8 启动模式
unsigned int insertGunTime; // 10 插枪事件时间戳
S_HOST_CHAR_CTRL
U8_T u8_ctrl_flag; //充电控制标志 0无 1控制启动 2控制停止
U16_T u16_ctrl_res; //控制原因 启动时为启动原因 停止时为停止原因;启动原因0 无动作 1离线卡 2在线卡 3后台启动(tcu/积成)\扫码启动 4vin启动 5调试启动
U16_T u16_start_mode; //启动充电限制方式 0 不做限制的充电(默认) 1 限制金额 2 限制电量 electricity 3 限制SOC 4 限制充电时长 5 限制功率
U16_T u16_limit; //限值参数 默认精度 0.1 |
*/
U8_T u8_gunNo ;
U32_T u32_data;
S_BS_CHAR_CTRL s_bs_char_ctrl;
U8_T u8_tradeNo[NUM_64] = {0};
if(param->gunNo <= 0) return 0;
u8_gunNo = param->gunNo - 1;
memset(&s_bs_char_ctrl , 0 ,sizeof(S_BS_CHAR_CTRL));
s_bs_char_ctrl.u16_ctrl_res= CTR_CMD_BS_START; //后台启动
s_bs_char_ctrl.e_start_mode = (param->chargeMode - 10); //启动模式
if(s_bs_char_ctrl.e_start_mode == 1)//限制金额 0.01元
s_bs_char_ctrl.u16_limit = param->limitData; //限制值 默认精度 0.1
else if(s_bs_char_ctrl.e_start_mode == 2)//限制电量 0.1kWh
s_bs_char_ctrl.u16_limit = param->limitData; //限制值
else
s_bs_char_ctrl.u16_limit = param->limitData; //限制值
v_genrt_chgSerialNum_sdk(u8_tradeNo , u8_gunNo);
strncpy((char *)s_bs_char_ctrl.u8_preTradeNo , (char *)param->preTradeNo , EVS_MAX_TRADE_LEN);
strncpy((char *)s_bs_char_ctrl.u8_tradeNo , (char *)u8_tradeNo , EVS_MAX_TRADE_LEN);
v_bs_charge_action_ctrl(u8_gunNo,0, &s_bs_char_ctrl);
u32_data = param->startType;
v_meterlog_set_char_log_info(u8_gunNo,E_METERLOG_SET_LOG_INFO_u32_sdk_startType, &u32_data,NULL); //启动方式 sdk订单上传使用
return 1;
}
U8_T u8_gwsdk_stop_chaege_ctrl(evs_service_stopCharge *param)
{
/*
unsigned char gunNo; // 1 充电枪编号
char preTradeNo[EVS_MAX_TRADE_LEN]; // 2 平台交易流水号
char tradeNo[EVS_MAX_TRADE_LEN]; // 3 设备交易流水号
unsigned char stopReason; // 4 停止原因
*/
U8_T u8_gunNo ;
U16_T u16_data;
S_BS_CHAR_CTRL s_bs_char_ctrl;
if(param->gunNo <= 0) return 0;
u8_gunNo = param->gunNo - 1;
memset(&s_bs_char_ctrl , 0 ,sizeof(S_BS_CHAR_CTRL));
switch(param->stopReason)
{
case 10: //用户主动停止
{
u16_data = E_NORMAL_1009; //APP停止
break;
}
case 11: //余额不足
{
u16_data = E_NORMAL_1012; //账户余额不足
break;
}
case 12: //预付金额消费完毕
{
u16_data = E_NORMAL_1013; //预充金额不足
break;
}
case 13: //平台监测充电异常
{
u16_data = E_NORMAL_1002; //后台停止
break;
}
case 14: //充电枪未在充电中
{
u16_data = E_NORMAL_1002; //后台停止
break;
}
default:
u16_data = E_NORMAL_1002; //后台停止
break;
}
s_bs_char_ctrl.u16_ctrl_res = u16_data;
v_bs_charge_action_ctrl(u8_gunNo,2, &s_bs_char_ctrl);
return 1;
}
#endif
#endif