Commit 1a6bb147 authored by ran li's avatar ran li Committed by ran li
Browse files

Adding a new constraint regarding the ROCOF and frequency, q_RateOfChangeOfFrequency

parent 5273f4b2
......@@ -24,6 +24,7 @@ Model schedule /
q_balance
q_resDemand
q_resDemandLargestInfeedUnit
q_RateOfChangeOfFrequency
q_resDemandLargestInfeedTransfer
q_resDemandLargestInfeedTransfer2
// Unit Operation
......
......@@ -214,6 +214,8 @@ param_gn "Possible parameters for grid, node" /
boundStartToEnd "Force the last states to equal the first state"
forecastLength "Length of forecasts in use for the node (hours). After this, the node will use the central forecast."
capacityMargin "Capacity margin used in invest mode (MW)"
defaultFrequency "default frequency for each node"
ROCOF "Rate of change of frequency"
/
param_gnBoundaryTypes "Types of boundaries that can be set for a node with a state variable" /
......
......@@ -55,6 +55,7 @@ equations
q_balance(grid, node, mType, s, f, t) "Energy demand must be satisfied at each node"
q_resDemand(restype, up_down, node, s, f, t) "Procurement for each reserve type is greater than demand"
q_resDemandLargestInfeedUnit(grid, restype, up_down, node, unit, s, f, t) "N-1 Reserve"
q_RateOfChangeOfFrequency(grid, node, unit, s, f, t) "N-1 Contingency with ROCOF"
q_resDemandLargestInfeedTransfer(grid, restype, up_down, node, node, s, f, t) "N-1 up reserve for transmission lines"
q_resDemandLargestInfeedTransfer2(grid, restype, up_down, node, node, s, f, t) "N-1 up reserve for transmission lines"
// Unit Operation
......
......@@ -212,6 +212,33 @@ q_resDemandLargestInfeedUnit(grid, restypeDirectionNode(restype, 'up', node), un
- vq_resMissing(restype, 'up', node, s, f+df_reserves(node, restype, f, t), t)${ft_reservesFixed(node, restype, f+df_reserves(node, restype, f, t), t)}
;
q_RateOfChangeOfFrequency(grid, node, unit_fail(unit_), sft(s, f, t))
${ p_gn(grid, node, 'defaultFrequency')
and p_gn(grid, node, 'ROCOF')
} ..
// Kinectic energy in the system
[+ sum(gnu_output(grid, node, unit)${ ord(unit) ne ord(unit_)
},
+ p_gnu(grid, node, unit, 'inertia')
* p_gnu(grid ,node, unit, 'unitSizeMVA')
* [
+ v_online_LP(unit, s, f+df_central(f,t), t)
${uft_onlineLP(unit, f, t)}
+ v_online_MIP(unit, s, f+df_central(f,t), t)
${uft_onlineMIP(unit, f, t)}
+ v_gen(grid, node, unit, s, f, t)${not uft_online(unit, f, t)}
/ p_gnu(grid, node, unit, 'unitSizeGen')
] // * p_gnu
) // END sum(gnu_output)
]*p_gn(grid, node, 'ROCOF')*2
=G=
// Demand for reserves due to a large unit that could fail
+ v_gen(grid,node,unit_,s,f,t) * p_gn(grid, node, 'defaultFrequency')
;
* --- N-1 Upward reserve demand due to a possibility that an interconnector that is transferring power to the node fails -------------------------------------------------
// NOTE! Currently, there are multiple identical instances of the reserve balance equation being generated for each forecast branch even when the reserves are committed and identical between the forecasts.
......
  • I think this is a very useful equation. I was just wondering that maybe this could be changed so that it would apply to a group of nodes similar to q_inertiaMin, for example, to make it possible to model ROI+NI using two nodes but applying only one ROCOF constraint for the whole island. Then the parameters would be p_groupPolicy(group, 'ROCOF') and p_groupPolicy(group, 'defaultFrequency'). Additional conditions would be needed when summing kinetic/rotational energy over gnu_output: gnGroup(grid, node, group) and gnuft(grid, node, unit, f, t). Variable v_gen on the right hand side would then also need a gnGroup(grid, node, group) condition and maybe also gnuft(grid, node, unit, f, t).

Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment