|
@@ -4,17 +4,21 @@ from scipy import interpolate
|
|
|
import logging
|
|
|
import pandas as pd
|
|
|
|
|
|
+# 充满静置3.398,3.366
|
|
|
+# 放完静置3.18, 3.137
|
|
|
+
|
|
|
# 电压范围3.0 - 3.5
|
|
|
|
|
|
SocCurve = [0.00, 0.05, 0.10, 0.15, 0.20, 0.25, 0.30, 0.35, 0.40, 0.45, 0.50, 0.55, 0.60, 0.65, 0.70, 0.75, 0.80, 0.85,
|
|
|
0.90, 0.95, 1.00]
|
|
|
-DisOcvCurve = [2.8977, 3.1587, 3.2040, 3.2269, 3.2521, 3.2691, 3.2846, 3.2865, 3.2871, 3.2880, 3.2886, 3.2971, 3.3190,
|
|
|
+DisOcvCurve = [3.1370, 3.1887, 3.2040, 3.2269, 3.2521, 3.2691, 3.2846, 3.2865, 3.2871, 3.2880, 3.2886, 3.2971, 3.3190,
|
|
|
3.3277, 3.3277, 3.3280, 3.3286, 3.3289, 3.3296, 3.3311, 3.3795] # 磷酸铁锂
|
|
|
|
|
|
SocLook = interpolate.interp1d(DisOcvCurve, SocCurve, kind='slinear')
|
|
|
-ChgNearFullVol = 3.5 # v
|
|
|
+ChgNearFullVol = 3.43 # v
|
|
|
DisNearFullVol = 3.0 # v
|
|
|
|
|
|
+
|
|
|
logger = logging.getLogger(__file__)
|
|
|
|
|
|
|
|
@@ -40,10 +44,14 @@ def ChgStatus(cur, chg_time, dis_time, shelve_time):
|
|
|
flag = False
|
|
|
if cur > 1:
|
|
|
chg_time += 1
|
|
|
+ dis_time = 0
|
|
|
+ shelve_time = 0
|
|
|
if cur < -1:
|
|
|
dis_time += 1
|
|
|
+ chg_time = 0
|
|
|
+ shelve_time = 0
|
|
|
flag = True
|
|
|
- if cur == 0:
|
|
|
+ if abs(cur) < 0.25:
|
|
|
shelve_time += 1
|
|
|
chg_time = 0
|
|
|
dis_time = 0
|
|
@@ -51,15 +59,15 @@ def ChgStatus(cur, chg_time, dis_time, shelve_time):
|
|
|
|
|
|
|
|
|
# 电芯容量校正
|
|
|
-def CapacityCalculate(soc, soc_zero, cumulative_capacity, t_capacity):
|
|
|
- s = soc - soc_zero
|
|
|
- c = cumulative_capacity - t_capacity
|
|
|
- try:
|
|
|
- capacity = c / s
|
|
|
- except Exception as exc:
|
|
|
- logger.warning(exc)
|
|
|
- capacity = 120
|
|
|
- return capacity
|
|
|
+# def CapacityCalculate(soc, soc_zero, cumulative_capacity, t_capacity):
|
|
|
+# s = soc - soc_zero
|
|
|
+# c = cumulative_capacity - t_capacity
|
|
|
+# try:
|
|
|
+# capacity = c / s
|
|
|
+# except Exception as exc:
|
|
|
+# logger.warning(exc)
|
|
|
+# capacity = 120
|
|
|
+# return capacity
|
|
|
|
|
|
|
|
|
# 累积容量计算
|
|
@@ -69,15 +77,15 @@ def CumulativeCapacity(capacity, cur, deltaTime):
|
|
|
|
|
|
|
|
|
# 电池包容量计算
|
|
|
-def PackCapacityCalculate(soc_arr, capacity):
|
|
|
- pack_capacity = np.min(soc_arr * capacity) + np.min(capacity - soc_arr * capacity)
|
|
|
- return pack_capacity
|
|
|
+# def PackCapacityCalculate(soc_arr, capacity):
|
|
|
+# pack_capacity = np.min(soc_arr * capacity) + np.min(capacity - soc_arr * capacity)
|
|
|
+# return pack_capacity
|
|
|
|
|
|
|
|
|
-# 满电校正
|
|
|
+# 满冲校正
|
|
|
def ChgFullFunc(soc, vol):
|
|
|
for index in range(120):
|
|
|
- if vol[index] > ChgNearFullVol:
|
|
|
+ if vol[index] >= ChgNearFullVol:
|
|
|
soc[index] = 1
|
|
|
return soc
|
|
|
|
|
@@ -85,28 +93,14 @@ def ChgFullFunc(soc, vol):
|
|
|
# 满放校正
|
|
|
def DisFullFunc(soc, vol):
|
|
|
for index in range(120):
|
|
|
- if vol[index] < DisNearFullVol:
|
|
|
+ if vol[index] <= DisNearFullVol:
|
|
|
soc[index] = 0
|
|
|
return soc
|
|
|
|
|
|
|
|
|
-# 电池包soc计算
|
|
|
-def PackSocCalculate(soc_arr, pack_capacity, capacity):
|
|
|
- try:
|
|
|
- pack_soc = np.min(soc_arr * capacity) / pack_capacity
|
|
|
- if pack_soc > 1:
|
|
|
- pack_soc = 1
|
|
|
- if pack_soc < 0:
|
|
|
- pack_soc = 0
|
|
|
- return pack_soc
|
|
|
- except Exception as exc:
|
|
|
- logger.warning(exc)
|
|
|
-
|
|
|
-
|
|
|
SOC_DATA = []
|
|
|
|
|
|
|
|
|
-# 执行函数,最后返回的是dataframe形式,有对应的上传时间和soc,应该要关联设备id,这块没有加
|
|
|
def soc_test(sn, data):
|
|
|
try:
|
|
|
global SOC_DATA
|
|
@@ -125,7 +119,6 @@ def soc_test(sn, data):
|
|
|
shelve_time = ram['shelve_time']
|
|
|
c_capacity = ram['c_capacity']
|
|
|
soc_zero = ram['soc_zero']
|
|
|
-
|
|
|
vol_array = data[
|
|
|
['单体电压1', '单体电压2', '单体电压3', '单体电压4', '单体电压5', '单体电压6', '单体电压7', '单体电压8', '单体电压9', '单体电压10', '单体电压11', '单体电压12',
|
|
|
'单体电压13', '单体电压14', '单体电压15', '单体电压16', '单体电压17', '单体电压18', '单体电压19', '单体电压20', '单体电压21', '单体电压22', '单体电压23',
|
|
@@ -140,15 +133,16 @@ def soc_test(sn, data):
|
|
|
'单体电压111', '单体电压112', '单体电压113', '单体电压114', '单体电压115', '单体电压116', '单体电压117', '单体电压118', '单体电压119',
|
|
|
'单体电压120']].values
|
|
|
vol_array = vol_array.astype(float)
|
|
|
+ vol_array = vol_array / 1000
|
|
|
cur_array = data['总电流[A]'].values
|
|
|
upload_time = data['时间戳'].values
|
|
|
pack_soc_arr = np.zeros(len(cur_array))
|
|
|
- vol_array_zero = vol_array[0] / 1000
|
|
|
- vol_array_zero[vol_array_zero > 3.3795] = 3.37
|
|
|
+ vol_array_zero = vol_array[0]
|
|
|
if ~len(soc_zero):
|
|
|
+ vol_array_zero[vol_array_zero > 3.3795] = 3.37
|
|
|
soc_zero = SocLook(vol_array_zero)
|
|
|
- pack_capacity = PackCapacityCalculate(soc_zero, capacity)
|
|
|
- pack_soc_arr[0] = PackSocCalculate(soc_zero, pack_capacity, capacity)
|
|
|
+
|
|
|
+ pack_soc_arr[0] = np.min(soc_zero)
|
|
|
|
|
|
for index in range(len(data) - 1):
|
|
|
if abs(cur_array[index]) >= 100:
|
|
@@ -165,7 +159,7 @@ def soc_test(sn, data):
|
|
|
# deltaTime = str_to_date(upload_time[index + 1]) - str_to_date(upload_time[index])
|
|
|
deltaTime = float(deltaTime.seconds)
|
|
|
|
|
|
- soc = AhCalculate(soc_zero, cur_array[index], deltaTime, pack_capacity)
|
|
|
+ soc = AhCalculate(soc_zero, cur_array[index], deltaTime, capacity)
|
|
|
|
|
|
chg_time, dis_time, shelve_time, flag = ChgStatus(cur_array[index], chg_time, dis_time, shelve_time)
|
|
|
|
|
@@ -176,18 +170,18 @@ def soc_test(sn, data):
|
|
|
soc = DisFullFunc(soc, vol_array[index])
|
|
|
|
|
|
if shelve_time > 1800:
|
|
|
- if vol_array[index][0] > 3.328 or vol_array[index][0] < 3.285:
|
|
|
+ if np.max(vol_array[index]) > 3.328 or np.min(vol_array[index]) < 3.285:
|
|
|
+ vol_array[index][vol_array[index] < 3.1370] = 3.1370
|
|
|
soc_zero = SocLook(vol_array[index])
|
|
|
|
|
|
if flag:
|
|
|
- if np.min(vol_array[index]) >= 3.0:
|
|
|
+ if np.min(vol_array[index]) >= 3.0 and np.max(vol_array[index]) <= 3.5:
|
|
|
c_capacity = CumulativeCapacity(c_capacity, cur_array[index], deltaTime)
|
|
|
|
|
|
if not flag and c_capacity != 0:
|
|
|
capacity = c_capacity
|
|
|
|
|
|
- pack_soc = PackSocCalculate(soc, pack_capacity, capacity)
|
|
|
- pack_soc_arr[index + 1] = pack_soc
|
|
|
+ pack_soc_arr[index + 1] = np.min(soc)
|
|
|
ram_result = {'sn': sn, 'capacity': capacity, 'chg_time': chg_time, 'dis_time': dis_time, 'shelve_time': shelve_time,
|
|
|
'soc_zero': soc_zero, 'c_capacity': c_capacity}
|
|
|
sn_list = []
|
|
@@ -208,8 +202,6 @@ def soc_test(sn, data):
|
|
|
pack_soc_arr = pack_soc_arr * 100
|
|
|
result = {'SN': sn, 'SOC': pack_soc_arr[-1], 'UploadTime': upload_time[-1]}
|
|
|
result = pd.DataFrame(result, index=[0])
|
|
|
- # pack_soc_frame = pd.DataFrame(pack_soc_arr, columns=['SOC'])
|
|
|
- # result = pack_soc_frame.assign(UploadTime=upload_time)
|
|
|
return result
|
|
|
except Exception as exc:
|
|
|
logger.warning(exc)
|