simple-pv-simulator/EnergySystem.py
2024-05-03 15:36:02 +02:00

54 lines
3.4 KiB
Python
Raw 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.

from config import pv_config, ess_config, grid_config
import pandas as pd
class EnergySystem:
def __init__(self, pv_type: pv_config, ess_type: ess_config, grid_type: grid_config):
self.pv = pv_type
self.ess = ess_type
self.grid = grid_type
# 优先使用PV供电给工厂 - 如果PV输出能满足工厂的需求则直接供电多余的电能用来给ESS充电。
# PV不足时使用ESS补充 - 如果PV输出不足以满足工厂需求首先从ESS获取所需电量。
# 如果ESS也不足以满足需求再从电网获取 - 当ESS中的存储电量也不足以补充时再从电网购买剩余所需电量。
def simulate(self, data, time_interval):
total_benefit = 0
for index, row in data.iterrows():
time = row['time']
sunlight_intensity = row['sunlight']
factory_demand = row['demand']
electricity_price = self.grid.get_price_for_time(time)
generated_pv_power = self.pv.capacity * sunlight_intensity # 生成的功率,单位 kW
generated_pv_energy = generated_pv_power * time_interval * self.pv.loss # 生成的能量,单位 kWh
if generated_pv_energy >= factory_demand * time_interval:
# 剩余的能量(kwh) = pv生成的能量 - 工厂需求的功率 * 时间间隔
surplus_energy = generated_pv_energy - factory_demand * time_interval
# 要充到ess中的能量 = min(剩余的能量,ess的充电功率*时间间隔(ess在时间间隔内能充进的电量),ess的容量-ess储存的能量(ess中能冲进去的电量))
charge_to_ess = min(surplus_energy, self.ess.charge_power * time_interval, self.ess.capacity - self.ess.storage)
self.ess.storage += charge_to_ess
surplus_after_ess = surplus_energy - charge_to_ess
# 如果还有电量盈余,且pv功率大于ess的充电功率+工厂的需求功率则准备卖电
if surplus_after_ess > 0 and generated_pv_power > self.ess.charge_power + factory_demand:
sold_to_grid = surplus_after_ess
sell_income = sold_to_grid * self.grid.sell_price
total_benefit += sell_income
# 节省的能量 = 工厂需求的能量 * 时间段
total_energy = factory_demand * time_interval
else:
needed_from_ess = factory_demand * time_interval - generated_pv_energy
if self.ess.storage >= needed_from_ess:
discharging_power = min(self.ess.discharge_power * time_interval, needed_from_ess)
self.ess.storage -= discharging_power
total_energy = generated_pv_energy + discharging_power
else:
total_energy = generated_pv_energy + self.ess.storage
self.ess.storage = 0
needed_from_grid = factory_demand * time_interval - total_energy
net_grid = min(self.grid.capacity * time_interval, needed_from_grid) * (1 - self.grid.loss)
total_energy += net_grid
print(total_energy)
unmet_demand = max(0, factory_demand * time_interval - total_energy)
benefit = (total_energy - unmet_demand) * electricity_price
total_benefit += benefit
return total_benefit