9ceb218f80
Co-authored-by: Cursor <cursoragent@cursor.com>
1062 lines
44 KiB
C
1062 lines
44 KiB
C
#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; //24:00变成00:00
|
||
}
|
||
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无经纬度坐标数值,11GPS,12北斗,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串口,13NFC,14USB,15固件,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=%d,uGunStatus =%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
|