Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Binary file modified MTB.pfd
Binary file not shown.
1,147 changes: 712 additions & 435 deletions MTB.pslx

Large diffs are not rendered by default.

22 changes: 16 additions & 6 deletions case_setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ def __init__(self, path : str) -> None:
self.SCR_min = float(inputs['SCR min'])
self.SCR_tuning = float(inputs['SCR tuning'])
self.SCR_max = float(inputs['SCR max'])
self.V_droop = float(inputs['V droop'])
self.Default_QUdroop = float(inputs['Default Q(U) droop'])
self.XR_SCR_min = float(inputs['X/R SCR min'])
self.XR_SCR_tuning = float(inputs['X/R SCR tuning'])
self.XR_SCR_max = float(inputs['X/R SCR max'])
Expand All @@ -84,6 +84,7 @@ def __init__(self, case: 'pd.Series[Union[str, int, float, bool]]') -> None:
self.Pmode: str = str(case['Pmode'])
self.Qmode: str = str(case['Qmode'])
self.Qref0: float = float(case['Qref0'])
self.QUdroop0: str = str(case['QUdroop0']) # Use 'str' because 'default' is also a valid value for the droop
self.SCR0: float = float(case['SCR0'])
self.XR0: float = float(case['XR0'])
self.Simulationtime: float = float(case['Simulationtime'])
Expand Down Expand Up @@ -237,6 +238,11 @@ def stactrl_mode_switch(self : si.Signal, qmode : float):

mtb_t_qmode.addPFsub_S0('station_ctrl.ElmStactrl', 'i_ctrl', stactrl_mode_switch)

mtb_s_qudroop = signal('mtb_s_qudroop')
mtb_s_qudroop.addPFsub_S0('initializer_script.ComDpl', 'IntExpr:10')
mtb_s_qudroop.addPFsub_S0('initializer_qdsl.ElmQdsl', 'initVals:10')
mtb_s_qudroop.addPFsub_S0('station_ctrl.ElmStactrl', 'ddroop')

mtb_t_pmode = signal('mtb_t_pmode')
mtb_t_pmode.addPFsub_S0('initializer_script.ComDpl', 'IntExpr:7')
mtb_t_pmode.addPFsub_S0('initializer_qdsl.ElmQdsl', 'initVals:7')
Expand Down Expand Up @@ -275,11 +281,6 @@ def stactrl_mode_switch(self : si.Signal, qmode : float):
mtb_c_flattime_s.addPFsub('initializer_script.ComDpl', 'IntExpr:3')
mtb_c_flattime_s.addPFsub('initializer_qdsl.ElmQdsl', 'initVals:3')

mtb_c_vdroop = constant('mtb_c_vdroop', plantSettings.V_droop, pscad = False)
mtb_c_vdroop.addPFsub('initializer_script.ComDpl', 'IntExpr:10')
mtb_c_vdroop.addPFsub('initializer_qdsl.ElmQdsl', 'initVals:10')
mtb_c_vdroop.addPFsub('station_ctrl.ElmStactrl', 'ddroop')

# Time and rank control
mtb_t_simtimePscad_s = signal('mtb_t_simtimePscad_s', defaultConnection = False)
mtb_t_simtimePf_s = signal('mtb_t_simtimePf_s', defaultConnection = False)
Expand Down Expand Up @@ -469,6 +470,11 @@ def stactrl_mode_switch(self : si.Signal, qmode : float):
mtb_s_qref_5[case.rank] = case.Qref0 if mtb_t_qmode[case.rank].s0 == 5 else 0.0
mtb_s_qref_6[case.rank] = case.Qref0 if mtb_t_qmode[case.rank].s0 == 6 else 0.0

if case.QUdroop0.lower() == "default":
mtb_s_qudroop[case.rank] = plantSettings.Default_QUdroop
else:
mtb_s_qudroop[case.rank] = float(case.QUdroop0)

mtb_t_pmode[case.rank] = PMODES[case.Pmode.lower()]

# Fault signals
Expand Down Expand Up @@ -551,6 +557,10 @@ def stactrl_mode_switch(self : si.Signal, qmode : float):
mtb_s_scr[case.rank].add(eventTime, eventX1, 0.0)
mtb_s_xr[case.rank].add(eventTime, eventX2, 0.0)

elif eventType == 'QUdroop':
assert isinstance(eventX1, float)
mtb_s_qudroop[case.rank].add(eventTime, eventX1, 0.0)

elif eventType.count('fault') > 0 and eventType != 'Clear fault':
assert isinstance(eventX1, float)
assert isinstance(eventX2, float)
Expand Down
4 changes: 3 additions & 1 deletion execute_pf.py
Original file line number Diff line number Diff line change
Expand Up @@ -160,6 +160,7 @@ def setupResFiles(app : pf.Application, script : pf.ComPython, root : pf.DataObj
'mtb_s_qref_q_pu.ElmDsl',
'mtb_s_qref_qu_pu.ElmDsl',
'mtb_s_qref_pf.ElmDsl',
'mtb_s_qudroop.ElmDsl',
'mtb_s_qref_3.ElmDsl',
'mtb_s_qref_4.ElmDsl',
'mtb_s_qref_5.ElmDsl',
Expand Down Expand Up @@ -303,11 +304,12 @@ def convertToConfStr(param : str, signal : str) -> str:
qref1_conf = convertToConfStr('Qref_q', 'mtb_s_qref_q_pu')
qref2_conf = convertToConfStr('Qref_qu', 'mtb_s_qref_qu_pu')
qref3_conf = convertToConfStr('Qref_pf', 'mtb_s_qref_pf')
qudroop_conf = convertToConfStr('QUdroop', 'mtb_s_qudroop')
custom1_conf = convertToConfStr('Custom1', 'mtb_s_1')
custom2_conf = convertToConfStr('Custom2', 'mtb_s_2')
custom3_conf = convertToConfStr('Custom3', 'mtb_s_3')

configs = custConfStr.split(';') + [pref_conf, qref1_conf, qref2_conf, qref3_conf, custom1_conf, custom2_conf, custom3_conf]
configs = custConfStr.split(';') + [pref_conf, qref1_conf, qref2_conf, qref3_conf, qudroop_conf, custom1_conf, custom2_conf, custom3_conf]

confFilterStr = r"^([^:*?=\",~|\n\r]+):((?:\w:)?\w+(?::\d+)?)=(\w+):(S|s|S0|s0|R|r|T|t|C|c)~(.*)"
confFilter = re.compile(confFilterStr)
Expand Down
Loading