Skip to content

Commit 7827bba

Browse files
committed
add villas import example
Signed-off-by: Markus Mirz <mmirz@eonerc.rwth-aachen.de>
1 parent 4b4f252 commit 7827bba

File tree

1 file changed

+125
-0
lines changed

1 file changed

+125
-0
lines changed
Lines changed: 125 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,125 @@
1+
# This example reads a sine signal from villas that modifies the active power set point
2+
# of the PQ load. The n2 voltage is exported to a file via villas.
3+
4+
import sys
5+
import os.path
6+
import logging
7+
import json
8+
9+
from datetime import datetime
10+
from villas.node.node import Node as VILLASnode
11+
12+
import dpsimpy
13+
import dpsimpyvillas
14+
15+
base = os.path.splitext(os.path.basename(sys.argv[0]))[0]
16+
log = logging.getLogger(base)
17+
18+
def villas(intf):
19+
20+
log_filename=datetime.now().strftime(f'{base}-villas-%y-%m-%d_%H_%M_%S.log')
21+
22+
nodes = {
23+
'dpsim1': intf.get_config(),
24+
'file1': {
25+
'type': 'file',
26+
'uri': f'{base}-results-%y-%m-%d_%H_%M_%S.csv'
27+
},
28+
'sine' : {
29+
'type': 'signal',
30+
'signal': 'sine',
31+
'rate': 1,
32+
'frequency': 0.1,
33+
'amplitude': 50000,
34+
'offset': 100000
35+
},
36+
}
37+
38+
paths = [
39+
{
40+
'in': 'dpsim1',
41+
'out': 'file1'
42+
},
43+
{
44+
'in': 'sine',
45+
'out': 'dpsim1',
46+
'hooks': [{'type':'print'}]
47+
}
48+
]
49+
50+
config = {
51+
'nodes': nodes,
52+
'paths': paths
53+
}
54+
config['nodes']['dpsim1']['out']['hooks'] = [{'type':'print'}]
55+
56+
log.info('VILLASnode config: \n%s', json.dumps(config, indent=2))
57+
58+
return VILLASnode(config=config, log_filename=log_filename)
59+
60+
def dpsim():
61+
# Parameters
62+
V_nom = 20e3
63+
p_load_nom = 100e3
64+
q_load_nom = 50e3
65+
line_resistance = 0.05
66+
line_inductance = 0.1
67+
line_capacitance = 0.1e-6
68+
name = 'test_shmem_import_export'
69+
70+
# Nodes and Components
71+
n1 = dpsimpy.sp.SimNode('n1', dpsimpy.PhaseType.Single)
72+
n2 = dpsimpy.sp.SimNode('n2', dpsimpy.PhaseType.Single)
73+
74+
extnet = dpsimpy.sp.ph1.NetworkInjection('Slack')
75+
extnet.set_parameters(voltage_set_point=V_nom)
76+
extnet.set_base_voltage(V_nom)
77+
extnet.modify_power_flow_bus_type(dpsimpy.PowerflowBusType.VD)
78+
79+
line = dpsimpy.sp.ph1.PiLine('PiLine')
80+
line.set_parameters(R=line_resistance, L=line_inductance, C=line_capacitance)
81+
line.set_base_voltage(V_nom)
82+
83+
load = dpsimpy.sp.ph1.Load('Load')
84+
load.set_parameters(active_power=p_load_nom, reactive_power=q_load_nom, nominal_voltage=V_nom)
85+
load.modify_power_flow_bus_type(dpsimpy.PowerflowBusType.PQ)
86+
87+
extnet.connect([n1])
88+
line.connect([n1, n2])
89+
load.connect([n2])
90+
system = dpsimpy.SystemTopology(50, [n1, n2], [extnet, line, load])
91+
92+
sim = dpsimpy.RealTimeSimulation(name, dpsimpy.LogLevel.debug)
93+
sim.set_system(system)
94+
sim.set_domain(dpsimpy.Domain.SP)
95+
sim.set_solver(dpsimpy.Solver.NRP)
96+
sim.set_time_step(1)
97+
sim.set_final_time(10)
98+
sim.do_init_from_nodes_and_terminals(False)
99+
100+
logger = dpsimpy.Logger(name)
101+
sim.add_logger(logger)
102+
sim.log_attr('n1', 'v')
103+
sim.log_attr('n2', 'v')
104+
105+
intf = dpsimpyvillas.InterfaceShmem()
106+
sim.add_interface(intf)
107+
sim.import_attr('Load', 'P', 0)
108+
sim.export_attr('n2', 'v', 0, dpsimpy.AttrModifier.mag)
109+
110+
return sim, intf
111+
112+
def test_shmem_import_export():
113+
logging.basicConfig(format='[%(asctime)s %(name)s %(levelname)s] %(message)s', datefmt='%H:%M:%S', level=logging.INFO)
114+
115+
sim, intf = dpsim()
116+
node = villas(intf)
117+
118+
node.start()
119+
120+
sim.run(1)
121+
122+
node.stop()
123+
124+
if __name__ == '__main__':
125+
test_shmem_import_export()

0 commit comments

Comments
 (0)