Skip to main content

Module remote

Module remote 

Source
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§

RemoteControlReport
What one remote controller did.
RemoteVoltageControl
Drives each remotely-regulating machine’s own voltage until the bus it holds reaches its target.

Enums§

RemoteOutcome