def create_case14_PV_Wind_Storage(): """ creates IEEE 14 node network fitted for providing cranking power to islanded areas i.e. storage units are treated as slack nodes Return ------ pp IEEE 14 node network """ net = nw.case14() for gen in net.gen.index: net["gen"].drop(gen, inplace=True) net["shunt"].drop(0, inplace=True) pp.create_storage(net, 2, p_mw=-10, max_e_mwh=10, soc_percent=1) pp.create_gen(net, 2, p_mw=0, slack=True, type="bat") pp.create_storage(net, 12, p_mw=-10, max_e_mwh=10, soc_percent=1) pp.create_gen(net, 12, p_mw=0, slack=True, type="bat") pp.create_sgen(net, 7, p_mw=200, type="solar") pp.create_sgen(net, 10, p_mw=200, type="solar") pp.create_sgen(net, 11, p_mw=200, type="wind") pp.create_sgen(net, 13, p_mw=200, type="wind") return net
def test_storage_opt(): net = nw.case5() pp.create_storage(net, 2, p_mw=1., max_e_mwh=.2, soc_percent=100., q_mvar=1.) pp.create_storage(net, 3, p_mw=1., max_e_mwh=.3, soc_percent=100., q_mvar=1.) # optimize for 24 time steps. At the end the SOC is 0% storage_results = pp.runpm_storage_opf(net, n_timesteps=24) assert np.allclose(storage_results[0].loc[22, "soc_mwh"], 0.004960, rtol=1e-4, atol=1e-4) assert np.allclose(storage_results[0].loc[23, "soc_mwh"], 0.) assert np.allclose(storage_results[1].loc[22, "soc_percent"], 29.998074, rtol=1e-4, atol=1e-4) assert np.allclose(storage_results[1].loc[23, "soc_mwh"], 0.)
def add_battery(net, bus_number, p_init, energy_capacity, init_soc=0.5, max_p=50, min_p=-50, eff=1.0, capital_cost=0, min_e=0.): """Change the network by adding a battery / storage unit. This function creates a storage element in net, and adds two non-standard columns: efficiency and capital cost. Parameters ---------- net: class The pandapower network model bus_number: int Where the battery will be added p_init: float The power draw / input of the battery on initialization init_soc: float The state of charge max_p: float The max rate that power can be drawn by the battery min_p: float The max rate that power can be pulled from the battery (negative). eff: float The efficiency capital_cost: float The capital cost of the battery min_e: float The minimum energy in the battery """ pp.create_storage(net, bus_number, p_init, energy_capacity, soc_percent=init_soc, max_p_kw=max_p, min_p_kw=min_p, min_e_kwh=min_e) idx = net.storage.index[-1] net.storage.loc[idx, 'eff'] = eff net.storage.loc[idx, 'cap_cost'] = capital_cost
def test_storage_pf(): net = pp.create_empty_network() b1 = pp.create_bus(net, vn_kv=0.4) b2 = pp.create_bus(net, vn_kv=0.4) pp.create_line(net, b1, b2, length_km=5, std_type="NAYY 4x50 SE") pp.create_ext_grid(net, b2) pp.create_load(net, b1, p_kw=10) pp.create_sgen(net, b1, p_kw=-10) # test generator behaviour pp.create_storage(net, b1, p_kw=-10, max_e_kwh=10) pp.create_sgen(net, b1, p_kw=-10, in_service=False) res_gen_beh = runpp_with_consistency_checks(net) res_ll_stor = net["res_line"].loading_percent.iloc[0] net["storage"].in_service.iloc[0] = False net["sgen"].in_service.iloc[1] = True runpp_with_consistency_checks(net) res_ll_sgen = net["res_line"].loading_percent.iloc[0] assert np.isclose(res_ll_stor, res_ll_sgen) # test load behaviour pp.create_load(net, b1, p_kw=10, in_service=False) net["storage"].in_service.iloc[0] = True net["storage"].p_kw.iloc[0] = 10 net["sgen"].in_service.iloc[1] = False res_load_beh = runpp_with_consistency_checks(net) res_ll_stor = net["res_line"].loading_percent.iloc[0] net["storage"].in_service.iloc[0] = False net["load"].in_service.iloc[1] = True runpp_with_consistency_checks(net) res_ll_load = net["res_line"].loading_percent.iloc[0] assert np.isclose(res_ll_stor, res_ll_load) assert res_gen_beh and res_load_beh
def create_4GS_PV_Wind_Storage(): """ creates a simple 4 node network fitted for providing cranking power to islanded areas i.e. storage units are treated as slack nodes Return ------- 4 node pp network """ net = nw.case4gs() net["gen"].drop(0, inplace=True) pp.create_storage(net, 1, p_mw=-50, max_e_mwh=10) pp.create_gen(net, 1, p_mw=0, slack=True, type="bat") pp.create_sgen(net, 2, p_mw=500, type="solar") pp.create_sgen(net, 3, p_mw=500, type="wind") net.load.p_mw = 0.5 * net.load.p_mw return net
def add_storage_device(self, area): soc_ratio = convert_percent_to_ratio(area.strategy.initial_soc) battery_capacity_mwh = convert_kilo_to_mega( area.strategy.state.capacity) min_energy_mwh = area.strategy.state.min_allowed_soc_ratio * battery_capacity_mwh return pp.create_storage(self.network, bus=area.parent.bus, p_mw=battery_capacity_mwh, max_e_mwh=battery_capacity_mwh, min_e_mwh=min_energy_mwh, soc_percent=soc_ratio, name=area.name)
def test_storage_pf(): net = pp.create_empty_network() b1 = pp.create_bus(net, vn_kv=0.4) b2 = pp.create_bus(net, vn_kv=0.4) pp.create_line(net, b1, b2, length_km=5, std_type="NAYY 4x50 SE") pp.create_ext_grid(net, b2) pp.create_load(net, b1, p_kw=10) pp.create_sgen(net, b1, p_kw=-10) # test generator behaviour pp.create_storage(net, b1, p_kw=-10, max_e_kwh=10) res_gen_beh = runpp_with_consistency_checks(net) # test load behaviour net["storage"].p_kw.iloc[0] = 10 res_load_beh = runpp_with_consistency_checks(net) assert res_gen_beh and res_load_beh
def create_case39_PV_Wind_Storage(): """ creates IEEE 39 bus test case a pp network. Return ------ pp IEEE 39 nide test case """ net = nw.case39() for gen in net.gen.index: net["gen"].drop(gen, inplace=True) pp.create_storage(net, 1, p_mw=-20, max_e_mwh=20, soc_percent=1) pp.create_storage(net, 21, p_mw=-20, max_e_mwh=40, soc_percent=1) pp.create_storage(net, 12, p_mw=-10, max_e_mwh=20, soc_percent=1) pp.create_storage(net, 32, p_mw=-20, max_e_mwh=40, soc_percent=1) pp.create_gen(net, 1, p_mw=0, slack=True, type="bat") pp.create_gen(net, 21, p_mw=0, slack=True, type="bat") pp.create_gen(net, 12, p_mw=0, slack=True, type="bat") pp.create_gen(net, 32, p_mw=0, slack=True, type="bat") pp.create_sgen(net, 29, p_mw=250, type="solar") pp.create_sgen(net, 31, p_mw=100, type="solar") pp.create_sgen(net, 33, p_mw=50, type="wind") pp.create_sgen(net, 34, p_mw=500, type="solar") pp.create_sgen(net, 35, p_mw=100, type="solar") pp.create_sgen(net, 36, p_mw=250, type="solar") pp.create_sgen(net, 37, p_mw=300, type="wind") pp.create_sgen(net, 38, p_mw=100, type="wind") pp.create_sgen(net, 16, p_mw=200, type="wind") pp.create_sgen(net, 4, p_mw=250, type="solar") # decrease load size to match size of sgen capacity net.load.p_mw = .2 * net.load.p_mw return net
def createnet(include_load_shedding=False, include_bat=False): GENDATA,DEMDATA,LINDATA,STODATA = ld.loadsystemdata() NUMNODES = 3 numgen = len(GENDATA) numlin = len(LINDATA) numdem = len(DEMDATA) numsto = len(STODATA) # ========================================================================= # CREATE EMPTY NET # ========================================================================= net = pp.create_empty_network(f_hz=50.0, sn_mva=100) # ========================================================================= # CREATE BUSES # ========================================================================= for i in range(numgen): pp.create_bus(net,vn_kv=220, index = i, max_vm_pu=1.05, min_vm_pu=0.95) cntidx = NUMNODES j=-1 for i in range(numgen): barcon = GENDATA[i][1] if(barcon>j): j=j+1 pp.create_bus(net, index = cntidx+j, vn_kv=13.8, max_vm_pu=1.05, min_vm_pu=0.95) # ========================================================================= # CREATE GENERATORS # ========================================================================= j=-1 indexgen=0 for i in range(numgen): pp.create_gen(net, vm_pu=1.02, index=indexgen, bus=GENDATA[i][1], p_mw = 0, sn_mva = GENDATA[i][13], max_p_mw = GENDATA[i][9], min_p_mw = GENDATA[i][10],max_q_mvar=GENDATA[i][11], min_q_mvar=GENDATA[i][12], controllable=True) indexgen = indexgen + 1 #create trafos barcon = GENDATA[i][1] if(barcon>j): j=j+1 pp.create_transformer(net, hv_bus=GENDATA[i][1], lv_bus=cntidx+j, std_type="500 MVA 220/13.8 kV") # ========================================================================= # CREATE LINES # ========================================================================= for i in range(numlin): fmax = LINDATA[i][1]/(3**0.5*220) ltype = {'typ'+str(i):{"r_ohm_per_km": LINDATA[i][5], "x_ohm_per_km": LINDATA[i][4], "c_nf_per_km": 10, "max_i_ka": fmax, "type": "ol", "qmm2":490, "alpha":4.03e-3}} pp.create_std_types(net,data=ltype,element='line') pp.create_line(net, from_bus=LINDATA[i][2], to_bus=LINDATA[i][3], length_km=LINDATA[i][6], std_type="typ"+str(i)) # ========================================================================= # CREATE LOADS # ========================================================================= for i in range(numdem): pp.create_load(net, index=i, bus=DEMDATA[i][0], p_mw = DEMDATA[i][1], q_mvar=DEMDATA[i][2], max_p_mw = DEMDATA[i][1], min_p_mw=DEMDATA[i][1], max_q_mvar = DEMDATA[i][2], min_q_mvar=DEMDATA[i][5], controllable = include_load_shedding) pp.create_poly_cost(net,i,'load',cp1_eur_per_mw=DEMDATA[i][3]) # ========================================================================= # CREATE STORAGE # ========================================================================= for i in range(numsto): pp.create_storage(net, index=i, bus=NUMNODES + i, p_mw = 0, q_mvar=0, max_e_mwh=100000, max_p_mw = STODATA[i][7], min_p_mw=STODATA[i][8], max_q_mvar=STODATA[i][9], min_q_mvar= STODATA[i][10], in_service=include_bat, controllable=include_bat) pp.create_poly_cost(net,i,'storage',cp1_eur_per_mw=STODATA[i][2]) return net
def def_EV_QReg(net, bus, df, pers): ev = pp.create_storage(net, bus, p_mw = 0, max_e_mwh = pers.cap_bat, name = "ev bus"+str(bus), soc_percent=0.5) ds = pt.DFData(df) EVQRegControl(net, gid = ev, data_source=ds, efficiency = pers.efficiency)
def create_cigre_network_lv(): """ Create the CIGRE LV Grid from final Report of Task Force C6.04.02: "Benchmark Systems for Network Integration of Renewable and Distributed Energy Resources”, 2014. OUTPUT: **net** - The pandapower format network. """ net_cigre_lv = pp.create_empty_network() # Linedata # UG1 line_data = {'c_nf_per_km': 0.0, 'r_ohm_per_km': 0.162, 'x_ohm_per_km': 0.0832, 'max_i_ka': 1.0, 'type': 'cs'} pp.create_std_type(net_cigre_lv, line_data, name='UG1', element='line') # UG2 line_data = {'c_nf_per_km': 0.0, 'r_ohm_per_km': 0.2647, 'x_ohm_per_km': 0.0823, 'max_i_ka': 1.0, 'type': 'cs'} pp.create_std_type(net_cigre_lv, line_data, name='UG2', element='line') # UG3 line_data = {'c_nf_per_km': 0.0, 'r_ohm_per_km': 0.822, 'x_ohm_per_km': 0.0847, 'max_i_ka': 1.0, 'type': 'cs'} pp.create_std_type(net_cigre_lv, line_data, name='UG3', element='line') # OH1 line_data = {'c_nf_per_km': 0.0, 'r_ohm_per_km': 0.4917, 'x_ohm_per_km': 0.2847, 'max_i_ka': 1.0, 'type': 'ol'} pp.create_std_type(net_cigre_lv, line_data, name='OH1', element='line') # OH2 line_data = {'c_nf_per_km': 0.0, 'r_ohm_per_km': 1.3207, 'x_ohm_per_km': 0.321, 'max_i_ka': 1.0, 'type': 'ol'} pp.create_std_type(net_cigre_lv, line_data, name='OH2', element='line') # OH3 line_data = {'c_nf_per_km': 0.0, 'r_ohm_per_km': 2.0167, 'x_ohm_per_km': 0.3343, 'max_i_ka': 1.0, 'type': 'ol'} pp.create_std_type(net_cigre_lv, line_data, name='OH3', element='line') # Busses bus0 = pp.create_bus(net_cigre_lv, name='Bus 0', vn_kv=20.0, type='b', zone='CIGRE_LV') busR0 = pp.create_bus(net_cigre_lv, name='Bus R0', vn_kv=20.0, type='b', zone='CIGRE_LV') busR1 = pp.create_bus(net_cigre_lv, name='Bus R1', vn_kv=0.4, type='b', zone='CIGRE_LV') busR2 = pp.create_bus(net_cigre_lv, name='Bus R2', vn_kv=0.4, type='m', zone='CIGRE_LV') busR3 = pp.create_bus(net_cigre_lv, name='Bus R3', vn_kv=0.4, type='m', zone='CIGRE_LV') busR4 = pp.create_bus(net_cigre_lv, name='Bus R4', vn_kv=0.4, type='m', zone='CIGRE_LV') busR5 = pp.create_bus(net_cigre_lv, name='Bus R5', vn_kv=0.4, type='m', zone='CIGRE_LV') busR6 = pp.create_bus(net_cigre_lv, name='Bus R6', vn_kv=0.4, type='m', zone='CIGRE_LV') busR7 = pp.create_bus(net_cigre_lv, name='Bus R7', vn_kv=0.4, type='m', zone='CIGRE_LV') busR8 = pp.create_bus(net_cigre_lv, name='Bus R8', vn_kv=0.4, type='m', zone='CIGRE_LV') busR9 = pp.create_bus(net_cigre_lv, name='Bus R9', vn_kv=0.4, type='m', zone='CIGRE_LV') busR10 = pp.create_bus(net_cigre_lv, name='Bus R10', vn_kv=0.4, type='m', zone='CIGRE_LV') busR11 = pp.create_bus(net_cigre_lv, name='Bus R11', vn_kv=0.4, type='m', zone='CIGRE_LV') busR12 = pp.create_bus(net_cigre_lv, name='Bus R12', vn_kv=0.4, type='m', zone='CIGRE_LV') busR13 = pp.create_bus(net_cigre_lv, name='Bus R13', vn_kv=0.4, type='m', zone='CIGRE_LV') busR14 = pp.create_bus(net_cigre_lv, name='Bus R14', vn_kv=0.4, type='m', zone='CIGRE_LV') busR15 = pp.create_bus(net_cigre_lv, name='Bus R15', vn_kv=0.4, type='m', zone='CIGRE_LV') busR16 = pp.create_bus(net_cigre_lv, name='Bus R16', vn_kv=0.4, type='m', zone='CIGRE_LV') busR17 = pp.create_bus(net_cigre_lv, name='Bus R17', vn_kv=0.4, type='m', zone='CIGRE_LV') busR18 = pp.create_bus(net_cigre_lv, name='Bus R18', vn_kv=0.4, type='m', zone='CIGRE_LV') busI0 = pp.create_bus(net_cigre_lv, name='Bus I0', vn_kv=20.0, type='b', zone='CIGRE_LV') busI1 = pp.create_bus(net_cigre_lv, name='Bus I1', vn_kv=0.4, type='b', zone='CIGRE_LV') busI2 = pp.create_bus(net_cigre_lv, name='Bus I2', vn_kv=0.4, type='m', zone='CIGRE_LV') busC0 = pp.create_bus(net_cigre_lv, name='Bus C0', vn_kv=20.0, type='b', zone='CIGRE_LV') busC1 = pp.create_bus(net_cigre_lv, name='Bus C1', vn_kv=0.4, type='b', zone='CIGRE_LV') busC2 = pp.create_bus(net_cigre_lv, name='Bus C2', vn_kv=0.4, type='m', zone='CIGRE_LV') busC3 = pp.create_bus(net_cigre_lv, name='Bus C3', vn_kv=0.4, type='m', zone='CIGRE_LV') busC4 = pp.create_bus(net_cigre_lv, name='Bus C4', vn_kv=0.4, type='m', zone='CIGRE_LV') busC5 = pp.create_bus(net_cigre_lv, name='Bus C5', vn_kv=0.4, type='m', zone='CIGRE_LV') busC6 = pp.create_bus(net_cigre_lv, name='Bus C6', vn_kv=0.4, type='m', zone='CIGRE_LV') busC7 = pp.create_bus(net_cigre_lv, name='Bus C7', vn_kv=0.4, type='m', zone='CIGRE_LV') busC8 = pp.create_bus(net_cigre_lv, name='Bus C8', vn_kv=0.4, type='m', zone='CIGRE_LV') busC9 = pp.create_bus(net_cigre_lv, name='Bus C9', vn_kv=0.4, type='m', zone='CIGRE_LV') busC10 = pp.create_bus(net_cigre_lv, name='Bus C10', vn_kv=0.4, type='m', zone='CIGRE_LV') busC11 = pp.create_bus(net_cigre_lv, name='Bus C11', vn_kv=0.4, type='m', zone='CIGRE_LV') busC12 = pp.create_bus(net_cigre_lv, name='Bus C12', vn_kv=0.4, type='m', zone='CIGRE_LV') busC13 = pp.create_bus(net_cigre_lv, name='Bus C13', vn_kv=0.4, type='m', zone='CIGRE_LV') busC14 = pp.create_bus(net_cigre_lv, name='Bus C14', vn_kv=0.4, type='m', zone='CIGRE_LV') busC15 = pp.create_bus(net_cigre_lv, name='Bus C15', vn_kv=0.4, type='m', zone='CIGRE_LV') busC16 = pp.create_bus(net_cigre_lv, name='Bus C16', vn_kv=0.4, type='m', zone='CIGRE_LV') busC17 = pp.create_bus(net_cigre_lv, name='Bus C17', vn_kv=0.4, type='m', zone='CIGRE_LV') busC18 = pp.create_bus(net_cigre_lv, name='Bus C18', vn_kv=0.4, type='m', zone='CIGRE_LV') busC19 = pp.create_bus(net_cigre_lv, name='Bus C19', vn_kv=0.4, type='m', zone='CIGRE_LV') busC20 = pp.create_bus(net_cigre_lv, name='Bus C20', vn_kv=0.4, type='m', zone='CIGRE_LV') # Lines pp.create_line(net_cigre_lv, busR1, busR2, length_km=0.035, std_type='UG1', name='Line R1-R2') pp.create_line(net_cigre_lv, busR2, busR3, length_km=0.035, std_type='UG1', name='Line R2-R3') pp.create_line(net_cigre_lv, busR3, busR4, length_km=0.035, std_type='UG1', name='Line R3-R4') pp.create_line(net_cigre_lv, busR4, busR5, length_km=0.035, std_type='UG1', name='Line R4-R5') pp.create_line(net_cigre_lv, busR5, busR6, length_km=0.035, std_type='UG1', name='Line R5-R6') pp.create_line(net_cigre_lv, busR6, busR7, length_km=0.035, std_type='UG1', name='Line R6-R7') pp.create_line(net_cigre_lv, busR7, busR8, length_km=0.035, std_type='UG1', name='Line R7-R8') pp.create_line(net_cigre_lv, busR8, busR9, length_km=0.035, std_type='UG1', name='Line R8-R9') pp.create_line(net_cigre_lv, busR9, busR10, length_km=0.035, std_type='UG1', name='Line R9-R10') pp.create_line(net_cigre_lv, busR3, busR11, length_km=0.030, std_type='UG3', name='Line R3-R11') pp.create_line(net_cigre_lv, busR4, busR12, length_km=0.035, std_type='UG3', name='Line R4-R12') pp.create_line(net_cigre_lv, busR12, busR13, length_km=0.035, std_type='UG3', name='Line R12-R13') pp.create_line(net_cigre_lv, busR13, busR14, length_km=0.035, std_type='UG3', name='Line R13-R14') pp.create_line(net_cigre_lv, busR14, busR15, length_km=0.030, std_type='UG3', name='Line R14-R15') pp.create_line(net_cigre_lv, busR6, busR16, length_km=0.030, std_type='UG3', name='Line R6-R16') pp.create_line(net_cigre_lv, busR9, busR17, length_km=0.030, std_type='UG3', name='Line R9-R17') pp.create_line(net_cigre_lv, busR10, busR18, length_km=0.030, std_type='UG3', name='Line R10-R18') pp.create_line(net_cigre_lv, busI1, busI2, length_km=0.2, std_type='UG2', name='Line I1-I2') pp.create_line(net_cigre_lv, busC1, busC2, length_km=0.030, std_type='OH1', name='Line C1-C2') pp.create_line(net_cigre_lv, busC2, busC3, length_km=0.030, std_type='OH1', name='Line C2-C3') pp.create_line(net_cigre_lv, busC3, busC4, length_km=0.030, std_type='OH1', name='Line C3-C4') pp.create_line(net_cigre_lv, busC4, busC5, length_km=0.030, std_type='OH1', name='Line C4-C5') pp.create_line(net_cigre_lv, busC5, busC6, length_km=0.030, std_type='OH1', name='Line C5-C6') pp.create_line(net_cigre_lv, busC6, busC7, length_km=0.030, std_type='OH1', name='Line C6-C7') pp.create_line(net_cigre_lv, busC7, busC8, length_km=0.030, std_type='OH1', name='Line C7-C8') pp.create_line(net_cigre_lv, busC8, busC9, length_km=0.030, std_type='OH1', name='Line C8-C9') pp.create_line(net_cigre_lv, busC3, busC10, length_km=0.030, std_type='OH2', name='Line C3-C10') pp.create_line(net_cigre_lv, busC10, busC11, length_km=0.030, std_type='OH2', name='Line C10-C11') pp.create_line(net_cigre_lv, busC11, busC12, length_km=0.030, std_type='OH3', name='Line C11-C12') pp.create_line(net_cigre_lv, busC11, busC13, length_km=0.030, std_type='OH3', name='Line C11-C13') pp.create_line(net_cigre_lv, busC10, busC14, length_km=0.030, std_type='OH3', name='Line C10-C14') pp.create_line(net_cigre_lv, busC5, busC15, length_km=0.030, std_type='OH2', name='Line C5-C15') pp.create_line(net_cigre_lv, busC15, busC16, length_km=0.030, std_type='OH2', name='Line C15-C16') pp.create_line(net_cigre_lv, busC15, busC17, length_km=0.030, std_type='OH3', name='Line C15-C17') pp.create_line(net_cigre_lv, busC16, busC18, length_km=0.030, std_type='OH3', name='Line C16-C18') pp.create_line(net_cigre_lv, busC8, busC19, length_km=0.030, std_type='OH3', name='Line C8-C19') pp.create_line(net_cigre_lv, busC9, busC20, length_km=0.030, std_type='OH3', name='Line C9-C20') # Trafos pp.create_transformer_from_parameters(net_cigre_lv, busR0, busR1, sn_mva=0.5, vn_hv_kv=20.0, vn_lv_kv=0.4, vkr_percent=1.0, vk_percent=4.123106, pfe_kw=0.0, i0_percent=0.0, shift_degree=30.0, tap_pos=0.0, name='Trafo R0-R1') pp.create_transformer_from_parameters(net_cigre_lv, busI0, busI1, sn_mva=0.15, vn_hv_kv=20.0, vn_lv_kv=0.4, vkr_percent=1.003125, vk_percent=4.126896, pfe_kw=0.0, i0_percent=0.0, shift_degree=30.0, tap_pos=0.0, name='Trafo I0-I1') pp.create_transformer_from_parameters(net_cigre_lv, busC0, busC1, sn_mva=0.3, vn_hv_kv=20.0, vn_lv_kv=0.4, vkr_percent=0.993750, vk_percent=4.115529, pfe_kw=0.0, i0_percent=0.0, shift_degree=30.0, tap_pos=0.0, name='Trafo C0-C1') # External grid pp.create_ext_grid(net_cigre_lv, bus0, vm_pu=1.0, va_degree=0.0, s_sc_max_mva=100.0, s_sc_min_mva=100.0, rx_max=1.0, rx_min=1.0) # Loads pp.create_load(net_cigre_lv, busR1, p_mw=0.0, q_mvar=0.062449980, name='Load R1') pp.create_load(net_cigre_lv, busR11, p_mw=0.01425, q_mvar=0.004683748, name='Load R11') pp.create_load(net_cigre_lv, busR15, p_mw=0.0494, q_mvar=0.016236995, name='Load R15') pp.create_load(net_cigre_lv, busR16, p_mw=0.05225, q_mvar=0.017173744, name='Load R16') pp.create_load(net_cigre_lv, busR17, p_mw=0.03325, q_mvar=0.010928746, name='Load R17') pp.create_load(net_cigre_lv, busR18, p_mw=0.04465, q_mvar=0.014675745, name='Load R18') pp.create_load(net_cigre_lv, busI2, p_mw=0.0850, q_mvar=0.052678269, name='Load I2') pp.create_load(net_cigre_lv, busC1, p_mw=0.0, q_mvar=0.052306787, name='Load C1') pp.create_load(net_cigre_lv, busC12, p_mw=0.018, q_mvar=0.008717798, name='Load C12') pp.create_load(net_cigre_lv, busC13, p_mw=0.018, q_mvar=0.008717798, name='Load C13') pp.create_load(net_cigre_lv, busC14, p_mw=0.0225, q_mvar=0.010897247, name='Load C14') pp.create_load(net_cigre_lv, busC17, p_mw=0.0225, q_mvar=0.010897247, name='Load C17') pp.create_load(net_cigre_lv, busC18, p_mw=0.0072, q_mvar=0.003487119, name='Load C18') pp.create_load(net_cigre_lv, busC19, p_mw=0.0144, q_mvar=0.006974238, name='Load C19') pp.create_load(net_cigre_lv, busC20, p_mw=0.0072, q_mvar=0.003487119, name='Load C20') # Switches pp.create_switch(net_cigre_lv, bus0, busR0, et='b', closed=True, type='CB', name='S1') pp.create_switch(net_cigre_lv, bus0, busI0, et='b', closed=True, type='CB', name='S2') pp.create_switch(net_cigre_lv, bus0, busC0, et='b', closed=True, type='CB', name='S3') # Distributed generators pp.create_sgen(net_cigre_lv, busR15, p_mw=0.0, q_mvar=0.0, name='MT 1', max_p_mw=0.03, min_p_mw=0, max_q_mvar=0.025, min_q_mvar=-0.025) pp.create_sgen(net_cigre_lv, busR18, p_mw=0.0, q_mvar=0.0, name='FC 1', max_p_mw=0.05, min_p_mw=0, max_q_mvar=0.0375, min_q_mvar=-0.0375) pp.create_sgen(net_cigre_lv, busC17, p_mw=0.0, q_mvar=0.0, name='MT 2', max_p_mw=0.04, min_p_mw=0, max_q_mvar=0.03, min_q_mvar=-0.03) pp.create_sgen(net_cigre_lv, busR16, p_mw=0.01, type='PV', name='PV 1', max_p_mw=0.01, min_p_mw=0, max_q_mvar=0, min_q_mvar=0) pp.create_sgen(net_cigre_lv, busR17, p_mw=0.01, type='PV', name='PV 2', max_p_mw=0.01, min_p_mw=0, max_q_mvar=0, min_q_mvar=0) pp.create_sgen(net_cigre_lv, busC19, p_mw=0.01, type='PV', name='PV 3', max_p_mw=0.01, min_p_mw=0, max_q_mvar=0, min_q_mvar=0) pp.create_sgen(net_cigre_lv, busR16, p_mw=0.01, type='WP', name='WP 1', max_p_mw=0.01, min_p_mw=0, max_q_mvar=0, min_q_mvar=0) pp.create_sgen(net_cigre_lv, busC20, p_mw=0.01, type='WP', name='WP 2', max_p_mw=0.01, min_p_mw=0, max_q_mvar=0, min_q_mvar=0) # storage pp.create_storage(net_cigre_lv, busR11, p_mw=0.1, max_e_mwh=0.5, sn_mva=0.1, soc_percent=50, min_e_mwh=0.05, name='Battery 1') pp.create_storage(net_cigre_lv, busC13, p_mw=0.06, max_e_mwh=0.3, sn_mva=0.1, soc_percent=50, min_e_mwh=0.03, name='Battery 2') # Bus geo data net_cigre_lv.bus_geodata = read_json( """{"x":{"0":0.2,"1":0.2,"2":-1.4583333333,"3":-1.4583333333,"4":-1.4583333333, "5":-1.9583333333,"6":-2.7083333333,"7":-2.7083333333,"8":-3.2083333333,"9":-3.2083333333, "10":-3.2083333333,"11":-3.7083333333,"12":-0.9583333333,"13":-1.2083333333, "14":-1.2083333333,"15":-1.2083333333,"16":-1.2083333333,"17":-2.2083333333, "18":-2.7083333333,"19":-3.7083333333,"20":0.2,"21":0.2,"22":0.2,"23":0.2,"24":1.9166666667, "25":1.9166666667,"26":1.9166666667,"27":0.5416666667,"28":0.5416666667,"29":-0.2083333333, "30":-0.2083333333,"31":-0.2083333333,"32":-0.7083333333,"33":3.2916666667, "34":2.7916666667,"35":2.2916666667,"36":3.2916666667,"37":3.7916666667,"38":1.2916666667, "39":0.7916666667,"40":1.7916666667,"41":0.7916666667,"42":0.2916666667,"43":-0.7083333333}, "y":{"0":1.0,"1":1.0,"2":2.0,"3":3.0,"4":4.0,"5":5.0,"6":6.0,"7":7.0,"8":8.0,"9":9.0, "10":10.0,"11":11.0,"12":5.0,"13":6.0,"14":7.0,"15":8.0,"16":9.0,"17":8.0,"18":11.0, "19":12.0,"20":1.0,"21":2.0,"22":3.0,"23":1.0,"24":2.0,"25":3.0,"26":4.0,"27":5.0,"28":6.0, "29":7.0,"30":8.0,"31":9.0,"32":10.0,"33":5.0,"34":6.0,"35":7.0,"36":7.0,"37":6.0,"38":7.0, "39":8.0,"40":8.0,"41":9.0,"42":10.0,"43":11.0}}""") # Match bus.index net_cigre_lv.bus_geodata = net_cigre_lv.bus_geodata.loc[net_cigre_lv.bus.index] return net_cigre_lv
def test_example_simple(): net = example_simple() # --- fix scaling net.load["scaling"] = 1. # --- add some additional data net.bus["subnet"] = ["net%i" % i for i in net.bus.index] pp.create_measurement(net, "i", "trafo", np.nan, np.nan, 0, "hv", name="1") pp.create_measurement(net, "i", "line", np.nan, np.nan, 1, "to", name="2") pp.create_measurement(net, "v", "bus", np.nan, np.nan, 0, name="3") net.shunt["max_step"] = np.nan stor = pp.create_storage(net, 6, 0.01, 0.1, -0.002, 0.05, 80, name="sda", min_p_mw=-0.01, max_p_mw=0.008, min_q_mvar=-0.01, max_q_mvar=0.005) net.storage.loc[stor, "efficiency_percent"] = 90 net.storage.loc[stor, "self-discharge_percent_per_day"] = 0.3 pp.create_dcline(net, 4, 6, 0.01, 0.1, 1e-3, 1.0, 1.01, name="df", min_q_from_mvar=-0.01) pp.runpp(net) to_drop = pp.create_bus(net, 7, "to_drop") # --- add names to elements for i in pp.pp_elements(): net[i] = ensure_full_column_data_existence(net, i, 'name') avoid_duplicates_in_column(net, i, 'name') # --- create geodata net.bus_geodata["x"] = [0, 1, 2, 3, 4, 5, 5, 3.63] net.bus_geodata["y"] = [0]*5+[-5, 5, 2.33] merge_busbar_coordinates(net) # --- convert csv_data = pp2csv_data(net, export_pp_std_types=True, drop_inactive_elements=True) net_from_csv_data = csv_data2pp(csv_data) # --- adjust net appearance pp.drop_buses(net, [to_drop]) del net["OPF_converged"] net.load["type"] = np.nan del net_from_csv_data["substation"] del net_from_csv_data["profiles"] for key in net.keys(): if isinstance(net[key], pd.DataFrame): # drop unequal columns dummy_columns = net[key].columns extra_columns = net_from_csv_data[key].columns.difference(dummy_columns) net_from_csv_data[key].drop(columns=extra_columns, inplace=True) # drop result table rows if "res_" in key: if not key == "res_bus": net[key].drop(net[key].index, inplace=True) else: net[key].loc[:, ["p_mw", "q_mvar"]] = np.nan # adjust dtypes if net[key].shape[0]: try: net_from_csv_data[key] = net_from_csv_data[key].astype(dtype=dict(net[ key].dtypes)) except: logger.error("dtype adjustment of %s failed." % key) eq = pp.nets_equal(net, net_from_csv_data, tol=1e-7) assert eq
def test_opf_task(): net = pp.create_empty_network() pp.create_buses(net, 6, [10, 10, 10, 0.4, 7, 7], min_vm_pu=[0.9, 0.9, 0.88, 0.9, np.nan, np.nan]) idx_ext_grid = 1 pp.create_ext_grid(net, 0, max_q_mvar=80, min_p_mw=0, index=idx_ext_grid) pp.create_gen(net, 1, 10, min_q_mvar=-50, max_q_mvar=-10, min_p_mw=0, max_p_mw=60) pp.create_gen(net, 2, 8) pp.create_gen(net, 3, 5) pp.create_load(net, 3, 120, max_p_mw=8) pp.create_sgen(net, 1, 8, min_q_mvar=-50, max_q_mvar=-10, controllable=False) pp.create_sgen(net, 2, 8) pp.create_storage(net, 3, 2, 100, min_q_mvar=-10, max_q_mvar=-50, min_p_mw=0, max_p_mw=60, controllable=True) pp.create_dcline(net, 4, 5, 0.3, 1e-4, 1e-2, 1.01, 1.02, min_q_from_mvar=-10, min_q_to_mvar=-10) pp.create_line(net, 3, 4, 5, "122-AL1/20-ST1A 10.0", max_loading_percent=50) pp.create_transformer(net, 2, 3, "0.25 MVA 10/0.4 kV") # --- run and check opf_task() out1 = pp.opf_task(net, keep=True) assert out1["flexibilities_without_costs"] == "all" assert sorted(out1["flexibilities"].keys()) == [i1 + i2 for i1 in ["P", "Q"] for i2 in [ "dcline", "ext_grid", "gen", "storage"]] for key, df in out1["flexibilities"].items(): assert df.shape[0] if "gen" in key: assert df.shape[0] > 1 assert out1["flexibilities"]["Pext_grid"].loc[0, "index"] == [1] assert np.isnan(out1["flexibilities"]["Pext_grid"].loc[0, "max"]) assert out1["flexibilities"]["Pext_grid"].loc[0, "min"] == 0 assert np.isnan(out1["flexibilities"]["Qext_grid"].loc[0, "min"]) assert out1["flexibilities"]["Qext_grid"].loc[0, "max"] == 80 assert sorted(out1["network_constraints"].keys()) == ["LOADINGline", "VMbus"] assert out1["network_constraints"]["VMbus"].shape[0] == 3 # check delta_pq net.gen.loc[0, "min_p_mw"] = net.gen.loc[0, "max_p_mw"] - 1e-5 out2 = pp.opf_task(net, delta_pq=1e-3, keep=True) assert out2["flexibilities"]["Pgen"].shape[0] == 1 net.gen.loc[0, "min_p_mw"] = net.gen.loc[0, "max_p_mw"] - 1e-1 out1["flexibilities"]["Pgen"].loc[0, "min"] = out1["flexibilities"]["Pgen"].loc[ 0, "max"] - 1e-1 out3 = pp.opf_task(net, delta_pq=1e-3, keep=True) for key in out3["flexibilities"]: assert pp.dataframes_equal(out3["flexibilities"][key], out1["flexibilities"][key]) # check costs pp.create_poly_cost(net, idx_ext_grid, "ext_grid", 2) pp.create_poly_cost(net, 1, "gen", 1.7) pp.create_poly_cost(net, 0, "dcline", 2) pp.create_pwl_cost(net, 2, "gen", [[-1e9, 1, 3.1], [1, 1e9, 0.5]], power_type="q") out4 = pp.opf_task(net) for dict_key in ["flexibilities", "network_constraints"]: for key in out4[dict_key]: assert pp.dataframes_equal(out4[dict_key][key], out1[dict_key][key]) assert isinstance(out4["flexibilities_without_costs"], dict) expected_elm_without_cost = ["gen", "storage"] assert sorted(out4["flexibilities_without_costs"].keys()) == expected_elm_without_cost for elm in expected_elm_without_cost: assert len(out4["flexibilities_without_costs"][elm]) == 1
def gls_network_builder(): #%% Import modules import numpy as np import os import pandas as pd import pandapower as pp #%% Define folder for input data directory_path = os.path.dirname(__file__) input_folder_path = r'{}/input'.format( directory_path) # path to be created\ try: os.makedirs(input_folder_path) except OSError: pass #%% Load initial data filename = input_folder_path + '/network_data.xlsx' # Bus data bus_data_raw = pd.read_excel(filename, sheet_name='Buses') # Transformer data transformer_data_raw = pd.read_excel(filename, sheet_name='Transformers') # Cable data cable_data_raw = pd.read_excel(filename, sheet_name='Cables') # Load data load_data_raw = pd.read_excel(filename, sheet_name='Loads') # Electrical storage data storage_data_raw = pd.read_excel(filename, sheet_name='Storage') # Generator data generator_data_raw = pd.read_excel(filename, sheet_name='Generators') #%% Create empty pandapower model gls_network = pp.create_empty_network() #%% Add 10 kV feeder buses to model number_of_buses = len(bus_data_raw) variable_name = {} for i in range(number_of_buses): bus_name = bus_data_raw.loc[i, 'name'] bus_voltage = bus_data_raw.loc[i, 'voltage_kv'] bus_type = bus_data_raw.loc[i, 'type'] bus_zone = bus_data_raw.loc[i, 'zone'] variable_name['BUS' + str(i)] = pp.create_bus(gls_network, name=bus_name, vn_kv=bus_voltage, type=bus_type, zone=bus_zone, geodata=None) locals().update(variable_name) #%% Write bus information bus_information = gls_network.bus #%% Make connection to external network pp.create_ext_grid(gls_network, 0, name='Upstream_60_kV_system', vm_pu=1.04, va_degree=0) # create an external network connection #%% Write information about external connection external_network_information = gls_network.ext_grid # show external network table #%% Add transformers to model number_of_transformers = len(transformer_data_raw) variable_name = {} for i in range(number_of_transformers): transformer_from_bus_index = np.where( transformer_data_raw.loc[i, 'from'] == bus_information.iloc[:, 0]) transformer_to_bus_index = np.where( transformer_data_raw.loc[i, 'to'] == bus_information.iloc[:, 0]) transformer_name = transformer_data_raw.loc[i, 'name'] transformer_apparent_power = transformer_data_raw.loc[i, 'rating_mva'] transformer_shift_degree = transformer_data_raw.loc[i, 'shift_deg'] transformer_hv = transformer_data_raw.loc[i, 'high_voltage_kv'] transformer_lv = transformer_data_raw.loc[i, 'low_voltage_kv'] transformer_uk = transformer_data_raw.loc[i, 'vk_%'] transformer_ukr = transformer_data_raw.loc[i, 'vr_%'] transformer_pfe = transformer_data_raw.loc[i, 'pfe_kw'] transformer_i0 = transformer_data_raw.loc[i, 'i0_%'] variable_name['TRAFO' + str(i)] = pp.create_transformer_from_parameters( gls_network, transformer_from_bus_index[0], transformer_to_bus_index[0], name=transformer_name, sn_mva=transformer_apparent_power, vn_hv_kv=transformer_hv, vn_lv_kv=transformer_lv, vk_percent=transformer_uk, vkr_percent=transformer_ukr, pfe_kw=transformer_pfe, i0_percent=transformer_i0, shift_degree=transformer_shift_degree) locals().update(variable_name) #%% Write transformer information trafo_information = gls_network.trafo #%% Add cables to model number_of_cables = len(cable_data_raw) variable_name = {} for i in range(number_of_cables): cable_from_bus_index = np.where( cable_data_raw.loc[i, 'from'] == bus_information.iloc[:, 0]) cable_to_bus_index = np.where( cable_data_raw.loc[i, 'to'] == bus_information.iloc[:, 0]) cable_name = cable_data_raw.loc[i, 'name'] cable_length = cable_data_raw.loc[i, 'length_km'] cable_r_per_km = cable_data_raw.loc[i, 'r_ohm_per_km'] cable_x_per_km = cable_data_raw.loc[i, 'x_ohm_per_km'] cable_c_per_km = cable_data_raw.loc[ i, 'c_nf_per_km'] # get capacitance in nF cable_I_max = cable_data_raw.loc[i, 'max_i_a'] / 1000 # get current in kA cable_type = cable_data_raw.loc[i, 'type'] cable_state = cable_data_raw.loc[i, 'in_service'] cable_parallel = cable_data_raw.loc[i, 'parallel'] variable_name['CABLE' + str(i)] = pp.create_line_from_parameters( gls_network, from_bus=cable_from_bus_index[0], to_bus=cable_to_bus_index[0], length_km=cable_length, r_ohm_per_km=cable_r_per_km, x_ohm_per_km=cable_x_per_km, c_nf_per_km=cable_c_per_km, max_i_ka=cable_I_max, name=cable_name, index=None, type=cable_type, geodata=None, in_service=cable_state, df=1.0, parallel=cable_parallel) locals().update(variable_name) #%% Write cable information cable_information = gls_network.line #%% Add loads number_of_loads = len(load_data_raw) variable_name = {} load_scaling = 1 # loading scale coefficient for i in range(number_of_loads): load_active_power = load_data_raw.loc[ i, 'p_mw'] #!!! modify this to change p_mw load_reactive_power = load_data_raw.loc[ i, 'q_mvar'] #!!! modify this to change q_mvar load_bus_index = np.where( load_data_raw.loc[i, 'bus'] == bus_information.iloc[:, 0]) load_state = load_data_raw.loc[i, 'in_service'] load_name = load_data_raw.loc[i, 'name'] variable_name['LOAD' + str(i)] = pp.create_load( gls_network, bus=load_bus_index[0], p_mw=load_active_power, q_mvar=load_reactive_power, scaling=load_scaling, name=load_name, in_service=load_state, controllable=False) locals().update(variable_name) #%% Write load information load_information = gls_network.load #%% Add electrical storage number_of_storage = len(storage_data_raw) for i in range(number_of_storage): storage_bus_index = np.where( storage_data_raw.loc[i, 'bus'] == bus_information.iloc[:, 0]) storage_p_mw = storage_data_raw.loc[ i, 'p_mw'] #!!! modify this to change p_mw storage_q_mvar = storage_data_raw.loc[ i, 'q_mvar'] #!!! modify this to change q_mvar storage_max_e_mwh = storage_data_raw.loc[i, 'max_e_mwh'] storage_name = storage_data_raw.loc[i, 'name'] storage_state = storage_data_raw.loc[i, 'in_service'] variable_name['STORAGE' + str(i)] = pp.create_storage( gls_network, bus=storage_bus_index[0], p_mw=storage_p_mw, q_mvar=storage_q_mvar, max_e_mwh=storage_max_e_mwh, name=storage_name, in_service=storage_state) locals().update(variable_name) #%% Write storage information storage_information = gls_network.storage #%% Add generators number_of_generators = len(generator_data_raw) for i in range(number_of_generators): generator_bus_index = np.where( generator_data_raw.loc[i, 'bus'] == bus_information.iloc[:, 0]) generator_p_mw = generator_data_raw.loc[ i, 'p_mw'] #!!! modify this to change p_mw generator_q_mvar = generator_data_raw.loc[ i, 'q_mvar'] #!!! modify this to change q_mvar generator_name = generator_data_raw.loc[i, 'name'] generator_state = generator_data_raw.loc[i, 'in_service'] variable_name['STORAGE' + str(i)] = pp.create_sgen( gls_network, bus=generator_bus_index[0], p_mw=generator_p_mw, q_mvar=generator_q_mvar, name=generator_name, in_service=generator_state) locals().update(variable_name) #%% Write generator information generator_information = gls_network.sgen #%% Combine network tables in the dictionary gls_network_information = {} gls_network_information['Bus'] = bus_information gls_network_information['External_grid'] = external_network_information gls_network_information['Transformer'] = trafo_information gls_network_information['Cable'] = cable_information gls_network_information['Load'] = load_information gls_network_information['Storage'] = storage_information gls_network_information['Generator'] = generator_information #%% Perform power flow pp.runpp(gls_network, trafo_loading='power', algorithm='iwamoto_nr', calculate_voltage_angles='auto') #%% Write results in the dictionary # Add names of the rows gls_network.res_bus.insert(0, 'name', pd.Series(gls_network.bus.loc[:, 'name']), allow_duplicates=False) gls_network.res_trafo.insert(0, 'name', pd.Series(gls_network.trafo.loc[:, 'name']), allow_duplicates=False) gls_network.res_line.insert(0, 'name', pd.Series(gls_network.line.loc[:, 'name']), allow_duplicates=False) gls_network.res_load.insert(0, 'name', pd.Series(gls_network.load.loc[:, 'name']), allow_duplicates=False) gls_network.res_storage.insert(0, 'name', pd.Series(gls_network.storage.loc[:, 'name']), allow_duplicates=False) gls_network.res_sgen.insert(0, 'name', pd.Series(gls_network.sgen.loc[:, 'name']), allow_duplicates=False) # Write all results in the dictionary gls_network_results = {} gls_network_results['Bus'] = gls_network.res_bus gls_network_results['External_grid'] = gls_network.res_ext_grid gls_network_results['Transformer'] = gls_network.res_trafo gls_network_results['Cable'] = gls_network.res_line gls_network_results['Load'] = gls_network.res_load gls_network_results['Storage'] = gls_network.res_storage gls_network_results['Generator'] = gls_network.res_sgen return gls_network, gls_network_results
def test_storage_opf(): """ Testing a simple network with storage to ensure the correct behaviour of the storage OPF-Functions """ # boundaries vm_max = 1.1 vm_min = 0.9 max_line_loading_percent = 100 # create network net = pp.create_empty_network() b1 = pp.create_bus(net, vn_kv=0.4, max_vm_pu=vm_max, min_vm_pu=vm_min) b2 = pp.create_bus(net, vn_kv=0.4, max_vm_pu=vm_max, min_vm_pu=vm_min) pp.create_line(net, b1, b2, length_km=5, std_type="NAYY 4x50 SE", max_loading_percent=max_line_loading_percent) # test elements static pp.create_ext_grid(net, b2) pp.create_load(net, b1, p_kw=7.5, controllable=False) pp.create_sgen(net, b1, p_kw=-25, controllable=True, max_p_kw=-10, min_p_kw=-25, max_q_kvar=25, min_q_kvar=-25) # test elements pp.create_storage(net, b1, p_kw=-25, max_e_kwh=50, controllable=True, max_p_kw=0, min_p_kw=-25, max_q_kvar=25, min_q_kvar=-25) pp.create_sgen(net, b1, p_kw=-25, controllable=True, max_p_kw=0, min_p_kw=-25, max_q_kvar=25, min_q_kvar=-25) pp.create_load(net, b1, p_kw=2.5, controllable=True, max_p_kw=2.5, min_p_kw=0, max_q_kvar=2.5, min_q_kvar=-2.5) # costs pp.create_polynomial_cost(net, 0, "ext_grid", array([0, 3, 0])) pp.create_polynomial_cost(net, 0, "load", array([0, -1, 0])) pp.create_polynomial_cost(net, 0, "sgen", array([0, 2, 0])) pp.create_polynomial_cost(net, 0, "storage", array([0, 1, 0])) pp.create_polynomial_cost(net, 1, "sgen", array([0, 1, 0])) pp.create_polynomial_cost(net, 1, "load", array([0, -1, 0])) # test storage generator behaviour net["storage"].in_service.iloc[0] = True net["storage"].p_kw.iloc[0] = -25 net["sgen"].in_service.iloc[1] = False net["load"].in_service.iloc[1] = False pp.runopp(net, verbose=True) #consistency_checks(net) assert net["OPF_converged"] '''
def case34_3ph(): """ Create the IEEE 34 bus from IEEE PES Test Feeders: "https://site.ieee.org/pes-testfeeders/resources/”. OUTPUT: **net** - The pandapower format network. """ net = pp.create_empty_network() # Linedata # CF-300 line_data = { 'c_nf_per_km': 3.8250977, 'r_ohm_per_km': 0.69599766, 'x_ohm_per_km': 0.5177677, 'c0_nf_per_km': 1.86976748, 'r0_ohm_per_km': 1.08727498, 'x0_ohm_per_km': 1.47374703, 'max_i_ka': 0.23, 'type': 'ol' } pp.create_std_type(net, line_data, name='CF-300', element='line') # CF-301 line_data = { 'c_nf_per_km': 3.66884364, 'r_ohm_per_km': 1.05015841, 'x_ohm_per_km': 0.52265586, 'c0_nf_per_km': 1.82231544, 'r0_ohm_per_km': 1.48350255, 'x0_ohm_per_km': 1.60203942, 'max_i_ka': 0.18, 'type': 'ol' } pp.create_std_type(net, line_data, name='CF-301', element='line') # CF-302 line_data = { 'c_nf_per_km': 0.8751182, 'r_ohm_per_km': 0.5798427, 'x_ohm_per_km': 0.30768221, 'c0_nf_per_km': 0.8751182, 'r0_ohm_per_km': 0.5798427, 'x0_ohm_per_km': 0.30768221, 'max_i_ka': 0.14, 'type': 'ol' } pp.create_std_type(net, line_data, name='CF-302', element='line') # CF-303 line_data = { 'c_nf_per_km': 0.8751182, 'r_ohm_per_km': 0.5798427, 'x_ohm_per_km': 0.30768221, 'c0_nf_per_km': 0.8751182, 'r0_ohm_per_km': 0.5798427, 'x0_ohm_per_km': 0.30768221, 'max_i_ka': 0.14, 'type': 'ol' } pp.create_std_type(net, line_data, name='CF-303', element='line') # CF-304 line_data = { 'c_nf_per_km': 0.90382554, 'r_ohm_per_km': 0.39802955, 'x_ohm_per_km': 0.29436416, 'c0_nf_per_km': 0.90382554, 'r0_ohm_per_km': 0.39802955, 'x0_ohm_per_km': 0.29436416, 'max_i_ka': 0.18, 'type': 'ol' } pp.create_std_type(net, line_data, name='CF-304', element='line') # Busses bus0 = pp.create_bus(net, name='Bus 0', vn_kv=24.9, type='n', zone='34_BUS') bus_800 = pp.create_bus(net, name='Bus 800', vn_kv=24.9, type='n', zone='34_BUS') bus_802 = pp.create_bus(net, name='Bus 802', vn_kv=24.9, type='n', zone='34_BUS') bus_806 = pp.create_bus(net, name='Bus 806', vn_kv=24.9, type='n', zone='34_BUS') bus_808 = pp.create_bus(net, name='Bus 808', vn_kv=24.9, type='n', zone='34_BUS') bus_810 = pp.create_bus(net, name='Bus 810', vn_kv=24.9, type='n', zone='34_BUS') bus_812 = pp.create_bus(net, name='Bus 812', vn_kv=24.9, type='n', zone='34_BUS') bus_814 = pp.create_bus(net, name='Bus 814', vn_kv=24.9, type='n', zone='34_BUS') bus_850 = pp.create_bus(net, name='Bus 850', vn_kv=24.9, type='n', zone='34_BUS') bus_816 = pp.create_bus(net, name='Bus 816', vn_kv=24.9, type='n', zone='34_BUS') bus_818 = pp.create_bus(net, name='Bus 818', vn_kv=24.9, type='n', zone='34_BUS') bus_820 = pp.create_bus(net, name='Bus 820', vn_kv=24.9, type='n', zone='34_BUS') bus_822 = pp.create_bus(net, name='Bus 822', vn_kv=24.9, type='n', zone='34_BUS') bus_824 = pp.create_bus(net, name='Bus 824', vn_kv=24.9, type='n', zone='34_BUS') bus_826 = pp.create_bus(net, name='Bus 826', vn_kv=24.9, type='n', zone='34_BUS') bus_828 = pp.create_bus(net, name='Bus 828', vn_kv=24.9, type='n', zone='34_BUS') bus_830 = pp.create_bus(net, name='Bus 830', vn_kv=24.9, type='n', zone='34_BUS') bus_854 = pp.create_bus(net, name='Bus 854', vn_kv=24.9, type='n', zone='34_BUS') bus_852 = pp.create_bus(net, name='Bus 852', vn_kv=24.9, type='n', zone='34_BUS') bus_832 = pp.create_bus(net, name='Bus 832', vn_kv=24.9, type='n', zone='34_BUS') bus_858 = pp.create_bus(net, name='Bus 858', vn_kv=24.9, type='n', zone='34_BUS') bus_834 = pp.create_bus(net, name='Bus 834', vn_kv=24.9, type='n', zone='34_BUS') bus_842 = pp.create_bus(net, name='Bus 842', vn_kv=24.9, type='n', zone='34_BUS') bus_844 = pp.create_bus(net, name='Bus 844', vn_kv=24.9, type='n', zone='34_BUS') bus_846 = pp.create_bus(net, name='Bus 846', vn_kv=24.9, type='n', zone='34_BUS') bus_848 = pp.create_bus(net, name='Bus 848', vn_kv=24.9, type='n', zone='34_BUS') bus_860 = pp.create_bus(net, name='Bus 860', vn_kv=24.9, type='n', zone='34_BUS') bus_836 = pp.create_bus(net, name='Bus 836', vn_kv=24.9, type='n', zone='34_BUS') bus_840 = pp.create_bus(net, name='Bus 840', vn_kv=24.9, type='n', zone='34_BUS') bus_862 = pp.create_bus(net, name='Bus 862', vn_kv=24.9, type='n', zone='34_BUS') bus_838 = pp.create_bus(net, name='Bus 838', vn_kv=24.9, type='n', zone='34_BUS') bus_864 = pp.create_bus(net, name='Bus 864', vn_kv=24.9, type='n', zone='34_BUS') bus_888 = pp.create_bus(net, name='Bus 888', vn_kv=4.16, type='n', zone='34_BUS') bus_890 = pp.create_bus(net, name='Bus 890', vn_kv=4.16, type='n', zone='34_BUS') bus_856 = pp.create_bus(net, name='Bus 856', vn_kv=24.9, type='n', zone='34_BUS') # Lines pp.create_line(net, bus_800, bus_802, length_km=0.786384, std_type='CF-300', name='Line 0') pp.create_line(net, bus_802, bus_806, length_km=0.527304, std_type='CF-300', name='Line 1') pp.create_line(net, bus_806, bus_808, length_km=9.823704, std_type='CF-300', name='Line 2') pp.create_line(net, bus_808, bus_810, length_km=1.769059, std_type='CF-303', name='Line 3') pp.create_line(net, bus_808, bus_812, length_km=11.43000, std_type='CF-300', name='Line 4') pp.create_line(net, bus_812, bus_814, length_km=9.061704, std_type='CF-300', name='Line 5') # pp.create_line(net, bus_814, bus_850, length_km=0.003048, std_type='CF-301', # name='Line 6') pp.create_line(net, bus_816, bus_818, length_km=0.521208, std_type='CF-302', name='Line 7') pp.create_line(net, bus_816, bus_824, length_km=3.112008, std_type='CF-301', name='Line 8') pp.create_line(net, bus_818, bus_820, length_km=14.67612, std_type='CF-302', name='Line 9') pp.create_line(net, bus_820, bus_822, length_km=4.187952, std_type='CF-302', name='Line 10') pp.create_line(net, bus_824, bus_826, length_km=0.923544, std_type='CF-303', name='Line 11') pp.create_line(net, bus_824, bus_828, length_km=0.256032, std_type='CF-301', name='Line 12') pp.create_line(net, bus_828, bus_830, length_km=6.230112, std_type='CF-301', name='Line 13') pp.create_line(net, bus_830, bus_854, length_km=0.158496, std_type='CF-301', name='Line 14') pp.create_line(net, bus_832, bus_858, length_km=1.493520, std_type='CF-301', name='Line 15') pp.create_line(net, bus_834, bus_860, length_km=0.615696, std_type='CF-301', name='Line 16') pp.create_line(net, bus_834, bus_842, length_km=0.085344, std_type='CF-301', name='Line 17') pp.create_line(net, bus_836, bus_840, length_km=0.262128, std_type='CF-301', name='Line 18') pp.create_line(net, bus_836, bus_862, length_km=0.085344, std_type='CF-301', name='Line 19') pp.create_line(net, bus_842, bus_844, length_km=0.411480, std_type='CF-301', name='Line 20') pp.create_line(net, bus_844, bus_846, length_km=1.109472, std_type='CF-301', name='Line 21') pp.create_line(net, bus_846, bus_848, length_km=0.161544, std_type='CF-301', name='Line 22') pp.create_line(net, bus_850, bus_816, length_km=0.094488, std_type='CF-301', name='Line 23') # pp.create_line(net, bus_852, bus_832, length_km=0.003048, std_type='CF-301', # name='Line 24') pp.create_line(net, bus_854, bus_856, length_km=7.110984, std_type='CF-303', name='Line 25') pp.create_line(net, bus_854, bus_852, length_km=11.22578, std_type='CF-301', name='Line 26') pp.create_line(net, bus_858, bus_864, length_km=0.493776, std_type='CF-302', name='Line 27') pp.create_line(net, bus_858, bus_834, length_km=1.776984, std_type='CF-301', name='Line 28') pp.create_line(net, bus_860, bus_836, length_km=0.816864, std_type='CF-301', name='Line 29') pp.create_line(net, bus_860, bus_838, length_km=1.481328, std_type='CF-304', name='Line 30') pp.create_line(net, bus_888, bus_890, length_km=3.218688, std_type='CF-300', name='Line 31') # Substation pp.create_transformer_from_parameters(net, bus0, bus_800, sn_mva=2.5, vn_hv_kv=24.9, vn_lv_kv=24.9, vkr_percent=1.0, vk_percent=8.062257, pfe_kw=0.0, i0_percent=0.0, shift_degree=0.0, vkr0_percent=1.0, vk0_percent=8.062257, vector_group='YNyn', mag0_percent=100.0, mag0_rx=0, si0_hv_partial=0.9, tap_side='lv', tap_neutral=0, tap_max=2, tap_min=-2, tap_step_percent=2.5, tap_pos=-2, name='Substation') # Regulator 1 pp.create_transformer_from_parameters(net, bus_814, bus_850, sn_mva=1, vn_hv_kv=24.9, vn_lv_kv=24.9, vkr_percent=0.320088, vk_percent=0.357539, pfe_kw=0.0, i0_percent=0.0, shift_degree=0.0, vkr0_percent=0.452171, vk0_percent=0.665505, vector_group='YNyn', mag0_percent=100.0, mag0_rx=0, si0_hv_partial=0.9, tap_side='lv', tap_neutral=0, tap_max=16, tap_min=-16, tap_step_percent=0.625, tap_pos=0, tap_phase_shifter=False, name='Regulator 1') # Regulator 2 pp.create_transformer_from_parameters(net, bus_852, bus_832, sn_mva=1, vn_hv_kv=24.9, vn_lv_kv=24.9, vkr_percent=0.320088, vk_percent=0.357539, pfe_kw=0.0, i0_percent=0.0, shift_degree=0.0, vkr0_percent=0.452171, vk0_percent=0.665505, vector_group='YNyn', mag0_percent=100.0, mag0_rx=0, si0_hv_partial=0.9, tap_side='lv', tap_neutral=0, tap_max=16, tap_min=-16, tap_step_percent=0.625, tap_pos=0, tap_phase_shifter=False, name='Regulator 2') # Traformer pp.create_transformer_from_parameters(net, bus_832, bus_888, sn_mva=0.5, vn_hv_kv=24.9, vn_lv_kv=4.16, vkr_percent=1.9, vk_percent=4.5, pfe_kw=0.0, i0_percent=0.0, shift_degree=0.0, vkr0_percent=1.9, vk0_percent=4.5, vector_group='YNyn', mag0_percent=100.0, mag0_rx=0, si0_hv_partial=0.9, name='Traformer') # Loads pp.create_asymmetric_load(net, bus_806, p_a_mw=0, p_b_mw=0.03, p_c_mw=0.025, q_a_mvar=0, q_b_mvar=0.015, q_c_mvar=0.014, name='Load 806', type='wye') pp.create_asymmetric_load(net, bus_810, p_a_mw=0, p_b_mw=0.016, p_c_mw=0, q_a_mvar=0, q_b_mvar=0.008, q_c_mvar=0, name='Load 810', type='wye') pp.create_asymmetric_load(net, bus_820, p_a_mw=0.034, p_b_mw=0, p_c_mw=0, q_a_mvar=0.017, q_b_mvar=0, q_c_mvar=0, name='Load 820', type='wye') pp.create_asymmetric_load(net, bus_822, p_a_mw=0.135, p_b_mw=0, p_c_mw=0, q_a_mvar=0.07, q_b_mvar=0, q_c_mvar=0, name='Load 822', type='wye') pp.create_asymmetric_load(net, bus_824, p_a_mw=0, p_b_mw=0.005, p_c_mw=0, q_a_mvar=0, q_b_mvar=0.002, q_c_mvar=0, name='Load 824', type='delta') pp.create_asymmetric_load(net, bus_826, p_a_mw=0, p_b_mw=0.04, p_c_mw=0, q_a_mvar=0, q_b_mvar=0.02, q_c_mvar=0, name='Load 826', type='wye') pp.create_asymmetric_load(net, bus_828, p_a_mw=0, p_b_mw=0, p_c_mw=0.004, q_a_mvar=0, q_b_mvar=0, q_c_mvar=0.002, name='Load 828', type='wye') pp.create_asymmetric_load(net, bus_830, p_a_mw=0.007, p_b_mw=0, p_c_mw=0, q_a_mvar=0.003, q_b_mvar=0, q_c_mvar=0, name='Load 830', type='wye') pp.create_asymmetric_load(net, bus_856, p_a_mw=0, p_b_mw=0.004, p_c_mw=0, q_a_mvar=0, q_b_mvar=0.002, q_c_mvar=0, name='Load 856', type='wye') pp.create_asymmetric_load(net, bus_858, p_a_mw=0.007, p_b_mw=0.002, p_c_mw=0.006, q_a_mvar=0.003, q_b_mvar=0.001, q_c_mvar=0.003, name='Load 858', type='delta') pp.create_asymmetric_load(net, bus_864, p_a_mw=0.002, p_b_mw=0, p_c_mw=0, q_a_mvar=0.001, q_b_mvar=0, q_c_mvar=0, name='Load 864', type='wye') pp.create_asymmetric_load(net, bus_834, p_a_mw=0.004, p_b_mw=0.015, p_c_mw=0.013, q_a_mvar=0.002, q_b_mvar=0.008, q_c_mvar=0.007, name='Load 834', type='delta') pp.create_asymmetric_load(net, bus_860, p_a_mw=0.016, p_b_mw=0.02, p_c_mw=0.11, q_a_mvar=0.008, q_b_mvar=0.01, q_c_mvar=0.055, name='Load 860', type='delta') pp.create_asymmetric_load(net, bus_836, p_a_mw=0.03, p_b_mw=0.01, p_c_mw=0.042, q_a_mvar=0.015, q_b_mvar=0.006, q_c_mvar=0.022, name='Load 836', type='delta') pp.create_asymmetric_load(net, bus_840, p_a_mw=0.018, p_b_mw=0.022, p_c_mw=0, q_a_mvar=0.009, q_b_mvar=0.011, q_c_mvar=0, name='Load 840', type='delta') pp.create_asymmetric_load(net, bus_838, p_a_mw=0, p_b_mw=0.028, p_c_mw=0, q_a_mvar=0, q_b_mvar=0.014, q_c_mvar=0, name='Load 838', type='wye') pp.create_asymmetric_load(net, bus_844, p_a_mw=0.009, p_b_mw=0, p_c_mw=0, q_a_mvar=0.005, q_b_mvar=0, q_c_mvar=0, name='Load 844', type='wye') pp.create_asymmetric_load(net, bus_846, p_a_mw=0, p_b_mw=0.025, p_c_mw=0.012, q_a_mvar=0, q_b_mvar=0.02, q_c_mvar=0.011, name='Load 846', type='wye') pp.create_asymmetric_load(net, bus_848, p_a_mw=0, p_b_mw=0.023, p_c_mw=0, q_a_mvar=0, q_b_mvar=0.011, q_c_mvar=0, name='Load 848', type='wye') pp.create_asymmetric_load(net, bus_860, p_a_mw=0.02, p_b_mw=0.02, p_c_mw=0.02, q_a_mvar=0.016, q_b_mvar=0.016, q_c_mvar=0.016, name='Load 860 spot', type='wye') pp.create_asymmetric_load(net, bus_840, p_a_mw=0.009, p_b_mw=0.009, p_c_mw=0.009, q_a_mvar=0.007, q_b_mvar=0.007, q_c_mvar=0.007, name='Load 840 spot', type='wye') pp.create_asymmetric_load(net, bus_844, p_a_mw=0.135, p_b_mw=0.135, p_c_mw=0.135, q_a_mvar=0.105, q_b_mvar=0.105, q_c_mvar=0.105, name='Load 844 spot', type='wye') pp.create_asymmetric_load(net, bus_848, p_a_mw=0.02, p_b_mw=0.02, p_c_mw=0.02, q_a_mvar=0.016, q_b_mvar=0.016, q_c_mvar=0.016, name='Load 848 spot', type='delta') pp.create_asymmetric_load(net, bus_890, p_a_mw=0.15, p_b_mw=0.15, p_c_mw=0.15, q_a_mvar=0.075, q_b_mvar=0.075, q_c_mvar=0.075, name='Load 890 spot', type='delta') pp.create_asymmetric_load(net, bus_830, p_a_mw=0.01, p_b_mw=0.01, p_c_mw=0.025, q_a_mvar=0.005, q_b_mvar=0.005, q_c_mvar=0.01, name='Load 830 spot', type='delta') # External grid pp.create_ext_grid(net, bus0, vm_pu=1.0, va_degree=0.0, s_sc_max_mva=10.0, s_sc_min_mva=10.0, rx_max=1, rx_min=1, r0x0_max=1, x0x_max=1) # Distributed generators pp.create_sgen(net, bus_848, p_mw=0.66, q_mvar=0.500, name='DG 1', max_p_mw=0.66, min_p_mw=0, max_q_mvar=0.5, min_q_mvar=0) pp.create_sgen(net, bus_890, p_mw=0.50, q_mvar=0.375, name='DG 2', max_p_mw=0.50, min_p_mw=0, max_q_mvar=0.375, min_q_mvar=0) pp.create_sgen(net, bus_822, p_mw=0.2, type='PV', name='PV 1', max_p_mw=0.2, min_p_mw=0, max_q_mvar=0, min_q_mvar=0) pp.create_sgen(net, bus_856, p_mw=0.2, type='PV', name='PV 2', max_p_mw=0.2, min_p_mw=0, max_q_mvar=0, min_q_mvar=0) pp.create_sgen(net, bus_838, p_mw=0.2, type='PV', name='PV 3', max_p_mw=0.2, min_p_mw=0, max_q_mvar=0, min_q_mvar=0) pp.create_sgen(net, bus_822, p_mw=0.3, type='WP', name='WP 1', max_p_mw=0.3, min_p_mw=0, max_q_mvar=0, min_q_mvar=0) pp.create_sgen(net, bus_826, p_mw=0.3, type='WP', name='WP 2', max_p_mw=0.3, min_p_mw=0, max_q_mvar=0, min_q_mvar=0) pp.create_sgen(net, bus_838, p_mw=0.3, type='WP', name='WP 3', max_p_mw=0.3, min_p_mw=0, max_q_mvar=0, min_q_mvar=0) # Shunt capacity bank pp.create_shunt(net, bus_840, q_mvar=-0.12, name='SCB 1', step=4, max_step=4) pp.create_shunt(net, bus_864, q_mvar=-0.12, name='SCB 2', step=4, max_step=4) # storage pp.create_storage(net, bus_810, p_mw=0.2, max_e_mwh=1.0, sn_mva=1.0, soc_percent=50, min_e_mwh=0.2, name='Storage') pp.add_zero_impedance_parameters(net) return net # net = case34_3ph() # pp.pf.runpp_3ph.runpp_3ph(net) # print(net.res_bus_3ph) # print(net.sn_mva)
#Create Generation Zone Buses Zone1Bus = pp.create_bus(net, vn_kv=500, name="Zone 1 Bus") Zone2Bus = pp.create_bus(net, vn_kv=500, name="Zone 2 Bus") Zone3Bus = pp.create_bus(net, vn_kv=500, name="Zone 3 Bus") Zone4Bus = pp.create_bus(net, vn_kv=500, name="Zone 4 Bus") Zone5Bus = pp.create_bus(net, vn_kv=GBV, name="Zone 5 Bus") Zone6Bus = pp.create_bus(net, vn_kv=500, name="Zone 6 Bus") Zone7Bus = pp.create_bus(net, vn_kv=500, name="Zone 7 Bus") Zone8Bus = pp.create_bus(net, vn_kv=500, name="Zone 8 Bus") #Create storage buses store_1 = pp.create_storage(net, Zone1Bus, p_mw=17 * 1000, max_e_mwh=100 * 1000, min_e_mwh=5.0 * 1000, name="Storage_1") store_2 = pp.create_storage(net, Zone2Bus, p_mw=15 * 1000, max_e_mwh=90 * 1000, min_e_mwh=5.0 * 1000, name="Storage_2") store_7 = pp.create_storage(net, Zone7Bus, p_mw=20 * 1000, max_e_mwh=120 * 1000, min_e_mwh=5.0 * 1000, name="Storage_7") store_8 = pp.create_storage(net,
pv_profile_raw = pd.read_csv("PVProfile1440.csv", sep=";", decimal=".") pv_profile_raw['pv_output_power_kw'] = pv_profile_raw['pv_output_power_kw'].apply( convertkWToMW).iloc[::10].reset_index(drop=True) pv_profile = fd.DFData(pd.DataFrame(pv_profile_raw)) sgen_controller = ConstControl( net, element='sgen', element_index=sgen_index, variable='p_mw', data_source=pv_profile, profile_name='pv_output_power_kw', recycle=False) # initialize storage elements storage_index = pp.create_storage( net, bus=row.bus, p_mw=0, max_e_mwh=0.0077, soc_percent=50, sn_mva=0.003, max_p_mw=0.003, min_p_mw=-0.003) storage_controller = ZeroTargetStorage( net, load_index=load_index, storage_index=storage_index, generator_index=sgen_index) time_steps = range(0, 144) ow = OutputWriter(net, output_path="./result", output_file_type=".csv") ow.log_variable("storage", "soc_percent", index=[0]) ow.log_variable("load", "p_mw", index=[0]) ow.log_variable("sgen", "p_mw", index=[0]) ow.log_variable("storage", "p_mw", index=[0])
# create empty net net = pp.create_empty_network() # create buses bus1 = pp.create_bus(net, vn_kv=20., name="Bus Grid 1") bus_trafo = pp.create_bus(net, vn_kv=0.4, name="Bus Trafo") bus_h1 = pp.create_bus(net, vn_kv=0.4, name="Bus House 1") bus_h2 = pp.create_bus(net, vn_kv=0.4, name="Bus House 2") # create bus elements pp.create_ext_grid(net, bus=bus1, vm_pu=1.0, name="Grid Connection") pp.create_load(net, bus=bus_h1, p_kw=0.1, q_kvar=0.005, name="H1 Load") pp.create_sgen(net, bus=bus_h1, p_kw=-0.1, name="H1 PV") pp.create_load(net, bus=bus_h2, p_kw=0.1, name="H2 Load") pp.create_storage(net, bus=bus_h2, p_kw=-0.1, max_e_kwh=3, name="H2 Storage") # create branch elements trafo = pp.create_transformer(net, hv_bus=bus1, lv_bus=bus_trafo, std_type="0.25 MVA 20/0.4 kV", name="Trafo") line = pp.create_line(net, from_bus=bus_h1, to_bus=bus_trafo, length_km=0.1, std_type="NAYY 4x150 SE", name="Line") line2 = pp.create_line(net, from_bus=bus_h2, to_bus=bus_trafo, length_km=0.1, std_type="NAYY 4x150 SE", name="Line") pp.runpp(net) print(net.res_load) print(net.res_sgen) print(net.res_trafo)
net = nw.create_cigre_network_mv("pv_wind") # set some limits min_vm_pu = 0.95 max_vm_pu = 1.05 net["bus"].loc[:, "min_vm_pu"] = min_vm_pu net["bus"].loc[:, "max_vm_pu"] = max_vm_pu net["line"].loc[:, "max_loading_percent"] = 100. # close all switches net.switch.loc[:, "closed"] = True # add storage to bus 10 pp.create_storage(net, 10, p_mw=0.5, max_e_mwh=.2, soc_percent=0., q_mvar=0., controllable=True) # net.load["controllable"] = False # net.sgen["controllable"] = False net["load"].loc[:, "type"] = "residential" net.sgen.loc[:, "type"] = "pv" net.sgen.loc[8, "type"] = "wind" input_file = r"C:\Users\x230\.julia\dev\PandaModels\test\pycodes\cigre_timeseries_15min.json" time_series = pd.read_json(input_file) time_series.sort_index(inplace=True) load_df = pd.DataFrame(time_series["residential"]).dot([net["load"]["p_mw"].values])
def simulate_network(scenario, installations_percent, cooperation_percent, installation_buses, cooperating_buses, individual_buses): scenario_name = get_scenario_name(scenario) full_dir_path = "data/results/{}/03-simulation/{}_installations/{}_cooperative".format( scenario_name, installations_percent, cooperation_percent) if os.path.exists(full_dir_path) and SKIP_EXISTING: if PRINT_SKIPPING_LINES: print("[{}] [{}%] [{}%] Simulating network... [skipping]".format( scenario_name, installations_percent, cooperation_percent)) return False print("[{}] [{}%] [{}%] Simulating network...".format( scenario_name, installations_percent, cooperation_percent)) net = ieee_european_lv_asymmetric('on_peak_566') for index, _ in net.asymmetric_load.iterrows(): net.asymmetric_load.in_service.at[index] = False pandapower.runpp(net) for original_index, row in buses.iterrows(): load_index = pandapower.create_load(net, bus=row.bus, p_mw=0) load_profile_raw = pandas.read_csv( "data/source/load_profiles/Load_profile_{}.csv".format( original_index + 1), sep=",", decimal=".") load_profile_raw['mult'] = load_profile_raw['mult'].apply( convertkWToMW).iloc[::10].reset_index(drop=True) load_profile = frame_data.DFData(pandas.DataFrame(load_profile_raw)) load_controller = ConstControl(net, element='load', element_index=load_index, variable='p_mw', data_source=load_profile, profile_name='mult', recycle=False) for original_index, row in installation_buses.iterrows(): if scenario.get('EV') == True: ev_index = pandapower.create_load(net, bus=row.bus, p_mw=0) ev_profile_raw = pandas.read_csv( "data/source/ev_profiles/EV_home_profiles_{}.csv".format( original_index + 1), sep=";", decimal=",") ev_profile_raw['load'] = ev_profile_raw['load'].apply( convert10minkWhTokW).apply(convertkWToMW) ev_profile = frame_data.DFData(pandas.DataFrame(ev_profile_raw)) ev_controller = ConstControl(net, element='load', element_index=ev_index, variable='p_mw', data_source=ev_profile, profile_name='load', recycle=False) if scenario.get('PV') == True: sgen_index = pandapower.create_sgen(net, bus=row.bus, p_mw=0, sn_mva=0, type='PV') pv_profile_raw = pandas.read_csv("data/source/PVProfile1440.csv", sep=";", decimal=".") pv_profile_raw['pv_output_power_kw'] = pv_profile_raw[ 'pv_output_power_kw'].apply( convertkWToMW).iloc[::10].reset_index(drop=True) pv_profile = frame_data.DFData(pandas.DataFrame(pv_profile_raw)) sgen_controller = ConstControl(net, element='sgen', element_index=sgen_index, variable='p_mw', data_source=pv_profile, profile_name='pv_output_power_kw', recycle=False) for original_index, row in cooperating_buses.iterrows(): storage_index = pandapower.create_storage( net, bus=row.bus, p_mw=0, max_e_mwh=BATTERY_ENERGY_MAX / 1000.0, soc_percent=(INITIAL_BATTERY_CHARGE / BATTERY_ENERGY_MAX) * 100.0, max_p_mw=RATED_P / 1000.0, min_p_mw=-RATED_P / 1000.0) storage_profile_raw = pandas.read_csv( "data/results/{}/02-collective/{}_installations/{}_cooperation/Storage_profile_{}.csv" .format(scenario_name, installations_percent, cooperation_percent, original_index + 1), sep=",", decimal=".") storage_profile_raw['power_kW'] = storage_profile_raw[ 'power_kW'].apply(convertkWToMW).apply(convertStorage) storage_profile = frame_data.DFData( pandas.DataFrame(storage_profile_raw)) storage_controller = ConstControl(net, element='storage', element_index=storage_index, variable='p_mw', data_source=storage_profile, profile_name='power_kW', recycle=False) for original_index, row in individual_buses.iterrows(): storage_index = pandapower.create_storage( net, bus=row.bus, p_mw=0, max_e_mwh=BATTERY_ENERGY_MAX / 1000.0, soc_percent=(INITIAL_BATTERY_CHARGE / BATTERY_ENERGY_MAX) * 100.0, max_p_mw=RATED_P / 1000.0, min_p_mw=-RATED_P / 1000.0) storage_profile_raw = pandas.read_csv( "data/results/{}/01-individual/storage-profiles/Storage_profile_{}.csv" .format(scenario_name, original_index + 1), sep=",", decimal=".") storage_profile_raw['power_kW'] = storage_profile_raw[ 'power_kW'].apply(convertkWToMW).apply(convertStorage) storage_profile = frame_data.DFData( pandas.DataFrame(storage_profile_raw)) storage_controller = ConstControl(net, element='storage', element_index=storage_index, variable='p_mw', data_source=storage_profile, profile_name='power_kW', recycle=False) time_steps = range(0, T) ow = OutputWriter(net, output_path=full_dir_path, output_file_type=".csv", log_variables=[]) ow.log_variable("load", "p_mw") ow.log_variable("res_bus", "vm_pu", index=buses_nodes) ow.log_variable("res_line", "p_to_mw", index=line_nodes) ow.log_variable("res_trafo", "vm_lv_pu") ow.log_variable("res_trafo", "p_lv_mw") if scenario.get('PV') == True: ow.log_variable("sgen", "p_mw") if cooperating_buses.size > 0 or individual_buses.size > 0: ow.log_variable("storage", "p_mw") run_timeseries(net, time_steps, continue_on_divergence=True, verbose=False) return True
def case34(): """ Create the IEEE 34 bus from IEEE PES Test Feeders: "https://site.ieee.org/pes-testfeeders/resources/”. OUTPUT: **net** - The pandapower format network. """ net = pp.create_empty_network() # Linedata # CF-300 line_data = { 'c_nf_per_km': 3.8250977, 'r_ohm_per_km': 0.69599766, 'x_ohm_per_km': 0.5177677, 'c0_nf_per_km': 1.86976748, 'r0_ohm_per_km': 1.08727498, 'x0_ohm_per_km': 1.47374703, 'max_i_ka': 0.23, 'type': 'ol' } pp.create_std_type(net, line_data, name='CF-300', element='line') # CF-301 line_data = { 'c_nf_per_km': 3.66884364, 'r_ohm_per_km': 1.05015841, 'x_ohm_per_km': 0.52265586, 'c0_nf_per_km': 1.82231544, 'r0_ohm_per_km': 1.48350255, 'x0_ohm_per_km': 1.60203942, 'max_i_ka': 0.18, 'type': 'ol' } pp.create_std_type(net, line_data, name='CF-301', element='line') # CF-302 line_data = { 'c_nf_per_km': 0.8751182, 'r_ohm_per_km': 0.5798427, 'x_ohm_per_km': 0.30768221, 'c0_nf_per_km': 0.8751182, 'r0_ohm_per_km': 0.5798427, 'x0_ohm_per_km': 0.30768221, 'max_i_ka': 0.14, 'type': 'ol' } pp.create_std_type(net, line_data, name='CF-302', element='line') # CF-303 line_data = { 'c_nf_per_km': 0.8751182, 'r_ohm_per_km': 0.5798427, 'x_ohm_per_km': 0.30768221, 'c0_nf_per_km': 0.8751182, 'r0_ohm_per_km': 0.5798427, 'x0_ohm_per_km': 0.30768221, 'max_i_ka': 0.14, 'type': 'ol' } pp.create_std_type(net, line_data, name='CF-303', element='line') # CF-304 line_data = { 'c_nf_per_km': 0.90382554, 'r_ohm_per_km': 0.39802955, 'x_ohm_per_km': 0.29436416, 'c0_nf_per_km': 0.90382554, 'r0_ohm_per_km': 0.39802955, 'x0_ohm_per_km': 0.29436416, 'max_i_ka': 0.18, 'type': 'ol' } pp.create_std_type(net, line_data, name='CF-304', element='line') # Busses # bus0 = pp.create_bus(net, name='Bus 0', vn_kv=69.0, type='n', zone='34_BUS') bus_800 = pp.create_bus(net, name='Bus 800', vn_kv=24.9, type='n', zone='34_BUS') bus_802 = pp.create_bus(net, name='Bus 802', vn_kv=24.9, type='n', zone='34_BUS') bus_806 = pp.create_bus(net, name='Bus 806', vn_kv=24.9, type='n', zone='34_BUS') bus_808 = pp.create_bus(net, name='Bus 808', vn_kv=24.9, type='n', zone='34_BUS') bus_810 = pp.create_bus(net, name='Bus 810', vn_kv=24.9, type='n', zone='34_BUS') bus_812 = pp.create_bus(net, name='Bus 812', vn_kv=24.9, type='n', zone='34_BUS') bus_814 = pp.create_bus(net, name='Bus 814', vn_kv=24.9, type='n', zone='34_BUS') bus_850 = pp.create_bus(net, name='Bus 850', vn_kv=24.9, type='n', zone='34_BUS') bus_816 = pp.create_bus(net, name='Bus 816', vn_kv=24.9, type='n', zone='34_BUS') bus_818 = pp.create_bus(net, name='Bus 818', vn_kv=24.9, type='n', zone='34_BUS') bus_820 = pp.create_bus(net, name='Bus 820', vn_kv=24.9, type='n', zone='34_BUS') bus_822 = pp.create_bus(net, name='Bus 822', vn_kv=24.9, type='n', zone='34_BUS') bus_824 = pp.create_bus(net, name='Bus 824', vn_kv=24.9, type='n', zone='34_BUS') bus_826 = pp.create_bus(net, name='Bus 826', vn_kv=24.9, type='n', zone='34_BUS') bus_828 = pp.create_bus(net, name='Bus 828', vn_kv=24.9, type='n', zone='34_BUS') bus_830 = pp.create_bus(net, name='Bus 830', vn_kv=24.9, type='n', zone='34_BUS') bus_854 = pp.create_bus(net, name='Bus 854', vn_kv=24.9, type='n', zone='34_BUS') bus_852 = pp.create_bus(net, name='Bus 852', vn_kv=24.9, type='n', zone='34_BUS') bus_832 = pp.create_bus(net, name='Bus 832', vn_kv=24.9, type='n', zone='34_BUS') bus_858 = pp.create_bus(net, name='Bus 858', vn_kv=24.9, type='n', zone='34_BUS') bus_834 = pp.create_bus(net, name='Bus 834', vn_kv=24.9, type='n', zone='34_BUS') bus_842 = pp.create_bus(net, name='Bus 842', vn_kv=24.9, type='n', zone='34_BUS') bus_844 = pp.create_bus(net, name='Bus 844', vn_kv=24.9, type='n', zone='34_BUS') bus_846 = pp.create_bus(net, name='Bus 846', vn_kv=24.9, type='n', zone='34_BUS') bus_848 = pp.create_bus(net, name='Bus 848', vn_kv=24.9, type='n', zone='34_BUS') bus_860 = pp.create_bus(net, name='Bus 860', vn_kv=24.9, type='n', zone='34_BUS') bus_836 = pp.create_bus(net, name='Bus 836', vn_kv=24.9, type='n', zone='34_BUS') bus_840 = pp.create_bus(net, name='Bus 840', vn_kv=24.9, type='n', zone='34_BUS') bus_862 = pp.create_bus(net, name='Bus 862', vn_kv=24.9, type='n', zone='34_BUS') bus_838 = pp.create_bus(net, name='Bus 838', vn_kv=24.9, type='n', zone='34_BUS') bus_864 = pp.create_bus(net, name='Bus 864', vn_kv=24.9, type='n', zone='34_BUS') bus_888 = pp.create_bus(net, name='Bus 888', vn_kv=4.16, type='n', zone='34_BUS') bus_890 = pp.create_bus(net, name='Bus 890', vn_kv=4.16, type='n', zone='34_BUS') bus_856 = pp.create_bus(net, name='Bus 856', vn_kv=24.9, type='n', zone='34_BUS') # Lines pp.create_line(net, bus_800, bus_802, length_km=0.786384, std_type='CF-300', name='Line 0') pp.create_line(net, bus_802, bus_806, length_km=0.527304, std_type='CF-300', name='Line 1') pp.create_line(net, bus_806, bus_808, length_km=9.823704, std_type='CF-300', name='Line 2') pp.create_line(net, bus_808, bus_810, length_km=1.769059, std_type='CF-303', name='Line 3') pp.create_line(net, bus_808, bus_812, length_km=11.43000, std_type='CF-300', name='Line 4') pp.create_line(net, bus_812, bus_814, length_km=9.061704, std_type='CF-300', name='Line 5') # pp.create_line(net, bus_814, bus_850, length_km=0.003048, std_type='CF-301', name='Line 6') pp.create_line(net, bus_816, bus_818, length_km=0.521208, std_type='CF-302', name='Line 7') pp.create_line(net, bus_816, bus_824, length_km=3.112008, std_type='CF-301', name='Line 8') pp.create_line(net, bus_818, bus_820, length_km=14.67612, std_type='CF-302', name='Line 9') pp.create_line(net, bus_820, bus_822, length_km=4.187952, std_type='CF-302', name='Line 10') pp.create_line(net, bus_824, bus_826, length_km=0.923544, std_type='CF-303', name='Line 11') pp.create_line(net, bus_824, bus_828, length_km=0.256032, std_type='CF-301', name='Line 12') pp.create_line(net, bus_828, bus_830, length_km=6.230112, std_type='CF-301', name='Line 13') pp.create_line(net, bus_830, bus_854, length_km=0.158496, std_type='CF-301', name='Line 14') pp.create_line(net, bus_832, bus_858, length_km=1.493520, std_type='CF-301', name='Line 15') pp.create_line(net, bus_834, bus_860, length_km=0.615696, std_type='CF-301', name='Line 16') pp.create_line(net, bus_834, bus_842, length_km=0.085344, std_type='CF-301', name='Line 17') pp.create_line(net, bus_836, bus_840, length_km=0.262128, std_type='CF-301', name='Line 18') pp.create_line(net, bus_836, bus_862, length_km=0.085344, std_type='CF-301', name='Line 19') pp.create_line(net, bus_842, bus_844, length_km=0.411480, std_type='CF-301', name='Line 20') pp.create_line(net, bus_844, bus_846, length_km=1.109472, std_type='CF-301', name='Line 21') pp.create_line(net, bus_846, bus_848, length_km=0.161544, std_type='CF-301', name='Line 22') pp.create_line(net, bus_850, bus_816, length_km=0.094488, std_type='CF-301', name='Line 23') # pp.create_line(net, bus_852, bus_832, length_km=0.003048, std_type='CF-301', name='Line 24') pp.create_line(net, bus_854, bus_856, length_km=7.110984, std_type='CF-303', name='Line 25') pp.create_line(net, bus_854, bus_852, length_km=11.22578, std_type='CF-301', name='Line 26') pp.create_line(net, bus_858, bus_864, length_km=0.493776, std_type='CF-302', name='Line 27') pp.create_line(net, bus_858, bus_834, length_km=1.776984, std_type='CF-301', name='Line 28') pp.create_line(net, bus_860, bus_836, length_km=0.816864, std_type='CF-301', name='Line 29') pp.create_line(net, bus_860, bus_838, length_km=1.481328, std_type='CF-304', name='Line 30') pp.create_line(net, bus_888, bus_890, length_km=3.218688, std_type='CF-300', name='Line 31') # Regulator 1 pp.create_transformer_from_parameters(net, bus_814, bus_850, sn_mva=2.5, vn_hv_kv=24.9, vn_lv_kv=24.9, vkr_percent=0.320088 * 2.5, vk_percent=0.357539 * 2.5, pfe_kw=0.0, i0_percent=0.0, shift_degree=0.0, tap_side='lv', tap_neutral=0, tap_max=16, tap_min=-16, tap_step_percent=0.625, tap_pos=0, tap_phase_shifter=False, name='Regulator 1') # Regulator 2 pp.create_transformer_from_parameters(net, bus_852, bus_832, sn_mva=2.5, vn_hv_kv=24.9, vn_lv_kv=24.9, vkr_percent=0.320088 * 2.5, vk_percent=0.357539 * 2.5, pfe_kw=0.0, i0_percent=0.0, shift_degree=0.0, tap_side='lv', tap_neutral=0, tap_max=16, tap_min=-16, tap_step_percent=0.625, tap_pos=0, tap_phase_shifter=False, name='Regulator 2') # # Substation # pp.create_transformer_from_parameters(net, bus0, bus_800, sn_mva=2.5, vn_hv_kv=69.0, # vn_lv_kv=24.9, vkr_percent=1.0, vk_percent=8.062257, # pfe_kw=0.0, i0_percent=0.0, shift_degree=0.0, # tap_side='lv', tap_neutral=0, tap_max=2, tap_min=-2, # tap_step_percent=2.5, tap_pos=0, tap_phase_shifter=False, # name='Substation') # Traformer pp.create_transformer_from_parameters(net, bus_832, bus_888, sn_mva=0.5, vn_hv_kv=24.9, vn_lv_kv=4.16, vkr_percent=1.9, vk_percent=4.5, pfe_kw=0.0, i0_percent=0.0, shift_degree=0.0, name='Transformer 1') # Loads pp.create_load(net, bus_806, p_mw=0.055, q_mvar=0.029, name='Load 806') pp.create_load(net, bus_810, p_mw=0.016, q_mvar=0.008, name='Load 810') pp.create_load(net, bus_820, p_mw=0.034, q_mvar=0.017, name='Load 820') pp.create_load(net, bus_822, p_mw=0.135, q_mvar=0.070, name='Load 822') pp.create_load(net, bus_824, p_mw=0.005, q_mvar=0.002, name='Load 824') pp.create_load(net, bus_826, p_mw=0.004, q_mvar=0.020, name='Load 826') pp.create_load(net, bus_828, p_mw=0.004, q_mvar=0.002, name='Load 828') pp.create_load(net, bus_830, p_mw=0.007, q_mvar=0.003, name='Load 830') pp.create_load(net, bus_856, p_mw=0.004, q_mvar=0.002, name='Load 856') pp.create_load(net, bus_858, p_mw=0.015, q_mvar=0.007, name='Load 858') pp.create_load(net, bus_864, p_mw=0.002, q_mvar=0.001, name='Load 864') pp.create_load(net, bus_834, p_mw=0.032, q_mvar=0.017, name='Load 834') pp.create_load(net, bus_860, p_mw=0.029, q_mvar=0.073, name='Load 860') pp.create_load(net, bus_836, p_mw=0.082, q_mvar=0.043, name='Load 836') pp.create_load(net, bus_840, p_mw=0.040, q_mvar=0.020, name='Load 840') pp.create_load(net, bus_838, p_mw=0.028, q_mvar=0.014, name='Load 838') pp.create_load(net, bus_844, p_mw=0.009, q_mvar=0.005, name='Load 844') pp.create_load(net, bus_846, p_mw=0.037, q_mvar=0.031, name='Load 846') pp.create_load(net, bus_848, p_mw=0.023, q_mvar=0.011, name='Load 848') pp.create_load(net, bus_860, p_mw=0.060, q_mvar=0.048, name='Load 860 spot') pp.create_load(net, bus_840, p_mw=0.027, q_mvar=0.021, name='Load 840 spot') pp.create_load(net, bus_844, p_mw=0.405, q_mvar=0.315, name='Load 844 spot') pp.create_load(net, bus_848, p_mw=0.060, q_mvar=0.048, name='Load 848 spot') pp.create_load(net, bus_890, p_mw=0.450, q_mvar=0.225, name='Load 890 spot') pp.create_load(net, bus_830, p_mw=0.045, q_mvar=0.020, name='Load 830 spot') # External grid pp.create_ext_grid(net, bus_800, vm_pu=1.0, va_degree=0.0, s_sc_max_mva=10.0, s_sc_min_mva=10.0, rx_max=1, rx_min=1, r0x0_max=1, x0x_max=1) # Distributed generators pp.create_sgen(net, bus_848, p_mw=0.66, q_mvar=0.500, name='DG 1', max_p_mw=0.66, min_p_mw=0, max_q_mvar=0.5, min_q_mvar=0) pp.create_sgen(net, bus_890, p_mw=0.50, q_mvar=0.375, name='DG 2', max_p_mw=0.50, min_p_mw=0, max_q_mvar=0.375, min_q_mvar=0) pp.create_sgen(net, bus_822, p_mw=0.1, type='PV', name='PV 1', max_p_mw=0.1, min_p_mw=0, max_q_mvar=0, min_q_mvar=0) pp.create_sgen(net, bus_856, p_mw=0.1, type='PV', name='PV 2', max_p_mw=0.1, min_p_mw=0, max_q_mvar=0, min_q_mvar=0) pp.create_sgen(net, bus_838, p_mw=0.1, type='PV', name='PV 3', max_p_mw=0.1, min_p_mw=0, max_q_mvar=0, min_q_mvar=0) pp.create_sgen(net, bus_822, p_mw=0.1, type='WP', name='WP 1', max_p_mw=0.1, min_p_mw=0, max_q_mvar=0, min_q_mvar=0) pp.create_sgen(net, bus_826, p_mw=0.1, type='WP', name='WP 2', max_p_mw=0.1, min_p_mw=0, max_q_mvar=0, min_q_mvar=0) pp.create_sgen(net, bus_838, p_mw=0.1, type='WP', name='WP 3', max_p_mw=0.1, min_p_mw=0, max_q_mvar=0, min_q_mvar=0) # Shunt capacity bank pp.create_shunt(net, bus_840, q_mvar=-0.12, name='SCB 1', step=4, max_step=4) pp.create_shunt(net, bus_864, q_mvar=-0.12, name='SCB 2', step=4, max_step=4) # storage pp.create_storage(net, bus_810, p_mw=0.5, max_e_mwh=2, sn_mva=1.0, soc_percent=50, min_e_mwh=0.2, name='Storage') return net # net = case34() # pp.runpp(net) # print(net.res_bus) # print(net.res_ext_grid) # print(net.trafo) # print(net.res_load['p_mw'].values.sum()) # import numpy as np # import pandas as pd # import pandapower.control as control # import pandapower.networks as nw # import pandapower.timeseries as timeseries # from pandapower.timeseries.data_sources.frame_data import DFData # # number of time steps # n_ts = 95 # # df = pd.read_csv("load_timeseries.csv") # # create a DataFrame with some random time series as an example # df = pd.DataFrame(np.random.normal(1., 0.1, size=(n_ts, len(net.load.index))), # index=list(range(n_ts)), columns=net.load.index) * net.load.p_mw.values # ds = DFData(df) # const_load = control.ConstControl(net, element='load', element_index=net.load.index, # variable='p_mw', data_source=ds, profile_name=net.load.index) # # initialising the outputwriter to save data to excel files in the current folder. You can change this to .json, .csv, or .pickle as well # ow = timeseries.OutputWriter(net, output_path="./", output_file_type=".xlsx") # # adding vm_pu of all buses and line_loading in percent of all lines as outputs to be stored # ow.log_variable('res_bus', 'vm_pu') # ow.log_variable('res_line', 'loading_percent') # # starting the timeseries simulation for one day -> 96 15 min values. # timeseries.run_timeseries(net) # # now checkout the folders res_bus and res_line in your current working dir # # number of time steps # n_ts = 1 # # df = pd.read_csv("load_timeseries.csv") # # create a DataFrame with some random time series as an example # df = pd.DataFrame(np.array([[0,0]]), # index=list(range(n_ts)), columns=net.trafo.index[1:]) # ds = DFData(df) # const_load = control.ConstControl(net, element='trafo', element_index=net.trafo.index[1:], # variable='tap_pos', data_source=ds, profile_name=net.trafo.index[1:]) # # initialising the outputwriter to save data to excel files in the current folder. You can change this to .json, .csv, or .pickle as well # ow = timeseries.OutputWriter(net, output_path="./", output_file_type=".xlsx") # # adding vm_pu of all buses and line_loading in percent of all lines as outputs to be stored # ow.log_variable('res_bus', 'vm_pu') # ow.log_variable('res_line', 'loading_percent') # ow.log_variable('res_trafo', 'tap_pos') # # starting the timeseries simulation for one day -> 96 15 min values. # timeseries.run_timeseries(net) # # now checkout the folders res_bus and res_line in your current working dir
def sim_request(data): is_three_phase = utils.get_or_error("3phase", data) elements_dict = utils.get_or_error("elements", data) buses = {} # Used for matching bus UUIDs to index def process_potential_bus(key, value): """ Inner method for processing a positional argument that could be a bus This function checks if the value is in the bus keys. This should never cause issues so long as UUID's aren't used for any other purpose except for bus identification and as long as there are no UUID collisions. Both of those cases seem exceptionally unlikely, so this should work fine. """ if value in buses.keys(): return buses[value] else: return value bus_list = [(uuid, element) for uuid, element in elements_dict.items() if utils.get_or_error("etype", element) == "bus"] element_list = [(uuid, element) for uuid, element in elements_dict.items() if utils.get_or_error("etype", element) != "bus" and utils.get_or_error("etype", element) != "switch"] switch_list = [(uuid, element) for uuid, element in elements_dict.items() if utils.get_or_error("etype", element) == "switch"] net = pp.create_empty_network() for uuid, bus in bus_list: element_type = "bus" req_props = utils.required_props[element_type] positional_args = [ value for key, value in bus.items() if key in req_props ] optional_args = { key: value for key, value in bus.items() if (not key in req_props) and (not key == "etype")} index = pp.create_bus(net, *positional_args, **optional_args, name=uuid) buses[uuid] = index for uuid, element in element_list: element_type = utils.get_or_error("etype", element) req_props = utils.required_props[element_type] positional_args = [process_potential_bus(key, value) for key, value in element.items() if key in req_props] optional_args = { key: value for key, value in element.items() if (not key in req_props) and (not key == "etype")} if element_type == "load": pp.create_load(net, *positional_args, **optional_args, name=uuid) elif element_type == "gen": pp.create_gen(net, *positional_args, **optional_args, name=uuid) elif element_type == "ext_grid": pp.create_ext_grid(net, *positional_args, **optional_args, name=uuid) elif element_type == "line": pp.create_line(net, *positional_args, *optional_args, name=uuid) elif element_type == "trafo": pp.create_transformer_from_parameters(net, *positional_args, **optional_args, name=uuid) elif element_type == "storage": pp.create_storage(net, *positional_args, **optional_args, name=uuid) else: raise InvalidError(f"Element type {element_type} is invalid or not implemented!") for uuid, switch in switch_list: element_type = "switch" req_props = utils.required_props[element_type] positional_args = [process_potential_bus(key, value) for key, value in element.items() if key in req_props] optional_args = { key: value for key, value in element.items() if (not key in req_props) and (not key == "etype")} et = positional_args[2] if et == "b": pass # This is handled by process_potential_buses if et == "l": positional_args[1] = pp.get_element_index(net, "line", positional_args[1]) elif et == "t": positional_args[1] = pp.get_element_index(net, "trafo", positional_args[1]) elif et == "t3": positional_args[1] = pp.get_element_index(net, "trafo3w", positional_args[1]) else: raise InvalidError(f"Invalid element type {et}. Must be b,l,t, or t3.") pp.create_switch(net, *positional_args, **optional_args, name=uuid) try: if is_three_phase: pp.runpp_3ph(net) else: pp.runpp(net) except LoadflowNotConverged: report = pp.diagnostic(net, report_style="compact", warnings_only=True) raise ConvError("Load flow did not converge.") except (KeyError, ValueError) as e: raise PPError(str(e)) except Exception as e: raise PPError("Unknown exception has occured: " + str(e)) message = {} message["status"] = "SIM_RESULT" results = {} for uuid,element in elements_dict.items(): element_type = elements_dict[uuid]["etype"] if element_type == "switch": continue net["res_" + element_type] = net["res_" + element_type].fillna(0) results[uuid] = {} results[uuid]["etype"] = element_type index = pp.get_element_index(net, element_type, uuid, exact_match=True) results[uuid].update(net["res_" + element_type].iloc[index].to_dict()) message["elements"] = results return json.dumps(message)
obstacle_height=obstacle_height, hellman_exp=hellman_exp)) vpp.components[list(vpp.components.keys())[-1]].prepare_time_series() #%% create elements in the pandapower.net for bus in vpp.buses_with_pv: pp.create_sgen(net, bus=net.bus[net.bus.name == bus].index[0], p_mw=(vpp.components[bus+'_PV'].module.Impo*vpp.components[bus+'_PV'].module.Vmpo/1000000), name=(bus+'_PV'), type='PV') for bus in vpp.buses_with_storage: pp.create_storage(net, bus=net.bus[net.bus.name == bus].index[0], p_mw=0, max_e_mwh=capacity, name=(bus+'_storage'), type='LiIon') for bus in vpp.buses_with_bev: pp.create_load(net, bus=net.bus[net.bus.name == bus].index[0], p_mw=(vpp.components[bus+'_BEV'].charging_power/1000), name=(bus+'_BEV'), type='BEV') for bus in vpp.buses_with_hp: pp.create_load(net, bus=net.bus[net.bus.name == bus].index[0], p_mw=(vpp.components[bus+'_HP'].el_power/1000), name=(bus+'_HP'), type='HP') for bus in vpp.buses_with_wind: pp.create_sgen(net, bus=net.bus[net.bus.name == bus].index[0], p_mw=(vpp.components[bus+'_Wind'].wind_turbine.nominal_power/1000000),
net = pp.create_empty_network() # create buses bus1 = pp.create_bus(net, vn_kv=20., name="Bus Grid 1") bus_trafo = pp.create_bus(net, vn_kv=0.4, name="Bus Trafo") bus_h1 = pp.create_bus(net, vn_kv=0.4, name="Bus House 1") bus_h2 = pp.create_bus(net, vn_kv=0.4, name="Bus House 2") # create bus elements pp.create_ext_grid(net, bus=bus1, vm_pu=1.0, name="Grid Connection") pp.create_load(net, bus=bus_h1, p_mw=0.1e-3, q_mvar=0.005e-3, name="H1 Load") pp.create_sgen(net, bus=bus_h1, p_mw=-0.1e-3, name="H1 PV") pp.create_load(net, bus=bus_h2, p_mw=0.1e-3, name="H2 Load") pp.create_storage(net, bus=bus_h2, p_mw=-0.1e-3, max_e_mwh=3e-3, name="H2 Storage") # create branch elements trafo = pp.create_transformer(net, hv_bus=bus1, lv_bus=bus_trafo, std_type="0.25 MVA 20/0.4 kV", name="Trafo") line = pp.create_line(net, from_bus=bus_h1, to_bus=bus_trafo, length_km=0.1, std_type="NAYY 4x150 SE", name="Line")
def test_storage_opf(): """ Testing a simple network with storage to ensure the correct behaviour of the storage OPF-Functions """ # boundaries vm_max = 1.1 vm_min = 0.9 max_line_loading_percent = 100 # create network net = pp.create_empty_network() b1 = pp.create_bus(net, vn_kv=0.4, max_vm_pu=vm_max, min_vm_pu=vm_min) b2 = pp.create_bus(net, vn_kv=0.4, max_vm_pu=vm_max, min_vm_pu=vm_min) pp.create_line(net, b1, b2, length_km=5, std_type="NAYY 4x50 SE", max_loading_percent=max_line_loading_percent) # test elements static pp.create_ext_grid(net, b2) pp.create_load(net, b1, p_mw=0.0075, controllable=False) pp.create_sgen(net, b1, p_mw=0.025, controllable=True, min_p_mw=0.01, max_p_mw=0.025, max_q_mvar=0.025, min_q_mvar=-0.025) # test elements pp.create_storage(net, b1, p_mw=-.0025, max_e_mwh=50, controllable=True, max_p_mw=0, min_p_mw=-0.025, max_q_mvar=0.025, min_q_mvar=-0.025) pp.create_sgen(net, b1, p_mw=0.025, controllable=True, min_p_mw=0, max_p_mw=0.025, max_q_mvar=0.025, min_q_mvar=-0.025) pp.create_load(net, b1, p_mw=0.025, controllable=True, max_p_mw=0.025, min_p_mw=0, max_q_mvar=0.025, min_q_mvar=-0.025) # costs pp.create_poly_cost(net, 0, "ext_grid", cp1_eur_per_mw=3) pp.create_poly_cost(net, 0, "sgen", cp1_eur_per_mw=2) pp.create_poly_cost(net, 0, "storage", cp1_eur_per_mw=-1) pp.create_poly_cost(net, 1, "sgen", cp1_eur_per_mw=1) pp.create_poly_cost(net, 1, "load", cp1_eur_per_mw=-3) # test storage generator behaviour net["storage"].in_service.iloc[0] = True net["storage"].p_mw.iloc[0] = -0.025 net["sgen"].in_service.iloc[1] = False net["load"].in_service.iloc[1] = False pp.runopp(net) assert net["OPF_converged"] res_stor_p_mw = net["res_storage"].p_mw.iloc[0] res_stor_q_mvar = net["res_storage"].q_mvar.iloc[0] res_cost_stor = net["res_cost"] net["storage"].in_service.iloc[0] = False net["storage"].p_mw.iloc[0] = -0.025 net["sgen"].in_service.iloc[1] = True net["load"].in_service.iloc[1] = False pp.runopp(net, ) assert net["OPF_converged"] res_sgen_p_mw = net["res_sgen"].p_mw.iloc[1] res_sgen_q_mvar = net["res_sgen"].q_mvar.iloc[1] res_cost_sgen = net["res_cost"] # assert storage generator behaviour assert np.isclose(res_stor_p_mw, -res_sgen_p_mw) assert np.isclose(res_stor_q_mvar, -res_sgen_q_mvar) assert np.isclose(res_cost_stor, res_cost_sgen) # test storage load behaviour net["storage"].in_service.iloc[0] = True net["storage"].p_mw.iloc[0] = 0.025 net["storage"].max_p_mw.iloc[0] = 0.025 net["storage"].min_p_mw.iloc[0] = 0 net["storage"].max_q_mvar.iloc[0] = 0.025 net["storage"].min_q_mvar.iloc[0] = -0.025 # gencost for storages: positive costs in pandapower per definition # --> storage gencosts are similar to sgen gencosts (make_objective.py, l.128ff. and l.185ff.) net["poly_cost"].cp1_eur_per_mw.iloc[2] = net.poly_cost.cp1_eur_per_mw.iloc[4] net["sgen"].in_service.iloc[1] = False net["load"].in_service.iloc[1] = False pp.runopp(net) assert net["OPF_converged"] res_stor_p_mw = net["res_storage"].p_mw.iloc[0] res_stor_q_mvar = net["res_storage"].q_mvar.iloc[0] res_cost_stor = net["res_cost"] net["storage"].in_service.iloc[0] = False net["storage"].p_mw.iloc[0] = 0.025 net["sgen"].in_service.iloc[1] = False net["load"].in_service.iloc[1] = True pp.runopp(net) assert net["OPF_converged"] res_load_p_mw = net["res_load"].p_mw.iloc[1] res_load_q_mvar = net["res_load"].q_mvar.iloc[1] res_cost_load = net["res_cost"] # assert storage load behaviour assert np.isclose(res_stor_p_mw, res_load_p_mw) assert np.isclose(res_stor_q_mvar, res_load_q_mvar) assert np.isclose(res_cost_stor, res_cost_load)
def create_network(): # carga la red de cigre de baja tensión y la modifica acrode a nuestros interese # retorna un objeto pandapower y la matriz de resistencias r y de reactancias x net = pn.create_cigre_network_lv() # Eliminar cargas que no se usarán for index in net.load.index: if not net.load['name'][index][5] == 'R': net.load.drop(index, inplace=True) net.load.drop(0, inplace=True) # Eliminar todos los switches y crear uno nuevo for index in net.switch.index: net.switch.drop(index, inplace=True) pp.create_switch(net, bus=2, element=0, et='l', closed=True, type='CB', z_ohm=0.0) pp.create_switch(net, bus=5, element=3, et='l', closed=True, type='CB', z_ohm=0.0) # Eliminar trafos que no se usarán for index in net.trafo.index: if not net.trafo['name'][index] == 'Trafo R0-R1': net.trafo.drop(index, inplace=True) # Eliminar lineas que no se usarán for index in net.line.index: if not net.line['name'][index][5] == 'R': net.line.drop(index, inplace=True) # Eliminar buses que no se usarán for index in net.bus.index: if not net.bus['name'][index][4] == 'R': net.bus.drop(index, inplace=True) net.bus_geodata.drop(index, inplace=True) # Cambio de lugar de la external grid net.ext_grid['bus'] = 1 # Agregar nodo 20 y linea respectiva pp.create_bus(net, vn_kv=0.4, index=20, type='m', zone='CIGRE_LV', in_service=True, geodata=(7, -1)) pp.create_line_from_parameters(net, from_bus=5, to_bus=20, std_type='UG3', length_km=0.030, r_ohm_per_km=0.822, x_ohm_per_km=0.0847, c_nf_per_km=0.0, g_us_per_km=0.0, max_i_ka=1.0) # Agregar GD pp.create_sgen(net, bus=16, p_mw=0.030, q_mvar=0.0, name='Microturbina', scaling=1.0, type='CHP', index=1, in_service=False) pp.create_sgen(net, bus=17, p_mw=0.010, q_mvar=0.0, name='WT', scaling=1.0, type='WP', index=2, in_service=False) pp.create_sgen(net, bus=17, p_mw=0.010, q_mvar=0.0, name='PV1', scaling=1.0, type='PV', index=3, in_service=True) pp.create_sgen(net, bus=18, p_mw=0.003, q_mvar=0.0, name='PV2', scaling=1.0, type='PV', index=4, in_service=True) pp.create_sgen(net, bus=19, p_mw=0.010, q_mvar=0.0, name='Celda combustible', scaling=1.0, type='CHP', index=5, in_service=False) pp.create_storage(net, bus=20, p_mw=0.03, max_e_mwh=0.060, q_mvar=0, min_e_mwh=0.012, in_service=False) # Cambiar consumos S_loads = [0.015, 0.072, 0.050, 0.015, 0.047] cos_phi = 0.85 for i in net.load.index: net.load['p_mw'][i] = S_loads[i - 1] * cos_phi net.load['q_mvar'][i] = S_loads[i - 1] * np.sqrt(1 - np.square(cos_phi)) # Modificar Geodata de los buses para graficar y = np.array( [11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 8, 7, 7, 7, 6, 5, 2, 1, 7]) x = np.array( [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 1, 2, 3, 3, -1, 1, -1, -1]) net.bus_geodata['x'] = 0.3 * x net.bus_geodata['y'] = 0.3 * y Zn = ((0.4 * 1e3)**2) / (net.sn_mva * 1e6) r = np.zeros((len(net.bus), len(net.bus))) x = np.zeros((len(net.bus), len(net.bus))) for index in net.line.index: r_line = net.line['r_ohm_per_km'][index] * net.line['length_km'][ index] / Zn x_line = net.line['x_ohm_per_km'][index] * net.line['length_km'][ index] / Zn r[net.line['from_bus'][index] - 1, net.line['to_bus'][index] - 1] = r_line x[net.line['from_bus'][index] - 1, net.line['to_bus'][index] - 1] = x_line r[net.line['to_bus'][index] - 1, net.line['from_bus'][index] - 1] = r_line x[net.line['to_bus'][index] - 1, net.line['from_bus'][index] - 1] = x_line return net, r, x