Expand description
Remote voltage control: holding a bus the machine is not connected to.
A generator regulating the far side of its own step-up transformer is
ordinary, and gridoxide has always imported it — RegulatingControl.Terminal
resolves to the controlled bus, which is then pinned to PV at the target.
That gets the target right and the reactive power in the wrong place: it
appears at the bus being held rather than at the machine, so the reactive
flow on the path between them is missing and the machine’s own bus sits at
whatever the network makes it, rather than at whatever holding the far bus
requires.
§The formulation, and why this one
Exactly, the problem is a small generalization of the PV bus. A PV bus
today means two things at once — this bus’s magnitude is fixed and this
bus’s reactive injection is free — and remote control simply separates
them: fix |V| at the controlled bus, free Q at the controller. The
unknown count still balances, one magnitude removed against one reactive
equation removed.
Implementing it that way means the unknown layout stops being derivable from
BusType, which is the assumption jacobian::JacobianPattern,
solver::newton_raphson_cached, ac_sensitivity, bde, block_sparse and
continuation::augmented all share. That is a large change to the most
load-bearing code in the crate, for a configuration two vendored fixtures
have.
This loop reaches the same fixed point without touching any of it. Make
the controller bus PV — which is what makes its reactive power free, and
free at the right bus — and drive its own setpoint until the controlled bus
reaches the target. At convergence |V| at the controlled bus is the target
and Q at the controller is whatever holding it takes, which is precisely
what the exact formulation asserts. The difference is iteration, not answer,
and iterating a control to a fixed point is what this module is for.
It also inherits the reactive limits for free: the controller bus is a PV
bus carrying the machine’s own capability, so
ReactiveLimits clamps the machine rather than the
bus it happens to be holding — which is the more correct bound as well as
the easier one.
§The step
Δ|V|_controller = gain · (target − |V|_controlled), with gain starting at
1.0 and refined by secant from the response actually observed.
The initial 1.0 is not arbitrary: a machine holding the far side of its own
transformer moves that bus nearly one-for-one in per-unit, so the first step
lands close and the secant corrects the rest. A derived sensitivity
(ac_sensitivity would need a voltage-setpoint variable, which it has no
other caller for) is the better answer once a second fixture asks for it;
deriving it for one case would be building the general thing on a sample of
one.
Structs§
- Remote
Control Report - What one remote controller did.
- Remote
Voltage Control - Drives each remotely-regulating machine’s own voltage until the bus it holds reaches its target.