add plot attributes
This commit is contained in:
		| @@ -5,6 +5,26 @@ class EnergySystem: | ||||
|         self.pv = pv_type | ||||
|         self.ess = ess_type | ||||
|         self.grid = grid_type | ||||
|         self.day_generated = [] | ||||
|         self.generated = 0 | ||||
|         self.stored = 0 | ||||
|         self.hour_stored = [] | ||||
|         self.hour_stored_2 = [] | ||||
|         self.afford = True | ||||
|         self.overload_cnt = 0 | ||||
|         self.spring_week_gen = [] | ||||
|         self.summer_week_gen = [] | ||||
|         self.autumn_week_gen = [] | ||||
|         self.winter_week_gen = [] | ||||
|         self.spring_week_soc = [] | ||||
|         self.summer_week_soc = [] | ||||
|         self.autumn_week_soc = [] | ||||
|         self.winter_week_soc = [] | ||||
|         self.granularity = 4 | ||||
|         self.season_step = self.granularity * 24 * 7 * 12 | ||||
|         self.season_start= self.granularity * 24 * 7 * 6 | ||||
|         self.week_length = self.granularity * 24 * 7 | ||||
|          | ||||
|  | ||||
|     # 优先使用PV供电给工厂 - 如果PV输出能满足工厂的需求,则直接供电,多余的电能用来给ESS充电。 | ||||
|     # PV不足时使用ESS补充 - 如果PV输出不足以满足工厂需求,首先从ESS获取所需电量。 | ||||
| @@ -15,11 +35,22 @@ class EnergySystem: | ||||
|             time = row['time'] | ||||
|             sunlight_intensity = row['sunlight'] | ||||
|             factory_demand = row['demand'] | ||||
|             # electricity_price = self.grid.get_price_for_time(time) | ||||
|             electricity_price = row['price'] | ||||
|             # electricity_price = self.grid.get_price_for_time(time) | ||||
|  | ||||
|             if time == '00:00': | ||||
|                 self.day_generated.append(self.generated) | ||||
|                 self.generated = 0 | ||||
|             if time.endswith('14:00'): | ||||
|                 soc = self.ess.storage / self.ess.capacity | ||||
|                 self.hour_stored.append(soc) | ||||
|             if time.endswith('08:00'): | ||||
|                 soc = self.ess.storage / self.ess.capacity | ||||
|                 self.hour_stored_2.append(soc) | ||||
|  | ||||
|             generated_pv_power = self.pv.capacity * sunlight_intensity  # 生成的功率,单位 kW | ||||
|             generated_pv_energy = generated_pv_power * time_interval * self.pv.loss  # 生成的能量,单位 kWh | ||||
|             self.generated += generated_pv_energy | ||||
|             # pv生成的能量如果比工厂的需求要大 | ||||
|             if generated_pv_energy >= factory_demand * time_interval: | ||||
|                 # 剩余的能量(kwh) = pv生成的能量 - 工厂需求的功率 * 时间间隔  | ||||
| @@ -34,29 +65,71 @@ class EnergySystem: | ||||
|                     sell_income = sold_to_grid * self.grid.sell_price | ||||
|                     total_benefit += sell_income | ||||
|                 # 节省的能量 = 工厂需求的能量 * 时间段 | ||||
|                 total_energy = factory_demand * time_interval | ||||
|                 # total_energy = factory_demand * time_interval | ||||
|                 saved_energy = factory_demand * time_interval | ||||
|             # pv比工厂的需求小 | ||||
|             else: | ||||
|                 # 从ess中需要的电量 = 工厂需要的电量 - pv中的电量 | ||||
|                 needed_from_ess = factory_demand * time_interval - generated_pv_energy | ||||
|                 # 如果ess中村的电量比需要的多 | ||||
|                 if self.ess.storage >= needed_from_ess: | ||||
|                 # 如果ess中存的电量比需要的多 | ||||
|                 if self.ess.storage * self.ess.loss >= needed_from_ess: | ||||
|                     # 取出电量 | ||||
|                     discharging_power = min(self.ess.discharge_power * time_interval, needed_from_ess) | ||||
|                     if self.ess.discharge_power * time_interval * self.ess.loss < needed_from_ess: | ||||
|                         discharging_power = self.ess.discharge_power * time_interval  | ||||
|                     else: | ||||
|                         discharging_power = needed_from_ess / self.ess.loss | ||||
|  | ||||
|                     self.ess.storage -= discharging_power | ||||
|                     # 生下来的能量 = pv的能量 + 放出来的能量 | ||||
|                     total_energy = generated_pv_energy + discharging_power | ||||
|                     # 节省下来的能量 = pv的能量 + 放出来的能量 | ||||
|                     saved_energy = generated_pv_energy + discharging_power * self.ess.loss | ||||
|                 else: | ||||
|                     total_energy = generated_pv_energy + self.ess.storage | ||||
|                     # 如果存的电量不够 | ||||
|                     # 需要把ess中的所有电量释放出来 | ||||
|                     if self.grid.capacity * time_interval + generated_pv_energy + self.ess.storage * self.ess.loss < factory_demand * time_interval: | ||||
|                         self.afford = False | ||||
|                         self.overload_cnt+=1 | ||||
|                         log = f"index: {index}, time: {time}, SoC:{self.ess.storage / self.ess.capacity}%, storage: {self.ess.storage}, pv_gen:{generated_pv_power}, power_demand: {factory_demand}, overload_cnt:{self.overload_cnt}, day:{int(index/96) + 1}" | ||||
|                         # with open(f'plots/summary/ess-{self.ess.capacity}-pv-{self.pv.capacity}', 'a') as f: | ||||
|                             # f.write(log) | ||||
|                         # print(log) | ||||
|                     saved_energy = generated_pv_energy + self.ess.storage * self.ess.loss | ||||
|                     self.ess.storage = 0 | ||||
|                     needed_from_grid = factory_demand * time_interval - total_energy | ||||
|                     net_grid = min(self.grid.capacity * time_interval, needed_from_grid) *  self.grid.loss | ||||
|                     needed_from_grid = factory_demand * time_interval - saved_energy | ||||
|                     net_grid = min(self.grid.capacity * time_interval, needed_from_grid) * self.grid.loss | ||||
|                     # grid_energy += net_grid | ||||
|                     # total_energy += net_grid | ||||
|             # print(total_energy) | ||||
|             # 工厂需求量-总能量 | ||||
|             # unmet_demand = max(0, factory_demand * time_interval - total_energy) | ||||
|             # benefit = (total_energy - unmet_demand) * electricity_price | ||||
|             benefit = (total_energy) * electricity_price | ||||
|             total_benefit += benefit | ||||
|             benefit = (saved_energy) * electricity_price | ||||
|             cost = net_grid * electricity_price | ||||
|             # print(f"time:{time} benefit: {benefit}, cost: {cost}") | ||||
|             total_benefit += benefit - cost | ||||
|             # spring | ||||
|             week_start = self.season_start | ||||
|             week_end = self.week_length + week_start | ||||
|             # print(index) | ||||
|             # print(week_start, week_end) | ||||
|             if index in range(week_start, week_end): | ||||
|                 self.spring_week_gen.append(generated_pv_power) | ||||
|                 self.spring_week_soc.append(self.ess.storage / self.ess.capacity) | ||||
|             # summer | ||||
|             week_start += self.season_step | ||||
|             week_end += self.season_step | ||||
|             if index in range(week_start, week_end): | ||||
|                 self.summer_week_gen.append(generated_pv_power) | ||||
|                 self.summer_week_soc.append(self.ess.storage / self.ess.capacity) | ||||
|             # autumn | ||||
|             week_start += self.season_step | ||||
|             week_end += self.season_step | ||||
|             if index in range(week_start, week_end): | ||||
|                 self.autumn_week_gen.append(generated_pv_power) | ||||
|                 self.autumn_week_soc.append(self.ess.storage / self.ess.capacity) | ||||
|             week_start += self.season_step | ||||
|             week_end += self.season_step | ||||
|             if index in range(week_start, week_end): | ||||
|                 self.winter_week_gen.append(generated_pv_power) | ||||
|                 self.winter_week_soc.append(self.ess.storage / self.ess.capacity) | ||||
|  | ||||
|         return total_benefit | ||||
| @@ -5,6 +5,10 @@ class pv_config: | ||||
|         self.cost_per_kW = cost_per_kW | ||||
|         self.lifetime = lifetime | ||||
|         self.loss = loss | ||||
|     def get_cost(self): | ||||
|         return self.capacity * self.cost_per_kW | ||||
|     def get_cost_per_year(self): | ||||
|         return self.capacity * self.cost_per_kW / self.lifetime | ||||
| class ess_config: | ||||
|     def __init__(self, capacity, cost_per_kW, lifetime, loss, charge_power, discharge_power): | ||||
|         self.capacity = capacity | ||||
| @@ -14,6 +18,10 @@ class ess_config: | ||||
|         self.storage = 0 | ||||
|         self.charge_power = charge_power | ||||
|         self.discharge_power = discharge_power | ||||
|     def get_cost(self): | ||||
|         return self.capacity * self.cost_per_kW | ||||
|     def get_cost_per_year(self): | ||||
|         return self.capacity * self.cost_per_kW / self.lifetime | ||||
|  | ||||
| class grid_config: | ||||
|     def __init__(self, capacity, grid_loss, sell_price): | ||||
|   | ||||
		Reference in New Issue
	
	Block a user