# Exciter Model: REEC_C

Following checks and corrections are applied during Validation and AutoCorrection.

- If 0.0 < Tv < 0.5*Mult*TimeStep then Tv = 0, ElseIf 0.5*Mult*TimeStep < Tv < Mult*TimeStep then Tv = Mult*TimeStep
- If 0.0 < Tp < 0.5*Mult*TimeStep then Tp = 0, ElseIf 0.5*Mult*TimeStep < Tp < Mult*TimeStep then Tp = Mult*TimeStep
- If 0.0 < Tiq < 0.5*Mult*TimeStep then Tiq = 0, ElseIf 0.5*Mult*TimeStep < Tiq < Mult*TimeStep then Tiq = Mult*TimeStep
- If 0.0 < Tpord < 0.5*Mult*TimeStep then Tpord = 0, ElseIf 0.5*Mult*TimeStep < Tpord < Mult*TimeStep then Tpord = Mult*TimeStep
- If 0 < T < Mult*TimeStep then T = Mult*TimeStep
- Kpp and Kip can't be both zero. Must be corrected by user.
- If Vmax < Vmin then swap the values
- If Qmax < Qmin then swap the values
- If Pmax < Pmin then swap the values
- If RPmax < RPmin then swap the values
- If Iqh < Iql then swap the values

Mult represents the user-specified value **Minimum time constant size as multiple of time step** option on the Validation page of the Transient Stability Dialog

TimeStep represents the integration time step being used as described on TimeStep

Following treatment is handled during the transient numerical simulation

- If Q limits > Qmax, then Qmax = Q limits or if Q limits < Qmin, then Qmin = Q limits
- If PIq limits > Vmax, then Vmax = PIq limits or if PIq limits < Vmin, then Vmin = PIq limits
- If Pord > Pmax, then Pmax = Pord or if Pord < Pmin, then Pmin = Pord

Model Equations and/or Block Diagrams

**Parameters:**

PfFlag | Power factor flag (1 – power factor control, 0 – Q control, which can be commanded by an external signal) |

VFlag | Voltage control flag (1 – Q control, 0 – voltage control) |

QFlag | Reactive power control flag ( 1 – voltage/Q control, 0 – constant pf or Q control) |

Pqflag | P/Q priority selection on current limit flag. 0 = Q priority; 1 = P priority |

Vdip | The voltage below which the reactive current injection (Iqinj) logic is activated (i.e. voltage_dip = 1) |

Vup | The voltage above which the reactive current injection (Iqinj) logic is activated (i.e. voltage_dip = 1) |

Trv | Filter time constant for voltage measurement |

dbd1 | Deadband in voltage error when voltage dip logic is activated (for overvoltage – thus overvoltage response can be disabled by setting this to a large number e.g. 999) |

dbd2 | Deadband in voltage error when voltage dip logic is activated (for undervoltage) |

kqv | Gain for reactive current injection during voltage dip (and overvoltage) conditions |

Iqh1 | Maximum limit of reactive current injection (Iqinj) |

Iql1 | Minimum limit of reactive current injection (Iqinj) |

Vref0 | The reference voltage from which the voltage error is calculated. This is set by the user. If the user does not specify a value it is initialized by the model to equal to the initial terminal voltage. |

Tp | Filter time constant for electrical power measurement |

Qmax | Reactive power limit maximum |

Qmin | Reactive power limit minimum |

Vmax | Voltage control maximum |

Vmin | Voltage control minimum |

Kqp | Proportional gain on Q control |

Kqi | Integral gain on Q control |

Kvp | Proportional gain on V control |

Kvi | Integral gain on V control |

Tiq | Time constant on lag delay |

dPmax | Positive Ramp rate on power reference |

dPmin | Negative Ramp rate on power reference |

Pmax | Maximum power reference |

Pmin | Minimum power reference |

Tpord | Filter time constant on Pord |

Imax | Maximum allowable total converter current limit |

T | The discharge time in units of seconds. That is, the time (in seconds) that it takes for the unit to go from 0% state of charge to 100% state of charge. |

SOCini | The initial state of charge on the battery and is a user entered value. It should be in per unit; 1.0 per unit means fully charged and 0.0 per unit means fully discharged. |

SOCmax | The maximum allowable state of charge. By definition the maximum value would be 1.0, however, it may be set to smaller values (e.g. 0.8) to represent manufacturer requirements that the BESS always remain at or below a certain charging level (e.g. 80%). |

SOCmin | The minimum allowable state of charge. By definition the minimum value would be 0.0, however, it may be set to larger values (e.g. 0.2) to represent manufacturer requirements that the BESS always remain at or above a certain charging level (e.g. 20%). |

vq1 | VDL1: Voltage Point1 |

lq1 | VDL1: Iqmax Point1 |

vq2 | VDL1: Voltage Point2 |

lq2 | VDL1: Iqmax Point2 |

vq3 | VDL1: Voltage Point3 |

lq3 | VDL1: Iqmax Point3 |

vq4 | VDL1: Voltage Point4 |

lq4 | VDL1: Iqmax Point4 |

vp1 | VDL2: Voltage Point1 |

lp1 | VDL2: Ipmax Point1 |

vp2 | VDL2: Voltage Point2 |

lp2 | VDL2: Ipmax Point2 |

vp3 | VDL2: Voltage Point3 |

lp3 | VDL2: Ipmax Point3 |

vp4 | VDL2: Voltage Point4 |

lp4 | VDL2: Ipmax Point4 |

MVABase | MVABase |

**Current Limit Logic Psuedo Code**

The following pseudo-code describes how the values for Ipmax, Ipmin, Iqmax, and Iqmin are updated.

Voltage_Thld2TimerActive = special boolean related to timer

local_V = StateVtfilter // Vt State 1

**if** VDL1 table is empty **then** Iqmax = 1E10

**else **Iqmax = lookup from VL1 table using local_V

**if** not Voltage_Thld2TimerActive **then begin**

**if** VDL2 table is empty **then **Ipmax = 1E10

**else** Ipmax = lookup from VDL2 table using local_V

**end**

**if** PQFlag = 0 **then begin** // Q priority [default]

**If** Imax < Iqmax **Then **Iqmax = IMax

Iqmin = -Iqmax

**if** not Voltage_Thld2TimerActive **then begin**

local_I = Sqr(Imax) - Sqr(Iqcmd)

**if** local_I < **0** **then** local_I = **0**

**else** local_I = sqrt( local_I )

**if** local_I < Ipmax **Then **Ipmax = local_I

**end**

Ipmin = -Ipmax

**end**

**else Begin** // P priority

**if** not Voltage_Thld2TimerActive **then begin**

**if** IMax < Ipmax **Then **Ipmax = Imax

**end**

Ipmin = -Ipmax

local_I = Sqr(Imax) - Sqr(Ipcmd)

**if** local_I < **0** **then** local_I = **0**

**else** local_I = sqrt( local_I )

**if** local_I < Iqmax **Then **Iqmax = local_I

Iqmin = -Iqmax// LOCAL_UpdateIqmin

**end**