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