diff --git a/GridKit/Model/PhasorDynamics/Governor/GGOV1/README.md b/GridKit/Model/PhasorDynamics/Governor/GGOV1/README.md new file mode 100644 index 000000000..9c4ef1ef5 --- /dev/null +++ b/GridKit/Model/PhasorDynamics/Governor/GGOV1/README.md @@ -0,0 +1,299 @@ +# **GE General Governor-Turbine Model (GGOV1)** + +GGOV1 is a general governor-turbine model with electrical-power measurement, +speed/load reference selection, proportional/integral/derivative governor +control, load limiting, acceleration limiting, temperature limiting, actuator +rate limits, turbine lag/lead dynamics, and optional diesel damping. + +Notes: +- Internal control, valve-stroke, and turbine-power quantities are on the + GGOV1 component base unless otherwise stated. +- The dashed speed deadband block and `Db` source field are only for GGOV1D. + GGOV1 uses the speed input directly. +- Source governor-response settings may modify $V^{\max}$ and $V^{\min}$ before + the equations are evaluated. +- The source diagram notes that `Rup` and `Rdown` inputs are not implemented in + Simulator; the equations below do not use those source fields. + +## Block Diagram + +Standard model of the GGOV1 Governor. + +
+ + + Figure 1: Governor GGOV1 model. Figure courtesy of [PowerWorld](https://www.powerworld.com/WebHelp/) +
+ +## Model Parameters + +Symbol | Units | JSON | Description | Typical Value | Note +--------------------------------|-----------|------------|----------------------------------------------|---------------|------ +$P^{\mathrm{rate}}$ | [MW] | `Trate` | Optional turbine-rating power base | 0.0 | `Trate > 0` defines the governor base +$I_R$ | [integer] | `Rselect` | Droop feedback selector | 1 | Source label: `Rselect`; selects speed, electrical power, or valve feedback +$s_{\mathrm{flag}}$ | [binary] | `Flag` | Turbine-speed multiplier selector | 1 | 1 uses $1+\omega$, 0 uses 1.0 +$R$ | [p.u.] | `R` | Permanent droop | 0.05 | Source label: `r` +$T_{\mathrm{pelec}}$ | [sec] | `Tpelec` | Electrical-power measurement time constant | 0.0 | State 1 in Fig. 1 +$e^{\max}$ | [p.u.] | `Maxerr` | Maximum governor error | 1.0 | Source label: `maxerr` +$e^{\min}$ | [p.u.] | `Minerr` | Minimum governor error | -1.0 | Source label: `minerr` +$K_{\mathrm{pgov}}$ | [p.u.] | `Kpgov` | Governor proportional gain | 10.0 | Block name: `Kpgov` +$K_{\mathrm{igov}}$ | [p.u./s] | `Kigov` | Governor integral gain | 1.0 | Block name: `Kigov`; State 3 +$K_{\mathrm{dgov}}$ | [p.u.] | `Kdgov` | Governor differential gain | 0.0 | Block name: `Kdgov`; State 2 +$T_{\mathrm{dgov}}$ | [sec] | `Tdgov` | Governor differential time constant | 0.0 | Block name: `Tdgov` +$V^{\max}$ | [p.u.] | `Vmax` | Maximum governor output before actuator | 1.0 | Governor response limits may adjust this value +$V^{\min}$ | [p.u.] | `Vmin` | Minimum governor output before actuator | 0.0 | Governor response limits may adjust this value +$T_{\mathrm{act}}$ | [sec] | `Tact` | Turbine actuator time constant | 0.1 | State 4 in Fig. 1 +$R_{\mathrm{open}}$ | [p.u./s] | `Ropen` | Maximum actuator opening rate | 1.0 | Source label: `Ropen` +$R_{\mathrm{close}}$ | [p.u./s] | `Rclose` | Maximum actuator closing rate | -1.0 | Source label: `Rclose` +$K_{\mathrm{turb}}$ | [p.u.] | `Kturb` | Turbine gain | 1.0 | Block name: `Kturb` +$W_{\mathrm{fnl}}$ | [p.u.] | `Wfnl` | No-load fuel flow | 0.0 | Source label: `Wfnl` +$T_B$ | [sec] | `Tb` | Turbine lead-lag denominator time constant | 0.0 | State 5 in Fig. 1 +$T_C$ | [sec] | `Tc` | Turbine lead-lag numerator time constant | 0.0 | Block name: `Tc` +$T_{\mathrm{eng}}$ | [sec] | `Teng` | Engine transport lag | 0.0 | Source label: `e^{-sTeng}`; source transport delay is not represented as a differential state below +$T_{\mathrm{fload}}$ | [sec] | `Tfload` | Load-limiter lag time constant | 0.0 | State 6 in Fig. 1 +$K_{\mathrm{pload}}$ | [p.u.] | `Kpload` | Load-limiter proportional gain | 0.0 | Block name: `Kpload`; note path changes when zero +$K_{\mathrm{iload}}$ | [p.u./s] | `Kiload` | Load-limiter integral gain | 0.0 | State 7 in Fig. 1 +$L_{\mathrm{dref}}$ | [p.u.] | `Ldref` | Load reference | 1.0 | Source label: `Ldref` +$D_m$ | [p.u.] | `Dm` | Diesel damping gain | 0.0 | Source label: `Dm`; sign-dependent speed term in Fig. 1 +$K_{\mathrm{imw}}$ | [p.u./s] | `Kimw` | Supervisory load-control integral gain | 0.0 | State 8 in Fig. 1 +$A_{\mathrm{set}}$ | [p.u.] | `Aset` | Acceleration-control reference | 0.0 | Source label: `aset` +$K_A$ | [p.u.] | `Ka` | Acceleration-control gain | 0.0 | Block name: `KA` +$T_A$ | [sec] | `Ta` | Acceleration-control time constant | 0.0 | State 9 in Fig. 1 +$T_{\mathrm{sa}}$ | [sec] | `Tsa` | Temperature-detection numerator time constant | 0.0 | State 10 in Fig. 1 +$T_{\mathrm{sb}}$ | [sec] | `Tsb` | Temperature-detection denominator time constant | 0.0 | State 10 in Fig. 1 +$R_{\mathrm{up}}$ | [p.u./s] | `Rup` | Source upward ramp input | 0.0 | Source note says not implemented in Simulator +$R_{\mathrm{down}}$ | [p.u./s] | `Rdown` | Source downward ramp input | 0.0 | Source note says not implemented in Simulator + +### Parameter Validation + +Invalid GGOV1 parameter sets are rejected by the following checks. If source +governor-response settings adjust limits, apply these checks to the effective +values used by the equations. + +```math +\begin{aligned} + &P^{\mathrm{rate}}\ge 0,\quad R>0,\quad I_R\in\{-2,-1,1\},\quad s_{\mathrm{flag}}\in\{0,1\} \\ + &T_{\mathrm{pelec}},T_{\mathrm{dgov}},T_B,T_C,T_{\mathrm{eng}},T_{\mathrm{fload}},T_A,T_{\mathrm{sa}},T_{\mathrm{sb}}\ge 0,\quad T_{\mathrm{act}}>0 \\ + &T_B > 0\quad\text{or}\quad(T_B = 0\ \text{and}\ T_C = 0) \\ + &e^{\min}\le e^{\max},\quad V^{\min}\le V^{\max},\quad R_{\mathrm{close}}<00 +\end{aligned} +``` + +### Model Derived Parameters + +The component base and flag complements are: + +```math +\begin{aligned} + S_{\mathrm{gov}}^{\mathrm{base}} + &= + \begin{cases} + P^{\mathrm{rate}} & P^{\mathrm{rate}} > 0 \\ + S^{\mathrm{machine}} & \text{otherwise} + \end{cases} \\ + s_{\mathrm{flag}}^{\mathrm{off}} &= 1 - s_{\mathrm{flag}} +\end{aligned} +``` + +## Model Variables + +### Internal Variables + +#### Differential + +Symbol | Units | Description | Note +--------------------------------|--------|-------------------------------------|------ +$P_{\mathrm{elec}}^{\mathrm{meas}}$ | [p.u.] | Measured electrical power | State 1 in Fig. 1; source label: `Pelec Measured` +$x_D$ | [p.u.] | Governor differential control state | State 2 in Fig. 1 +$x_I$ | [p.u.] | Governor integral control state | State 3 in Fig. 1 +$x_{\mathrm{act}}$ | [p.u.] | Turbine actuator or valve stroke | State 4 in Fig. 1 +$x_{\mathrm{turb}}$ | [p.u.] | Turbine lead-lag state | State 5 in Fig. 1; source label: `Turbine LL` +$x_{\mathrm{load}}$ | [p.u.] | Turbine load-limiter lag state | State 6 in Fig. 1 +$x_{\mathrm{ldint}}$ | [p.u.] | Turbine load integral-control state | State 7 in Fig. 1 +$x_{\mathrm{mw}}$ | [p.u.] | Supervisory load-control state | State 8 in Fig. 1 +$x_{\mathrm{acc}}$ | [p.u.] | Acceleration-control state | State 9 in Fig. 1 +$x_{\mathrm{temp}}$ | [p.u.] | Temperature-detection lead-lag state | State 10 in Fig. 1 + +#### Algebraic + +Symbol | Units | Description | Note +--------------------------------|----------|-------------------------------------|------ +$P_{\mathrm{mwref}}$ | [p.u.] | Supervisory load-control reference | From $P_{\mathrm{mwset}}-P_{\mathrm{elec}}$ +$y_R$ | [p.u.] | Selected droop feedback | Controlled by `Rselect` +$e_G$ | [p.u.] | Limited governor error | After $e^{\min}$ and $e^{\max}$ +$f_{\mathrm{pid}}$ | [p.u.] | Governor PID output | Forms `fsrn` +$f_{\mathrm{srn}}$ | [p.u.] | Normal governor fuel/stroke request | Low-value select input +$f_{\mathrm{sra}}$ | [p.u.] | Acceleration-control request | Low-value select input +$f_{\mathrm{srt}}$ | [p.u.] | Temperature/load request | Low-value select input +$f_{\mathrm{srl}}$ | [p.u.] | Acceleration/temperature low-value select | Lesser of $f_{\mathrm{sra}}$ and $f_{\mathrm{srt}}$ +$f_{\mathrm{sr}}$ | [p.u.] | Low-value select output | Limited by $V^{\min}$ and $V^{\max}$ +$r_{\mathrm{act}}$ | [p.u./s] | Actuator rate-limited derivative | Limited by $R_{\mathrm{close}}$ and $R_{\mathrm{open}}$ +$P_{\mathrm{turb}}$ | [p.u.] | Turbine power before damping | After turbine lead-lag and transport lag +$P_{\mathrm{damp}}$ | [p.u.] | Damping power term | Source label: `Dm` +$P_m$ | [p.u.] | Mechanical-power output | Source label: `Pmech` + +### External Variables + +#### Differential + +None. + +#### Algebraic + +Symbol | Units | Description | Note +--------------------------------|--------|-------------------------------------|------ +$P_{\mathrm{ref}}$ | [p.u.] | Governor reference | Source label: `Pref` +$P_{\mathrm{aux}}$ | [p.u.] | Auxiliary power input | Source label: `Paux`; optional, defaults to zero +$P_{\mathrm{mwset}}$ | [p.u.] | Supervisory MW setpoint | Source label: `Pmwset` +$P_{\mathrm{elec}}$ | [p.u.] | Electrical active power | Source label: `Pelec` +$L_{\mathrm{dref}}$ | [p.u.] | Load reference input | Source label: `Ldref` +$\omega$ | [p.u.] | Machine speed deviation | Source label: `Speed` + +## Model Equations + +### Differential Equations + +```math +\begin{aligned} + 0 &= -T_{\mathrm{pelec}}\dot P_{\mathrm{elec}}^{\mathrm{meas}} - P_{\mathrm{elec}}^{\mathrm{meas}} + P_{\mathrm{elec}} \\ + 0 &= -T_{\mathrm{dgov}}\dot x_D - x_D + e_G \\ + 0 &= + -\dot x_I + + \text{antiwindup}\!\left( + f_{\mathrm{pid}}, + K_{\mathrm{igov}}e_G, + V^{\min}, + V^{\max} + \right) \\ + 0 &= -T_{\mathrm{act}}\dot x_{\mathrm{act}} + r_{\mathrm{act}} \\ + 0 &= -T_B\dot x_{\mathrm{turb}} - x_{\mathrm{turb}} + x_{\mathrm{act}} \\ + 0 &= -T_{\mathrm{fload}}\dot x_{\mathrm{load}} - x_{\mathrm{load}} + f_{\mathrm{srt}} \\ + 0 &= -\dot x_{\mathrm{ldint}} + K_{\mathrm{iload}}\left(L_{\mathrm{dref}}-x_{\mathrm{load}}\right) \\ + 0 &= -\dot x_{\mathrm{mw}} + K_{\mathrm{imw}}\left(P_{\mathrm{mwset}}-P_{\mathrm{elec}}\right) \\ + 0 &= -T_A\dot x_{\mathrm{acc}} - x_{\mathrm{acc}} + \omega \\ + 0 &= -T_{\mathrm{sb}}\dot x_{\mathrm{temp}} - x_{\mathrm{temp}} + f_{\mathrm{sr}} +\end{aligned} +``` + +CommonMath defines the [Anti-Windup](../../../../CommonMath.md#anti-windup-indicator) +target and smooth approximation. + +### Algebraic Equations + +```math +\begin{aligned} + 0 &= -P_{\mathrm{mwref}} + x_{\mathrm{mw}} + P_{\mathrm{ref}} + P_{\mathrm{aux}} \\ + 0 &= -R y_R + + \begin{cases} + \omega & I_R = 1 \\ + P_{\mathrm{elec}}^{\mathrm{meas}} & I_R = -1 \\ + x_{\mathrm{act}} & I_R = -2 + \end{cases} \\ + 0 &= -e_G + \text{clamp}(P_{\mathrm{mwref}} - y_R,\ e^{\min},\ e^{\max}) \\ + 0 &= -f_{\mathrm{pid}} + K_{\mathrm{pgov}}e_G + K_{\mathrm{dgov}}(e_G - x_D) + x_I \\ + 0 &= -f_{\mathrm{srn}} + \text{clamp}(f_{\mathrm{pid}}, V^{\min}, V^{\max}) \\ + 0 &= -f_{\mathrm{sra}} + \text{clamp}\!\left(A_{\mathrm{set}} - K_A x_{\mathrm{acc}}, V^{\min}, V^{\max}\right) \\ + 0 &= -f_{\mathrm{srt}} + \text{clamp}\!\left(\dfrac{L_{\mathrm{dref}} + P_{\mathrm{aux}}}{K_{\mathrm{turb}}} + W_{\mathrm{fnl}} + x_{\mathrm{ldint}}, V^{\min}, V^{\max}\right) \\ + 0 &= -f_{\mathrm{srl}} + \text{min}\!\left(f_{\mathrm{sra}}, f_{\mathrm{srt}}\right) \\ + 0 &= -f_{\mathrm{sr}} + \text{min}\!\left(f_{\mathrm{srn}}, f_{\mathrm{srl}}\right) \\ + 0 &= -r_{\mathrm{act}} + \text{clamp}\!\left(\dfrac{f_{\mathrm{sr}}-x_{\mathrm{act}}}{T_{\mathrm{act}}}, R_{\mathrm{close}}, R_{\mathrm{open}}\right) \\ + 0 &= -P_{\mathrm{turb}} + + K_{\mathrm{turb}} + \begin{cases} + x_{\mathrm{act}} - W_{\mathrm{fnl}} & T_B = T_C = 0 \\ + x_{\mathrm{turb}} + \dfrac{T_C}{T_B}(x_{\mathrm{act}}-x_{\mathrm{turb}}) - W_{\mathrm{fnl}} & T_B > 0 + \end{cases} \\ + 0 &= -P_{\mathrm{damp}} + + D_m + \begin{cases} + \omega & D_m \ge 0 \\ + (1+\omega)^{D_m} & D_m < 0 + \end{cases} \\ + 0 &= -P_m + P_{\mathrm{turb}} + P_{\mathrm{damp}} +\end{aligned} +``` + +CommonMath defines helper targets and smooth approximations for +[clamp and min](../../../../CommonMath.md#derived-functions). +When $T_B=T_C=0$, the turbine lead-lag block is bypassed before the turbine +gain and no-load fuel-flow calculation. +If `Kpgov = 0`, the source diagram routes the integral path in parallel with +the derivative control; document that effective structure before changing the +equations. If `Kpload = 0`, the source diagram feeds `Kiload/s` from the +`Kpload` input and avoids the `fsrn` feedback path. + +## Initialization + +Initialization is performed by evaluating the steady-state residuals in +dependency order. Let subscript $0$ denote initial values and set all internal +derivatives to zero: + +```math +\begin{aligned} + \omega_0 &= 0 \\ + P_{\mathrm{aux},0} &= 0 \\ + P_{\mathrm{elec},0}^{\mathrm{meas}} &= P_{\mathrm{elec},0} \\ + x_{\mathrm{acc},0} &= 0 \\ + P_{\mathrm{damp},0} &= 0 +\end{aligned} +``` + +Given initialized machine mechanical power, solve the actuator and turbine path: + +```math +\begin{aligned} + P_{\mathrm{turb},0} &= P_{m,0} - P_{\mathrm{damp},0} \\ + x_{\mathrm{act},0} &= W_{\mathrm{fnl}} + \dfrac{P_{\mathrm{turb},0}}{K_{\mathrm{turb}}} \\ + x_{\mathrm{turb},0} &= x_{\mathrm{act},0} \\ + f_{\mathrm{sr},0} &= x_{\mathrm{act},0} \\ + f_{\mathrm{srn},0} &= f_{\mathrm{sra},0} = f_{\mathrm{srt},0} = f_{\mathrm{srl},0} = f_{\mathrm{sr},0} +\end{aligned} +``` + +Then seed the limiter and control states consistently: + +```math +\begin{aligned} + x_{\mathrm{load},0} &= f_{\mathrm{srt},0} \\ + x_{\mathrm{ldint},0} + &= f_{\mathrm{srt},0} + - \dfrac{L_{\mathrm{dref},0}+P_{\mathrm{aux},0}}{K_{\mathrm{turb}}} + - W_{\mathrm{fnl}} \\ + x_{\mathrm{mw},0} &= 0 \\ + 0 &= + \begin{cases} + -R y_{R,0} + \omega_0 & I_R = 1 \\ + -R y_{R,0} + P_{\mathrm{elec},0}^{\mathrm{meas}} & I_R = -1 \\ + -R y_{R,0} + x_{\mathrm{act},0} & I_R = -2 + \end{cases} \\ + P_{\mathrm{mwref},0} &= f_{\mathrm{pid},0} + y_{R,0} \\ + P_{\mathrm{ref},0} &= P_{\mathrm{mwref},0} - P_{\mathrm{aux},0} - x_{\mathrm{mw},0} +\end{aligned} +``` + +This closed-form start requires inactive low-value select alternatives, +inactive actuator rate limits, $V^{\min}\le f_{\mathrm{sr},0}\le V^{\max}$, +and $K_{\mathrm{turb}}\ne 0$. Starts where governor response settings fix +$V^{\min}$ or $V^{\max}$ to the initial condition must document those effective +limits before applying the residuals. + +## Model Outputs + +Output | Units | Description | Note +----------------|--------|-------------------------------------|------ +`pmech` | [p.u.] | Mechanical-power output | $P_m$ +`pelec_meas` | [p.u.] | Measured electrical power | State 1 +`xd` | [p.u.] | Governor differential-control state | State 2 +`xi` | [p.u.] | Governor integral-control state | State 3 +`valve` | [p.u.] | Turbine actuator or valve stroke | State 4 +`turbine_ll` | [p.u.] | Turbine lead-lag state | State 5 +`load_limiter` | [p.u.] | Turbine load-limiter state | State 6 +`load_int` | [p.u.] | Turbine load integral-control state | State 7 +`mw_control` | [p.u.] | Supervisory load-control state | State 8 +`accel_control` | [p.u.] | Acceleration-control state | State 9 +`temp_ll` | [p.u.] | Temperature-detection lead-lag state | State 10 +`fsrn` | [p.u.] | Normal governor request | Low-value select input +`fsra` | [p.u.] | Acceleration-control request | Low-value select input +`fsrt` | [p.u.] | Temperature/load request | Low-value select input +`fsr` | [p.u.] | Selected governor request | Low-value select output diff --git a/GridKit/Model/PhasorDynamics/Governor/README.md b/GridKit/Model/PhasorDynamics/Governor/README.md index 8e6305aa8..b53a8df24 100644 --- a/GridKit/Model/PhasorDynamics/Governor/README.md +++ b/GridKit/Model/PhasorDynamics/Governor/README.md @@ -9,3 +9,4 @@ A governor models the control system that regulates the output power of a machin There are a few standard Governor models - Turbine Governor (See [TGOV1](Tgov1/README.md)) +- General Governor (See [GGOV1](GGOV1/README.md)) diff --git a/docs/Figures/PhasorDynamics/GGOV1_diagram.png b/docs/Figures/PhasorDynamics/GGOV1_diagram.png new file mode 100644 index 000000000..cd3911649 Binary files /dev/null and b/docs/Figures/PhasorDynamics/GGOV1_diagram.png differ