Skip to content

Commit 8d2003d

Browse files
authored
Merge pull request #124 from NREL/develop-new
Develop new
2 parents ce58caf + 829cc4b commit 8d2003d

23 files changed

+1255
-338
lines changed

PyDSS/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
__version__ = "2.2.8"
1+
__version__ = "2.2.9"
22

33
from PyDSS.utils.timing_utils import timer_stats_collector
44
from . import *

PyDSS/common.py

Lines changed: 98 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -36,62 +36,141 @@ class VisualizationType(enum.Enum):
3636
NETWORK_GRAPH = "NetworkGraph"
3737

3838
class ControllerType(enum.Enum):
39+
FAULT_CONTROLLER = "FaultController"
40+
GENERATOR_CONTROLLER = "GenController"
41+
MOTOR_STALL = "MotorStall"
42+
MOTOR_STALL_SIMPLE = "MotorStallSimple"
3943
PV_CONTROLLER = "PvController"
44+
PV_DYNAMIC = "PvDynamic"
45+
PV_FREQUENCY_RIDETHROUGH = "PvFrequencyRideThru"
46+
PV_VOLTAGE_RIDETHROUGH = "PvVoltageRideThru"
4047
SOCKET_CONTROLLER = "SocketController"
4148
STORAGE_CONTROLLER = "StorageController"
42-
XMFR_CONTROLLER = "xmfrController"
43-
MOTOR_STALL = "MotorStall"
44-
PV_VOLTAGE_RIDETHROUGH = "PvVoltageRideThru"
45-
FAULT_CONTROLLER = "FaultController"
4649
THERMOSTATIC_LOAD_CONTROLLER = "ThermostaticLoad"
47-
GENERATOR_CONTROLLER = "GenController"
48-
50+
XMFR_CONTROLLER = "xmfrController"
4951

5052
CONTROLLER_TYPES = tuple(x.value for x in ControllerType)
5153
CONFIG_EXT = ".toml"
5254

53-
5455
class ExportMode(enum.Enum):
5556
BY_CLASS = "ExportMode-byClass"
5657
BY_ELEMENT = "ExportMode-byElement"
5758
SUBSCRIPTIONS = 'Subscriptions'
5859
EXPORTS = "Exports"
5960

60-
6161
def filename_from_enum(obj):
6262
return obj.value + CONFIG_EXT
6363

64-
65-
TIMESERIES_PLOT_FILENAME = filename_from_enum(VisualizationType.TIMESERIES_PLOT)
64+
FAULT_CONTROLLER_FILENAME = filename_from_enum(ControllerType.FAULT_CONTROLLER)
65+
GENERATOR_CONTROLLER_FILENAME = filename_from_enum(ControllerType.GENERATOR_CONTROLLER)
66+
MOTOR_STALL_FILENAME = filename_from_enum(ControllerType.MOTOR_STALL)
67+
MOTOR_STALL_SIMPLE_FILENAME = filename_from_enum(ControllerType.MOTOR_STALL_SIMPLE)
6668
PV_CONTROLLER_FILENAME = filename_from_enum(ControllerType.PV_CONTROLLER)
69+
PV_DYNAMIC_FILENAME = filename_from_enum(ControllerType.PV_DYNAMIC)
70+
PV_FREQUENCY_RIDETHROUGH_FILENAME = filename_from_enum(ControllerType.PV_FREQUENCY_RIDETHROUGH)
71+
PV_VOLTAGE_RIDETHROUGH_FILENAME = filename_from_enum(ControllerType.PV_VOLTAGE_RIDETHROUGH)
72+
SOCKET_CONTROLLER_FILENAME = filename_from_enum(ControllerType.SOCKET_CONTROLLER)
6773
STORAGE_CONTROLLER_FILENAME = filename_from_enum(ControllerType.STORAGE_CONTROLLER)
68-
SOCKET_CONTROLLER_FILENAME = filename_from_enum(ControllerType.XMFR_CONTROLLER)
69-
XMFR_CONTROLLER_FILENAME = filename_from_enum(ControllerType.SOCKET_CONTROLLER)
74+
THERMOSTATIC_LOAD_CONTROLLER_FILENAME = filename_from_enum(ControllerType.THERMOSTATIC_LOAD_CONTROLLER)
75+
XMFR_CONTROLLER_FILENAME = filename_from_enum(ControllerType.XMFR_CONTROLLER)
76+
77+
TIMESERIES_PLOT_FILENAME = filename_from_enum(VisualizationType.TIMESERIES_PLOT)
7078
EXPORT_BY_CLASS_FILENAME = filename_from_enum(ExportMode.BY_CLASS)
7179
EXPORT_BY_ELEMENT_FILENAME = filename_from_enum(ExportMode.BY_ELEMENT)
7280
EXPORTS_FILENAME = filename_from_enum(ExportMode.EXPORTS)
7381

