-
Notifications
You must be signed in to change notification settings - Fork 8
/
simulation creator_DNcontrolCase.py
79 lines (63 loc) · 2.62 KB
/
simulation creator_DNcontrolCase.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
import mosaik
from mosaik.util import connect_many_to_one
from Models.EleDisNetworkSim.network import *
import pandas as pd
from configuration.buildmodelset import *
outputfile='Result/DNcontrolCase/results.csv'
sim_config_file="Cases/DNcontrolCase/"
sim_config_ddf=pd.read_xml(sim_config_file+'config.xml')
sim_config={row[1]:{row[2]:row[3]}for row in sim_config_ddf.values}
START = '2022-01-01 00:00:00'
END = 1 * 24 * 3600 # half day
PROFILE_FILE = 'Scenarios/results1month_update.csv'
GRID_NAME = 'cigre_lv_resident'
LOAD_DATA = {'start': '2022-01-01 00:00:00', 'resolution': 15, 'unit': 'W'} # unit of resolution is minute!
net=create_cigre_lv_resident()
upvollimit = 1.05
downvollimit = 0.95
uproom_p = [-0.01] * 20
downroom_p = [0.01] * 20
uproom_q = [-0.00000000000000000001] * 20
downroom_q = [0.000000000000000000001] * 20
room = {
'upvollimit': upvollimit,
'downvollimit': downvollimit,
'uproom_p': uproom_p,
'downroom_p': downroom_p,
'uproom_q': uproom_q,
'downroom_q': downroom_q
}
world = mosaik.World(sim_config)
# Initialize the simulators
gridsim = world.start('Grid', step_size=None)
loadsim = world.start('Load')
# Instantiate model entities
grid = gridsim.Grid(gridfile=GRID_NAME).children
loads = loadsim.Loadset(sim_start=START,
data_info=LOAD_DATA,
profile_file=PROFILE_FILE).children
# connect entities
# get the nodes and lines of the grid
grid_nodes_gen = [element for element in grid if 'ext_gen' in element.eid]
grid_nodes = [e for e in grid if e.type in 'Bus']
grid_lines = [e for e in grid if e.type in 'Line']
grid_loads = [e for e in grid if e.type in 'Load']
# connect loads to grid
load_data = world.get_data(loads, 'load_id')
load_loc = {b.eid.split('-')[1]: b for b in grid_loads}
for load in loads:
load_id = load_data[load]['load_id']
world.connect(load, load_loc[load_id], ('P_out', 'p_mw'))
collector = world.start('Collector', start_date=START,results_show=RESULTS_SHOW_TYPE,output_file=outputfile)
monitor = collector.Monitor()
controller=world.start('Controller')
ctrl = controller.Ctrl(net=net, room=room)
connect_many_to_one(world,grid_nodes,ctrl,'p_mw', 'q_mvar','vm_pu')
# load_data_new = world.get_data([ctrl])
# print(load_data_new)
for load in loads:
load_id = load_data[load]['load_id']
load_index=net.load.loc[net.load['name'] == load_id].index[0]
world.connect(ctrl, load_loc[load_id], (f'p_m_update{load_index}', 'p_mw'),weak=True)
connect_many_to_one(world, grid_nodes, monitor, 'p_mw', 'vm_pu')
world.run(until=END, print_progress=True)