add plot attributes
This commit is contained in:
		| @@ -5,6 +5,26 @@ class EnergySystem: | |||||||
|         self.pv = pv_type |         self.pv = pv_type | ||||||
|         self.ess = ess_type |         self.ess = ess_type | ||||||
|         self.grid = grid_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供电给工厂 - 如果PV输出能满足工厂的需求,则直接供电,多余的电能用来给ESS充电。 | ||||||
|     # PV不足时使用ESS补充 - 如果PV输出不足以满足工厂需求,首先从ESS获取所需电量。 |     # PV不足时使用ESS补充 - 如果PV输出不足以满足工厂需求,首先从ESS获取所需电量。 | ||||||
| @@ -15,11 +35,22 @@ class EnergySystem: | |||||||
|             time = row['time'] |             time = row['time'] | ||||||
|             sunlight_intensity = row['sunlight'] |             sunlight_intensity = row['sunlight'] | ||||||
|             factory_demand = row['demand'] |             factory_demand = row['demand'] | ||||||
|             # electricity_price = self.grid.get_price_for_time(time) |  | ||||||
|             electricity_price = row['price'] |             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_power = self.pv.capacity * sunlight_intensity  # 生成的功率,单位 kW | ||||||
|             generated_pv_energy = generated_pv_power * time_interval * self.pv.loss  # 生成的能量,单位 kWh |             generated_pv_energy = generated_pv_power * time_interval * self.pv.loss  # 生成的能量,单位 kWh | ||||||
|  |             self.generated += generated_pv_energy | ||||||
|             # pv生成的能量如果比工厂的需求要大 |             # pv生成的能量如果比工厂的需求要大 | ||||||
|             if generated_pv_energy >= factory_demand * time_interval: |             if generated_pv_energy >= factory_demand * time_interval: | ||||||
|                 # 剩余的能量(kwh) = pv生成的能量 - 工厂需求的功率 * 时间间隔  |                 # 剩余的能量(kwh) = pv生成的能量 - 工厂需求的功率 * 时间间隔  | ||||||
| @@ -34,29 +65,71 @@ class EnergySystem: | |||||||
|                     sell_income = sold_to_grid * self.grid.sell_price |                     sell_income = sold_to_grid * self.grid.sell_price | ||||||
|                     total_benefit += sell_income |                     total_benefit += sell_income | ||||||
|                 # 节省的能量 = 工厂需求的能量 * 时间段 |                 # 节省的能量 = 工厂需求的能量 * 时间段 | ||||||
|                 total_energy = factory_demand * time_interval |                 # total_energy = factory_demand * time_interval | ||||||
|  |                 saved_energy = factory_demand * time_interval | ||||||
|             # pv比工厂的需求小 |             # pv比工厂的需求小 | ||||||
|             else: |             else: | ||||||
|                 # 从ess中需要的电量 = 工厂需要的电量 - pv中的电量 |                 # 从ess中需要的电量 = 工厂需要的电量 - pv中的电量 | ||||||
|                 needed_from_ess = factory_demand * time_interval - generated_pv_energy |                 needed_from_ess = factory_demand * time_interval - generated_pv_energy | ||||||
|                 # 如果ess中村的电量比需要的多 |                 # 如果ess中存的电量比需要的多 | ||||||
|                 if self.ess.storage >= needed_from_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: | ||||||
|                     self.ess.storage -= discharging_power |                         discharging_power = self.ess.discharge_power * time_interval  | ||||||
|                     # 生下来的能量 = pv的能量 + 放出来的能量 |  | ||||||
|                     total_energy = generated_pv_energy + discharging_power |  | ||||||
|                     else: |                     else: | ||||||
|                     total_energy = generated_pv_energy + self.ess.storage |                         discharging_power = needed_from_ess / self.ess.loss | ||||||
|  |  | ||||||
|  |                     self.ess.storage -= discharging_power | ||||||
|  |                     # 节省下来的能量 = pv的能量 + 放出来的能量 | ||||||
|  |                     saved_energy = generated_pv_energy + discharging_power * self.ess.loss | ||||||
|  |                 else: | ||||||
|  |                     # 如果存的电量不够 | ||||||
|  |                     # 需要把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 |                     self.ess.storage = 0 | ||||||
|                     needed_from_grid = factory_demand * time_interval - total_energy |                     needed_from_grid = factory_demand * time_interval - saved_energy | ||||||
|                     net_grid = min(self.grid.capacity * time_interval, needed_from_grid) * self.grid.loss |                     net_grid = min(self.grid.capacity * time_interval, needed_from_grid) * self.grid.loss | ||||||
|  |                     # grid_energy += net_grid | ||||||
|                     # total_energy += net_grid |                     # total_energy += net_grid | ||||||
|             # print(total_energy) |             # print(total_energy) | ||||||
|             # 工厂需求量-总能量 |             # 工厂需求量-总能量 | ||||||
|             # unmet_demand = max(0, factory_demand * time_interval - total_energy) |             # unmet_demand = max(0, factory_demand * time_interval - total_energy) | ||||||
|             # benefit = (total_energy - unmet_demand) * electricity_price |             # benefit = (total_energy - unmet_demand) * electricity_price | ||||||
|             benefit = (total_energy) * electricity_price |             benefit = (saved_energy) * electricity_price | ||||||
|             total_benefit += benefit |             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 |         return total_benefit | ||||||
| @@ -5,6 +5,10 @@ class pv_config: | |||||||
|         self.cost_per_kW = cost_per_kW |         self.cost_per_kW = cost_per_kW | ||||||
|         self.lifetime = lifetime |         self.lifetime = lifetime | ||||||
|         self.loss = loss |         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: | class ess_config: | ||||||
|     def __init__(self, capacity, cost_per_kW, lifetime, loss, charge_power, discharge_power): |     def __init__(self, capacity, cost_per_kW, lifetime, loss, charge_power, discharge_power): | ||||||
|         self.capacity = capacity |         self.capacity = capacity | ||||||
| @@ -14,6 +18,10 @@ class ess_config: | |||||||
|         self.storage = 0 |         self.storage = 0 | ||||||
|         self.charge_power = charge_power |         self.charge_power = charge_power | ||||||
|         self.discharge_power = discharge_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: | class grid_config: | ||||||
|     def __init__(self, capacity, grid_loss, sell_price): |     def __init__(self, capacity, grid_loss, sell_price): | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user