74-
75-
DEFAULT_SUBSCRIPTIONS_FILE = os.path.join(
82+
DEFAULT_FAULT_CONTROLLER_CONFIG_FILE = os.path.join(
7683
os.path.dirname(getattr(PyDSS, "__path__")[0]),
7784
"PyDSS",
7885
"defaults",
79-
"ExportLists",
80-
SUBSCRIPTIONS_FILENAME,
86+
"pyControllerList",
87+
FAULT_CONTROLLER_FILENAME,
8188
)
82-
DEFAULT_SIMULATION_SETTINGS_FILE = os.path.join(
89+
DEFAULT_GENERATOR_CONTROLLER_CONFIG_FILE = os.path.join(
8390
os.path.dirname(getattr(PyDSS, "__path__")[0]),
8491
"PyDSS",
8592
"defaults",
86-
SIMULATION_SETTINGS_FILENAME,
93+
"pyControllerList",
94+
GENERATOR_CONTROLLER_FILENAME,
8795
)
88-
DEFAULT_CONTROLLER_CONFIG_FILE = os.path.join(
96+
DEFAULT_MOTOR_STALL_CONTROLLER_CONFIG_FILE = os.path.join(
97+
os.path.dirname(getattr(PyDSS, "__path__")[0]),
98+
"PyDSS",
99+
"defaults",
100+
"pyControllerList",
101+
MOTOR_STALL_FILENAME,
102+
)
103+
DEFAULT_PV_CONTROLLER_CONFIG_FILE = os.path.join(
89104
os.path.dirname(getattr(PyDSS, "__path__")[0]),
90105
"PyDSS",
91106
"defaults",
92107
"pyControllerList",
93108
PV_CONTROLLER_FILENAME,
94109
)
110+
DEFAULT_PV_DYNAMIC_CONTROLLER_CONFIG_FILE = os.path.join(
111+
os.path.dirname(getattr(PyDSS, "__path__")[0]),
112+
"PyDSS",
113+
"defaults",
114+
"pyControllerList",
115+
PV_DYNAMIC_FILENAME,
116+
)
117+
DEFAULT_PV_FREQUENCY_RIDETHROUGH_CONTROLLER_CONFIG_FILE = os.path.join(
118+
os.path.dirname(getattr(PyDSS, "__path__")[0]),
119+
"PyDSS",
120+
"defaults",
121+
"pyControllerList",
122+
PV_FREQUENCY_RIDETHROUGH_FILENAME,
123+
)
124+
DEFAULT_PV_VOLTAGE_RIDETHROUGH_CONTROLLER_CONFIG_FILE = os.path.join(
125+
os.path.dirname(getattr(PyDSS, "__path__")[0]),
126+
"PyDSS",
127+
"defaults",
128+
"pyControllerList",
129+
PV_VOLTAGE_RIDETHROUGH_FILENAME,
130+
)
131+
DEFAULT_SOCKET_CONTROLLER_CONFIG_FILE = os.path.join(
132+
os.path.dirname(getattr(PyDSS, "__path__")[0]),
133+
"PyDSS",
134+
"defaults",
135+
"pyControllerList",
136+
SOCKET_CONTROLLER_FILENAME,
137+
)
138+
DEFAULT_STORAGE_CONTROLLER_CONFIG_FILE = os.path.join(
139+
os.path.dirname(getattr(PyDSS, "__path__")[0]),
140+
"PyDSS",
141+
"defaults",
142+
"pyControllerList",
143+
STORAGE_CONTROLLER_FILENAME,
144+
)
145+
DEFAULT_THERMOSTATIC_LOAD_CONTROLLER_CONFIG_FILE = os.path.join(
146+
os.path.dirname(getattr(PyDSS, "__path__")[0]),
147+
"PyDSS",
148+
"defaults",
149+
"pyControllerList",
150+
THERMOSTATIC_LOAD_CONTROLLER_FILENAME,
151+
)
152+
DEFAULT_XMFR_CONTROLLER_CONFIG_FILE = os.path.join(
153+
os.path.dirname(getattr(PyDSS, "__path__")[0]),
154+
"PyDSS",
155+
"defaults",
156+
"pyControllerList",
157+
XMFR_CONTROLLER_FILENAME,
158+
)
159+
160+
DEFAULT_SUBSCRIPTIONS_FILE = os.path.join(
161+
os.path.dirname(getattr(PyDSS, "__path__")[0]),
162+
"PyDSS",
163+
"defaults",
164+
"ExportLists",
165+
SUBSCRIPTIONS_FILENAME,
166+
)
167+
DEFAULT_SIMULATION_SETTINGS_FILE = os.path.join(
168+
os.path.dirname(getattr(PyDSS, "__path__")[0]),
169+
"PyDSS",
170+
"defaults",
171+
SIMULATION_SETTINGS_FILENAME,
172+
)
173+
95174
DEFAULT_VISUALIIZATION_CONFIG_FILE = os.path.join(
96175
os.path.dirname(getattr(PyDSS, "__path__")[0]),
97176
"PyDSS",
@@ -133,31 +212,23 @@ def filename_from_enum(obj):
133212
"Monte_Carlo",
134213
MONTE_CARLO_SETTINGS_FILENAME,
135214
)
136-
137-
138215
class ControlMode(enum.Enum):
139216
"""Supported control modes"""
140217
STATIC = "Static"
141218
TIME = "Time"
142-
143-
144219
class DataConversion(enum.Enum):
145220
NONE = "none"
146221
ABS = "abs"
147222
ABS_SUM = "abs_sum"
148223
SUM = "sum"
149224
SUM_REAL = "sum_real"
150225
SUM_ABS_REAL = "sum_abs_real"
151-
152-
153226
class DatasetPropertyType(enum.Enum):
154227
PER_TIME_POINT = "per_time_point" # data is stored at every time point
155228
FILTERED = "filtered" # data is stored after being filtered
156229
METADATA = "metadata" # metadata for another dataset
157230
TIME_STEP = "time_step" # data are time indices, tied to FILTERED
158231
VALUE = "value" # Only a single value is written for each element
159-
160-
161232
class FileFormat(enum.Enum):
162233
"""Supported file formats"""
163234
CSV = "csv"

PyDSS/dataset_buffer.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
"""Contains DatasetBuffer"""
22

3+
from cmath import nan
34
import logging
45

56
import numpy as np
@@ -10,6 +11,7 @@
1011
from PyDSS.utils.utils import make_timestamps
1112

1213

14+
1315
KiB = 1024
1416
MiB = KiB * KiB
1517
GiB = MiB * MiB
@@ -143,6 +145,7 @@ def max_num_bytes(self):
143145

144146
def write_value(self, value):
145147
"""Write the value to the internal buffer, flushing when full."""
148+
146149
self._buf[self._buf_index] = value
147150
self._buf_index += 1
148151
if self._buf_index == self.chunk_count:
Lines changed: 23 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,24 @@
1-
["Load.motor_p1ulv281"]
2-
ratedKW = 7.0
1+
["Load.motor_1"]
2+
Kp1 = 0.0
3+
Np1 = 1.0
4+
Kp2 = 12.0
5+
Np2 = 3.2
6+
Kq1 = 6.0
7+
Nq1 = 2.0
8+
Kq2 = 11.0
9+
Nq2 = 2.5
10+
Tth = 4.0
11+
Frst = 0.20
12+
LFadj = 0.0
13+
Tth1t = 0.5
14+
Tth2t = 1.3
15+
Pfault = 3.0
16+
Qfault = 1.0
17+
Vstall = 0.55
18+
Vbreak = 0.86
19+
Vrstrt = 0.95
20+
Tstall = 0.032
21+
Trestart = 0.3
22+
ratedKW = 7.00
323
ratedPF = 0.939
4-
Pfault = 2.737
5-
Qfault = 4.743
6-
Vstall = 0.5979
7-
Tprotection = 19.5
8-
Treconnect = 7.5
24+
R_stall_pu = 0.10
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
["Load.motor_p1ulv281"]
2+
ratedKW = 7.0
3+
ratedPF = 0.939
4+
Pfault = 2.737
5+
Qfault = 4.743
6+
Vstall = 0.5979
7+
Tprotection = 19.5
8+
Treconnect = 7.5
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
["Generator.pvgui_mpx000460267"]
2+
DER_ID = "10"
3+
STEADY_STATE = false
4+
RATED_POWER_AC_VA = 1000.0
5+
RATED_POWER_DC_WATTS = 1000.0
6+
MPPT_ENABLE = true
7+
RAMP_ENABLE = true
8+
VOLT_VAR_ENABLE = true
9+
LVRT_ENABLE = true
10+
HVRT_ENABLE = true
11+
LFRT_ENABLE = false
12+
DO_EXTRA_CALCULATIONS = true
13+
use_frequency_estimate = true
14+
jacFlag = true
15+
UPDATE_MODULE_PARAMETRS = false
16+
Np = 500
17+
Ns = 400
18+
Vdcmpp0 = 850.0
19+
Vdcmpp_max = 850.0
20+
Vdcmpp_min = 650.0
21+
UPDATE_INVERTER_PARAMETRS = false
22+
Vdcrated = 650.0
23+
Ioverload = 1.1
24+
Vrmsrated = 197.0
25+
Iramp_max_gradient_imag = 1.0
26+
Iramp_max_gradient_real = 1.0
27+
UPDATE_CIRCUIT_PARAMETRS = false
28+
Rf_actual = 0.002
29+
Lf_actual = 0.000025
30+
C_actual = 3e-05
31+
Z1_actual_real = 0.0019
32+
Z1_actual_imag = 0.0561
33+
R1_actual = 0.0019
34+
X1_actual = 0.0561
35+
UPDATE_CONTROLLER_PARAMETRS = false
36+
Kp_GCC = 12000.0
37+
Ki_GCC = 2000.0
38+
Kp_DC = -2.0
39+
Ki_DC = -10.0
40+
Kp_Q = 0.2
41+
Ki_Q = 10.0
42+
wp = 200000.0
43+
UPDATE_STEADYSTATE_PARAMETRS = false
44+
iaI0 = 0.001
45+
iaR0 = 1.0
46+
maI0 = 0.0
47+
maR0 = 0.89
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
["Generator.pv_1"]
2+
Category = "test"
3+
Control1 = "None"
4+
Control2 = "None"
5+
Control3 = "None"
6+
kV = nan
7+
kVA = 4
8+
maxKW = 4
9+
KvarLimit = 1.76
10+
"%PCutin" = 10
11+
"%PCutout" = 10
12+
UcalcMode = "Max"
13+
Priority = "Equal"
14+
"Enable PF limit" = false
15+
pfMin = 0.95
16+
"Follow standard" = "1547-2018"
17+
"Ride-through Category" = "Category I"
18+
"Category I Low Frequency Droop" = false
19+
"OF2 - Hz" = 62.0
20+
"OF2 CT - sec" = 0.16
21+
"OF1 - Hz" = 61.2
22+
"OF1 CT - sec" = 300
23+
"UF1 - Hz" = 58.5
24+
"UF1 CT - sec" = 300
25+
"UF2 - Hz" = 56.5
26+
"UF2 CT - sec" = 0.16
27+
"db_UF" = 0.036
28+
"db_OF" = 0.036
29+
"k_UF" = 0.05
30+
"k_OF" = 0.05
31+
"minKW" = 0
32+
"Reconnect deadtime - sec" = 3000
33+
"Reconnect Pmax time - sec" = 300
34+
#"Permissive operation" = "Current limited" # not needed
35+
"May trip operation" = "Ride-Through" #"Trip" #"Ride-Through" #
36+
#"Multiple disturbances" = "Trip" #not needed?
37+
alpha = 0.9
38+
beta = 0.3
39+
uMin = 0.95
40+
uDbMin = 0.97
41+
uDbMax = 1.03
42+
uMax = 1.05
43+
uMinC = 1.06
44+
uMaxC = 1.1
45+
PminVW = 0.5
46+
CurtMode = "Rated Power"
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
["Load.load_1"]
2+
Tmax = 30.0
3+
Tmin = 25.0
4+
kw = 5.0
5+
R = 1.0
6+
C = 1.0
7+
mu = 0.9

PyDSS/helics_interface.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -150,10 +150,14 @@ def updateHelicsSubscriptions(self):
150150
value = helics.helicsInputGetInteger(sub_info['Subscription'])
151151

152152
if value and value != 0:
153+
if value > 1e6 or value < -1e6:
154+
# #print("YO HERE")
155+
value = 1.0
156+
153157
value = value * sub_info['Multiplier']
154-
155158
dssElement = self._objects_by_element[element_name]
156-
dssElement.SetParameter(sub_info['Property'], value)
159+
# #print(sub_info['Property'], value)
160+
dssElement.SetParameter(sub_info['Property'], value)
157161

158162
self._logger.info('Value for "{}.{}" changed to "{}"'.format(
159163
element_name,

PyDSS/naerm.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -127,4 +127,4 @@ def naerm_to_pydss(naerm_name):
127127
if __name__ == '__main__':
128128

129129
name = 'PyDSS_x/circuit/heco19021/power_real/double'
130-
print(get_naerm_value([34,45],'PyDSS_x/circuit/heco19021/power_imag/double' ))
130+
#print(get_naerm_value([34,45],'PyDSS_x/circuit/heco19021/power_imag/double' ))

0 commit comments

Comments
 (0)